diff --git a/1.png b/1.png new file mode 100644 index 0000000..f2b9101 Binary files /dev/null and b/1.png differ diff --git a/2.png b/2.png new file mode 100644 index 0000000..366f471 Binary files /dev/null and b/2.png differ diff --git a/3.png b/3.png new file mode 100644 index 0000000..a8b5e9c Binary files /dev/null and b/3.png differ diff --git a/README.md b/README.md index 5ca56be..10a78a4 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,17 @@ -The objective of this assignment is to create an L System parser and generate interesting looking plants. Start by forking and then cloning this repository: [https://github.com/CIS700-Procedural-Graphics/Project3-LSystems](https://github.com/CIS700-Procedural-Graphics/Project3-LSystems) -# L-System Parser +# L-System Parser and Turtle Renderer +This is an implementation of an L-System parser and a turtle renderer that allows the user to create different variations of a blue flowered tree. -lsystem.js contains classes for L-system, Rule, and LinkedList. Here’s our suggested structure: +The L-System is represented by a linked list which allows the system to replace characters in the system in constant time. The turtle renderer calls several different functions to visually represent the final grammar after a few iterations. -**The Symbol Nodes/Linked List:** +I created new rules in my turtle renderer that allowed turns in the xyz dimension. I stored the number of iterations as a property of the nodes of the linked list so that I can see where to render the flowers (I did them with a certain probability as well as ensuring the flowers only rendered after the 1st iteration so the tree looks more natural). I also used the number of iterations to vary the width of the tree along the height. The further up the branches get, the thinner the branches get. -Rather than representing our symbols as a string like in many L-system implementations, we prefer to use a linked list. This allows us to store additional information about each symbol at time of parsing (e.g. what iteration was this symbol added in?) Since we’re adding and replacing symbols at each iteration, we also save on the overhead of creating and destroying strings, since linked lists of course make it easy to add and remove nodes. You should write a Linked List class with Nodes that contain at least the following information: +The flower is an Lotus obj that was downloaded from TurboSquid. -- The next node in the linked list -- The previous node in the linked list -- The grammar symbol at theis point in the overal string +The grammar rules have a certain probability associated with turns in each dimension. This creates variation between different instances of the same tree with the same number of iterations. You can check my implementation for the certain grammar I used. -We also recommend that you write the following functions to interact with your linked list: - -- A function to symmetrically link two nodes together (e.g. Node A’s next is Node B, and Node B’s prev is Node A) -- A function to expand one of the symbol nodes of the linked list by replacing it with several new nodes. This function should look at the list of rules associated with the symbol in the linked list’s grammar dictionary, then generate a uniform random number between 0 and 1 in order to determine which of the Rules should be used to expand the symbol node. You will refer to a Rule’s probability and compare it to your random number in order to determine which Rule should be chosen. - -**Rules:** - -These are containers for the preconditions, postconditions and probability of a single replacement operation. They should operate on a symbol node in your linked list. - -**L-system:** - -This is the parser, which will loop through your linked list of symbol nodes and apply rules at each iteration. - -Implement the following functions in L-System so that you can apply grammar rules to your axiom given some number of iterations. More details and implementation suggestions about functions can be found in the TODO comments - -- `stringToLinkedList(input_string)` -- `linkedListToString(linkedList)` -- `replaceNode(linkedList, node, replacementString)` -- `doIterations(num)` - -## Turtle - -`turtle.js` has a function called renderSymbol that takes in a single node of a linked list and performs an operation to change the turtle’s state based on the symbol contained in the node. Usually, the turtle’s change in state will result in some sort of rendering output, such as drawing a cylinder when the turtle moves forward. We have provided you with a few example functions to illustrate how to write your own functions to be called by renderSymbol; these functions are rotateTurtle, moveTurtle, moveForward, and makeCylinder. If you inspect the constructor of the Turtle class, you can see how to associate an operation with a grammar symbol. - -- Modify turtle.js to support operations associated with the symbols `[` and `]` - - When you parse `[` you need to store the current turtle state somewhere - - When you parse `]` you need to set your turtle’s state to the most recently stored state. Think of this a pushing and popping turtle states on and off a stack. For example, given `F[+F][-F]`, the turtle should draw a Y shape. Note that your program must be capable of storing many turtle states at once in a stack. - -- In addition to operations for `[` and `]`, you must invent operations for any three symbols of your choosing. - - -## Interactivity - -Using dat.GUI and the examples provided in the reference code, make some aspect of your demo an interactive variable. For example, you could modify: - -1. the axiom -2. Your input grammer rules and their probability -3. the angle of rotation of the turtle -4. the size or color or material of the cylinder the turtle draws, etc! - -## L-System Plants - -Design a grammar for a new procedural plant! As the preceding parts of this assignment are basic computer science tasks, this is where you should spend the bulk of your time on this assignment. Come up with new grammar rules and include screenshots of your plants in your README. For inspiration, take a look at Example 7: Fractal Plant in Wikipedia: https://en.wikipedia.org/wiki/L-system Your procedural plant must have the following features - -1. Grow in 3D. Take advantage of three.js! -2. Have flowers or leaves that are added as a part of the grammar -3. Variation. Different instances of your plant should look distinctly different! -4. A twist. Broccoli trees are cool and all, but we hope to see sometime a little more surprising in your grammars - -# Publishing Your code - -Running `npm run deploy` will automatically build your project and push it to gh-pages where it will be visible at `username.github.io/repo-name`. NOTE: You MUST commit AND push all changes to your MASTER branch before doing this or you may lose your work. The `git` command must also be available in your terminal or command prompt. If you're using Windows, it's a good idea to use Git Bash. \ No newline at end of file +The user can also change the angle of the turns from branch to branch. +![](https://raw.githubusercontent.com/emily-vo/Project3-LSystems/master/1.png) +![](https://raw.githubusercontent.com/emily-vo/Project3-LSystems/master/2.png) +![](https://raw.githubusercontent.com/emily-vo/Project3-LSystems/master/3.png) \ No newline at end of file diff --git a/bundle.js b/bundle.js new file mode 100644 index 0000000..96439b5 --- /dev/null +++ b/bundle.js @@ -0,0 +1,48717 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _framework = __webpack_require__(1); + + var _framework2 = _interopRequireDefault(_framework); + + var _lsystem = __webpack_require__(9); + + var _lsystem2 = _interopRequireDefault(_lsystem); + + var _turtle = __webpack_require__(10); + + var _turtle2 = _interopRequireDefault(_turtle); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var THREE = __webpack_require__(6); // older modules are imported like this. You shouldn't have to worry about this much + + + var turtle; + + // called after the scene loads + function onLoad(framework) { + + var scene = framework.scene; + var camera = framework.camera; + var renderer = framework.renderer; + var gui = framework.gui; + var stats = framework.stats; + + // initialize a simple box and material + var directionalLight = new THREE.DirectionalLight(0xffffff, 1); + directionalLight.color.setHSL(0.1, 1, 0.95); + directionalLight.position.set(1, 3, 2); + directionalLight.position.multiplyScalar(10); + + scene.add(directionalLight); + + //var loader = new THREE.CubeTextureLoader(); + //var urlPrefix = ''; + // + //var skymap = new THREE.CubeTextureLoader().load([ + // urlPrefix + 'px.jpg', urlPrefix + 'nx.jpg', + // urlPrefix + 'py.jpg', urlPrefix + 'ny.jpg', + // urlPrefix + 'pz.jpg', urlPrefix + 'nz.jpg' + //] ); + // + //scene.background = skymap; + + // set camera position + camera.position.set(1, 1, 20); + camera.lookAt(new THREE.Vector3(0, 0, 0)); + camera.updateProjectionMatrix(); + + // initialize LSystem and a Turtle to draw + var lsystem = new _lsystem2.default.Lsystem(); + turtle = new _turtle2.default(scene); + + gui.add(camera, 'fov', 0, 180).onChange(function (newVal) { + camera.updateProjectionMatrix(); + }); + + gui.add(lsystem, 'axiom').onChange(function (newVal) { + lsystem.updateAxiom(newVal); + doLsystem(lsystem, lsystem.iterations, turtle); + }); + + gui.add(lsystem, 'iterations', 0, 12).step(1).onChange(function (newVal) { + clearScene(turtle); + doLsystem(lsystem, newVal, turtle); + }); + + gui.add(turtle, 'angle', 15, 120).step(1).onChange(function (newVal) { + clearScene(turtle); + doLsystem(lsystem, lsystem.iterations, turtle); + }); + } + + // clears the scene by removing all geometries added by turtle.js + function clearScene(turtle) { + var obj; + for (var i = turtle.scene.children.length - 1; i > 3; i--) { + obj = turtle.scene.children[i]; + turtle.scene.remove(obj); + } + } + + function doLsystem(lsystem, iterations, turtle) { + var result = lsystem.doIterations(iterations); + turtle.clear(); + var angle = turtle.angle; + turtle = new _turtle2.default(turtle.scene); + console.log(turtle); + turtle.angle = angle; + turtle.renderSymbols(result); + } + + // called on frame updates + function onUpdate(framework) {} + + // when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate + _framework2.default.init(onLoad, onUpdate); + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _statsJs = __webpack_require__(2); + + var _statsJs2 = _interopRequireDefault(_statsJs); + + var _datGui = __webpack_require__(3); + + var _datGui2 = _interopRequireDefault(_datGui); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var THREE = __webpack_require__(6); + var OrbitControls = __webpack_require__(7)(THREE); + var OBJLoader = __webpack_require__(8)(THREE); + + + // when the scene is done initializing, the function passed as `callback` will be executed + // then, every frame, the function passed as `update` will be executed + function init(callback, update) { + var stats = new _statsJs2.default(); + stats.setMode(1); + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.top = '0px'; + document.body.appendChild(stats.domElement); + + var gui = new _datGui2.default.GUI(); + + var framework = { + gui: gui, + stats: stats + }; + + // run this function after the window loads + window.addEventListener('load', function () { + + var scene = new THREE.Scene(); + var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); + var renderer = new THREE.WebGLRenderer({ antialias: true }); + renderer.setPixelRatio(window.devicePixelRatio); + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.setClearColor(0xfcd1fa, 1); + + var controls = new OrbitControls(camera, renderer.domElement); + controls.enableDamping = true; + controls.enableZoom = true; + controls.target.set(0, 0, 0); + controls.rotateSpeed = 0.3; + controls.zoomSpeed = 1.0; + controls.panSpeed = 2.0; + + document.body.appendChild(renderer.domElement); + + // resize the canvas when the window changes + window.addEventListener('resize', function () { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize(window.innerWidth, window.innerHeight); + }, false); + + // assign THREE.js objects to the object we will return + framework.scene = scene; + framework.camera = camera; + framework.renderer = renderer; + + // begin the animation loop + (function tick() { + stats.begin(); + update(framework); // perform any requested updates + renderer.render(scene, camera); // render the scene + stats.end(); + requestAnimationFrame(tick); // register to call this again when the browser renders a new frame + })(); + + // we will pass the scene, gui, renderer, camera, etc... to the callback function + return callback(framework); + }); + } + + exports.default = { + init: init + }; + +/***/ }, +/* 2 */ +/***/ function(module, exports) { + + // stats.js - http://github.com/mrdoob/stats.js + var Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement("div");f.id="stats";f.addEventListener("mousedown",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps";a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";f.appendChild(a);var i=document.createElement("div");i.id="fpsText";i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px"; + i.innerHTML="FPS";a.appendChild(i);var c=document.createElement("div");c.id="fpsGraph";c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";for(a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113";c.appendChild(j)}var d=document.createElement("div");d.id="ms";d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";f.appendChild(d);var k=document.createElement("div"); + k.id="msText";k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";k.innerHTML="MS";d.appendChild(k);var e=document.createElement("div");e.id="msGraph";e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";for(d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display= + "block";d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+"px";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height= + a+"px",m=b,r=0);return b},update:function(){l=this.end()}}};"object"===typeof module&&(module.exports=Stats); + + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__(4) + module.exports.color = __webpack_require__(5) + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + /** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + /** @namespace */ + var dat = module.exports = dat || {}; + + /** @namespace */ + dat.gui = dat.gui || {}; + + /** @namespace */ + dat.utils = dat.utils || {}; + + /** @namespace */ + dat.controllers = dat.controllers || {}; + + /** @namespace */ + dat.dom = dat.dom || {}; + + /** @namespace */ + dat.color = dat.color || {}; + + dat.utils.css = (function () { + return { + load: function (url, doc) { + doc = doc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function(css, doc) { + doc = doc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = css; + doc.getElementsByTagName('head')[0].appendChild(injected); + } + } + })(); + + + dat.utils.common = (function () { + + var ARR_EACH = Array.prototype.forEach; + var ARR_SLICE = Array.prototype.slice; + + /** + * Band-aid methods for things that should be a lot easier in JavaScript. + * Implementation and structure inspired by underscore.js + * http://documentcloud.github.com/underscore/ + */ + + return { + + BREAK: {}, + + extend: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (!this.isUndefined(obj[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + defaults: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (this.isUndefined(target[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + compose: function() { + var toCall = ARR_SLICE.call(arguments); + return function() { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length -1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + } + }, + + each: function(obj, itr, scope) { + + + if (ARR_EACH && obj.forEach === ARR_EACH) { + + obj.forEach(itr, scope); + + } else if (obj.length === obj.length + 0) { // Is number but not NaN + + for (var key = 0, l = obj.length; key < l; key++) + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) + return; + + } else { + + for (var key in obj) + if (itr.call(scope, obj[key], key) === this.BREAK) + return; + + } + + }, + + defer: function(fnc) { + setTimeout(fnc, 0); + }, + + toArray: function(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + + isUndefined: function(obj) { + return obj === undefined; + }, + + isNull: function(obj) { + return obj === null; + }, + + isNaN: function(obj) { + return obj !== obj; + }, + + isArray: Array.isArray || function(obj) { + return obj.constructor === Array; + }, + + isObject: function(obj) { + return obj === Object(obj); + }, + + isNumber: function(obj) { + return obj === obj+0; + }, + + isString: function(obj) { + return obj === obj+''; + }, + + isBoolean: function(obj) { + return obj === false || obj === true; + }, + + isFunction: function(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } + + }; + + })(); + + + dat.controllers.Controller = (function (common) { + + /** + * @class An "abstract" class that represents a given property of an object. + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var Controller = function(object, property) { + + this.initialValue = object[property]; + + /** + * Those who extend this class will put their DOM elements in here. + * @type {DOMElement} + */ + this.domElement = document.createElement('div'); + + /** + * The object to manipulate + * @type {Object} + */ + this.object = object; + + /** + * The name of the property to manipulate + * @type {String} + */ + this.property = property; + + /** + * The function to be called on change. + * @type {Function} + * @ignore + */ + this.__onChange = undefined; + + /** + * The function to be called on finishing change. + * @type {Function} + * @ignore + */ + this.__onFinishChange = undefined; + + }; + + common.extend( + + Controller.prototype, + + /** @lends dat.controllers.Controller.prototype */ + { + + /** + * Specify that a function fire every time someone changes the value with + * this Controller. + * + * @param {Function} fnc This function will be called whenever the value + * is modified via this Controller. + * @returns {dat.controllers.Controller} this + */ + onChange: function(fnc) { + this.__onChange = fnc; + return this; + }, + + /** + * Specify that a function fire every time someone "finishes" changing + * the value wih this Controller. Useful for values that change + * incrementally like numbers or strings. + * + * @param {Function} fnc This function will be called whenever + * someone "finishes" changing the value via this Controller. + * @returns {dat.controllers.Controller} this + */ + onFinishChange: function(fnc) { + this.__onFinishChange = fnc; + return this; + }, + + /** + * Change the value of object[property] + * + * @param {Object} newValue The new value of object[property] + */ + setValue: function(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + }, + + /** + * Gets the value of object[property] + * + * @returns {Object} The current value of object[property] + */ + getValue: function() { + return this.object[this.property]; + }, + + /** + * Refreshes the visual display of a Controller in order to keep sync + * with the object's current value. + * @returns {dat.controllers.Controller} this + */ + updateDisplay: function() { + return this; + }, + + /** + * @returns {Boolean} true if the value has deviated from initialValue + */ + isModified: function() { + return this.initialValue !== this.getValue() + } + + } + + ); + + return Controller; + + + })(dat.utils.common); + + + dat.dom.dom = (function (common) { + + var EVENT_MAP = { + 'HTMLEvents': ['change'], + 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'], + 'KeyboardEvents': ['keydown'] + }; + + var EVENT_MAP_INV = {}; + common.each(EVENT_MAP, function(v, k) { + common.each(v, function(e) { + EVENT_MAP_INV[e] = k; + }); + }); + + var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; + + function cssValueToPixels(val) { + + if (val === '0' || common.isUndefined(val)) return 0; + + var match = val.match(CSS_VALUE_PIXELS); + + if (!common.isNull(match)) { + return parseFloat(match[1]); + } + + // TODO ...ems? %? + + return 0; + + } + + /** + * @namespace + * @member dat.dom + */ + var dom = { + + /** + * + * @param elem + * @param selectable + */ + makeSelectable: function(elem, selectable) { + + if (elem === undefined || elem.style === undefined) return; + + elem.onselectstart = selectable ? function() { + return false; + } : function() { + }; + + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + + }, + + /** + * + * @param elem + * @param horizontal + * @param vertical + */ + makeFullscreen: function(elem, horizontal, vertical) { + + if (common.isUndefined(horizontal)) horizontal = true; + if (common.isUndefined(vertical)) vertical = true; + + elem.style.position = 'absolute'; + + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + + }, + + /** + * + * @param elem + * @param eventType + * @param params + */ + fakeEvent: function(elem, eventType, params, aux) { + params = params || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, + params.cancelable || true, window, params.clickCount || 1, + 0, //screen X + 0, //screen Y + clientX, //client X + clientY, //client Y + false, false, false, false, 0, null); + break; + case 'KeyboardEvents': + var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz + common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, + params.cancelable, window, + params.ctrlKey, params.altKey, + params.shiftKey, params.metaKey, + params.keyCode, params.charCode); + break; + default: + evt.initEvent(eventType, params.bubbles || false, + params.cancelable || true); + break; + } + common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + + /** + * + * @param elem + * @param event + * @param func + * @param bool + */ + bind: function(elem, event, func, bool) { + bool = bool || false; + if (elem.addEventListener) + elem.addEventListener(event, func, bool); + else if (elem.attachEvent) + elem.attachEvent('on' + event, func); + return dom; + }, + + /** + * + * @param elem + * @param event + * @param func + * @param bool + */ + unbind: function(elem, event, func, bool) { + bool = bool || false; + if (elem.removeEventListener) + elem.removeEventListener(event, func, bool); + else if (elem.detachEvent) + elem.detachEvent('on' + event, func); + return dom; + }, + + /** + * + * @param elem + * @param className + */ + addClass: function(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) == -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + + /** + * + * @param elem + * @param className + */ + removeClass: function(elem, className) { + if (className) { + if (elem.className === undefined) { + // elem.className = className; + } else if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index != -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + + hasClass: function(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + + /** + * + * @param elem + */ + getWidth: function(elem) { + + var style = getComputedStyle(elem); + + return cssValueToPixels(style['border-left-width']) + + cssValueToPixels(style['border-right-width']) + + cssValueToPixels(style['padding-left']) + + cssValueToPixels(style['padding-right']) + + cssValueToPixels(style['width']); + }, + + /** + * + * @param elem + */ + getHeight: function(elem) { + + var style = getComputedStyle(elem); + + return cssValueToPixels(style['border-top-width']) + + cssValueToPixels(style['border-bottom-width']) + + cssValueToPixels(style['padding-top']) + + cssValueToPixels(style['padding-bottom']) + + cssValueToPixels(style['height']); + }, + + /** + * + * @param elem + */ + getOffset: function(elem) { + var offset = {left: 0, top:0}; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + } while (elem = elem.offsetParent); + } + return offset; + }, + + // http://stackoverflow.com/posts/2684561/revisions + /** + * + * @param elem + */ + isActive: function(elem) { + return elem === document.activeElement && ( elem.type || elem.href ); + } + + }; + + return dom; + + })(dat.utils.common); + + + dat.controllers.OptionController = (function (Controller, dom, common) { + + /** + * @class Provides a select input to alter the property of an object, using a + * list of accepted values. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object|string[]} options A map of labels to acceptable values, or + * a list of acceptable string values. + * + * @member dat.controllers + */ + var OptionController = function(object, property, options) { + + OptionController.superclass.call(this, object, property); + + var _this = this; + + /** + * The drop down menu + * @ignore + */ + this.__select = document.createElement('select'); + + if (common.isArray(options)) { + var map = {}; + common.each(options, function(element) { + map[element] = element; + }); + options = map; + } + + common.each(options, function(value, key) { + + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + + }); + + // Acknowledge original value + this.updateDisplay(); + + dom.bind(this.__select, 'change', function() { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + + this.domElement.appendChild(this.__select); + + }; + + OptionController.superclass = Controller; + + common.extend( + + OptionController.prototype, + Controller.prototype, + + { + + setValue: function(v) { + var toReturn = OptionController.superclass.prototype.setValue.call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + }, + + updateDisplay: function() { + this.__select.value = this.getValue(); + return OptionController.superclass.prototype.updateDisplay.call(this); + } + + } + + ); + + return OptionController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common); + + + dat.controllers.NumberController = (function (Controller, common) { + + /** + * @class Represents a given property of an object that is a number. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object} [params] Optional parameters + * @param {Number} [params.min] Minimum allowed value + * @param {Number} [params.max] Maximum allowed value + * @param {Number} [params.step] Increment by which to change value + * + * @member dat.controllers + */ + var NumberController = function(object, property, params) { + + NumberController.superclass.call(this, object, property); + + params = params || {}; + + this.__min = params.min; + this.__max = params.max; + this.__step = params.step; + + if (common.isUndefined(this.__step)) { + + if (this.initialValue == 0) { + this.__impliedStep = 1; // What are we, psychics? + } else { + // Hey Doug, check this out. + this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10; + } + + } else { + + this.__impliedStep = this.__step; + + } + + this.__precision = numDecimals(this.__impliedStep); + + + }; + + NumberController.superclass = Controller; + + common.extend( + + NumberController.prototype, + Controller.prototype, + + /** @lends dat.controllers.NumberController.prototype */ + { + + setValue: function(v) { + + if (this.__min !== undefined && v < this.__min) { + v = this.__min; + } else if (this.__max !== undefined && v > this.__max) { + v = this.__max; + } + + if (this.__step !== undefined && v % this.__step != 0) { + v = Math.round(v / this.__step) * this.__step; + } + + return NumberController.superclass.prototype.setValue.call(this, v); + + }, + + /** + * Specify a minimum value for object[property]. + * + * @param {Number} minValue The minimum value for + * object[property] + * @returns {dat.controllers.NumberController} this + */ + min: function(v) { + this.__min = v; + return this; + }, + + /** + * Specify a maximum value for object[property]. + * + * @param {Number} maxValue The maximum value for + * object[property] + * @returns {dat.controllers.NumberController} this + */ + max: function(v) { + this.__max = v; + return this; + }, + + /** + * Specify a step value that dat.controllers.NumberController + * increments by. + * + * @param {Number} stepValue The step value for + * dat.controllers.NumberController + * @default if minimum and maximum specified increment is 1% of the + * difference otherwise stepValue is 1 + * @returns {dat.controllers.NumberController} this + */ + step: function(v) { + this.__step = v; + return this; + } + + } + + ); + + function numDecimals(x) { + x = x.toString(); + if (x.indexOf('.') > -1) { + return x.length - x.indexOf('.') - 1; + } else { + return 0; + } + } + + return NumberController; + + })(dat.controllers.Controller, + dat.utils.common); + + + dat.controllers.NumberControllerBox = (function (NumberController, dom, common) { + + /** + * @class Represents a given property of an object that is a number and + * provides an input element with which to manipulate it. + * + * @extends dat.controllers.Controller + * @extends dat.controllers.NumberController + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object} [params] Optional parameters + * @param {Number} [params.min] Minimum allowed value + * @param {Number} [params.max] Maximum allowed value + * @param {Number} [params.step] Increment by which to change value + * + * @member dat.controllers + */ + var NumberControllerBox = function(object, property, params) { + + this.__truncationSuspended = false; + + NumberControllerBox.superclass.call(this, object, property, params); + + var _this = this; + + /** + * {Number} Previous mouse y position + * @ignore + */ + var prev_y; + + this.__input = document.createElement('input'); + this.__input.setAttribute('type', 'text'); + + // Makes it so manually specified values are not truncated. + + dom.bind(this.__input, 'change', onChange); + dom.bind(this.__input, 'blur', onBlur); + dom.bind(this.__input, 'mousedown', onMouseDown); + dom.bind(this.__input, 'keydown', function(e) { + + // When pressing entire, you can be as precise as you want. + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + } + + }); + + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!common.isNaN(attempted)) _this.setValue(attempted); + } + + function onBlur() { + onChange(); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prev_y = e.clientY; + } + + function onMouseDrag(e) { + + var diff = prev_y - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + + prev_y = e.clientY; + + } + + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + } + + this.updateDisplay(); + + this.domElement.appendChild(this.__input); + + }; + + NumberControllerBox.superclass = NumberController; + + common.extend( + + NumberControllerBox.prototype, + NumberController.prototype, + + { + + updateDisplay: function() { + + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return NumberControllerBox.superclass.prototype.updateDisplay.call(this); + } + + } + + ); + + function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; + } + + return NumberControllerBox; + + })(dat.controllers.NumberController, + dat.dom.dom, + dat.utils.common); + + + dat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) { + + /** + * @class Represents a given property of an object that is a number, contains + * a minimum and maximum, and provides a slider element with which to + * manipulate it. It should be noted that the slider element is made up of + * <div> tags, not the html5 + * <slider> element. + * + * @extends dat.controllers.Controller + * @extends dat.controllers.NumberController + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Number} minValue Minimum allowed value + * @param {Number} maxValue Maximum allowed value + * @param {Number} stepValue Increment by which to change value + * + * @member dat.controllers + */ + var NumberControllerSlider = function(object, property, min, max, step) { + + NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step }); + + var _this = this; + + this.__background = document.createElement('div'); + this.__foreground = document.createElement('div'); + + + + dom.bind(this.__background, 'mousedown', onMouseDown); + + dom.addClass(this.__background, 'slider'); + dom.addClass(this.__foreground, 'slider-fg'); + + function onMouseDown(e) { + + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + + onMouseDrag(e); + } + + function onMouseDrag(e) { + + e.preventDefault(); + + var offset = dom.getOffset(_this.__background); + var width = dom.getWidth(_this.__background); + + _this.setValue( + map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max) + ); + + return false; + + } + + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + this.updateDisplay(); + + this.__background.appendChild(this.__foreground); + this.domElement.appendChild(this.__background); + + }; + + NumberControllerSlider.superclass = NumberController; + + /** + * Injects default stylesheet for slider elements. + */ + NumberControllerSlider.useDefaultStyles = function() { + css.inject(styleSheet); + }; + + common.extend( + + NumberControllerSlider.prototype, + NumberController.prototype, + + { + + updateDisplay: function() { + var pct = (this.getValue() - this.__min)/(this.__max - this.__min); + this.__foreground.style.width = pct*100+'%'; + return NumberControllerSlider.superclass.prototype.updateDisplay.call(this); + } + + } + + + + ); + + function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); + } + + return NumberControllerSlider; + + })(dat.controllers.NumberController, + dat.dom.dom, + dat.utils.css, + dat.utils.common, + ".slider {\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\n height: 1em;\n border-radius: 1em;\n background-color: #eee;\n padding: 0 0.5em;\n overflow: hidden;\n}\n\n.slider-fg {\n padding: 1px 0 2px 0;\n background-color: #aaa;\n height: 1em;\n margin-left: -0.5em;\n padding-right: 0.5em;\n border-radius: 1em 0 0 1em;\n}\n\n.slider-fg:after {\n display: inline-block;\n border-radius: 1em;\n background-color: #fff;\n border: 1px solid #aaa;\n content: '';\n float: right;\n margin-right: -1em;\n margin-top: -1px;\n height: 0.9em;\n width: 0.9em;\n}"); + + + dat.controllers.FunctionController = (function (Controller, dom, common) { + + /** + * @class Provides a GUI interface to fire a specified method, a property of an object. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var FunctionController = function(object, property, text) { + + FunctionController.superclass.call(this, object, property); + + var _this = this; + + this.__button = document.createElement('div'); + this.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(this.__button, 'click', function(e) { + e.preventDefault(); + _this.fire(); + return false; + }); + + dom.addClass(this.__button, 'button'); + + this.domElement.appendChild(this.__button); + + + }; + + FunctionController.superclass = Controller; + + common.extend( + + FunctionController.prototype, + Controller.prototype, + { + + fire: function() { + if (this.__onChange) { + this.__onChange.call(this); + } + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.getValue().call(this.object); + } + } + + ); + + return FunctionController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common); + + + dat.controllers.BooleanController = (function (Controller, dom, common) { + + /** + * @class Provides a checkbox input to alter the boolean property of an object. + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var BooleanController = function(object, property) { + + BooleanController.superclass.call(this, object, property); + + var _this = this; + this.__prev = this.getValue(); + + this.__checkbox = document.createElement('input'); + this.__checkbox.setAttribute('type', 'checkbox'); + + + dom.bind(this.__checkbox, 'change', onChange, false); + + this.domElement.appendChild(this.__checkbox); + + // Match original value + this.updateDisplay(); + + function onChange() { + _this.setValue(!_this.__prev); + } + + }; + + BooleanController.superclass = Controller; + + common.extend( + + BooleanController.prototype, + Controller.prototype, + + { + + setValue: function(v) { + var toReturn = BooleanController.superclass.prototype.setValue.call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + }, + + updateDisplay: function() { + + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + } else { + this.__checkbox.checked = false; + } + + return BooleanController.superclass.prototype.updateDisplay.call(this); + + } + + + } + + ); + + return BooleanController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common); + + + dat.color.toString = (function (common) { + + return function(color) { + + if (color.a == 1 || common.isUndefined(color.a)) { + + var s = color.hex.toString(16); + while (s.length < 6) { + s = '0' + s; + } + + return '#' + s; + + } else { + + return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')'; + + } + + } + + })(dat.utils.common); + + + dat.color.interpret = (function (toString, common) { + + var result, toReturn; + + var interpret = function() { + + toReturn = false; + + var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0]; + + common.each(INTERPRETATIONS, function(family) { + + if (family.litmus(original)) { + + common.each(family.conversions, function(conversion, conversionName) { + + result = conversion.read(original); + + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return common.BREAK; + + } + + }); + + return common.BREAK; + + } + + }); + + return toReturn; + + }; + + var INTERPRETATIONS = [ + + // Strings + { + + litmus: common.isString, + + conversions: { + + THREE_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt( + '0x' + + test[1].toString() + test[1].toString() + + test[2].toString() + test[2].toString() + + test[3].toString() + test[3].toString()) + }; + + }, + + write: toString + + }, + + SIX_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString()) + }; + + }, + + write: toString + + }, + + CSS_RGB: { + + read: function(original) { + + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + + }, + + write: toString + + }, + + CSS_RGBA: { + + read: function(original) { + + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + + }, + + write: toString + + } + + } + + }, + + // Numbers + { + + litmus: common.isNumber, + + conversions: { + + HEX: { + read: function(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + } + }, + + write: function(color) { + return color.hex; + } + } + + } + + }, + + // Arrays + { + + litmus: common.isArray, + + conversions: { + + RGB_ARRAY: { + read: function(original) { + if (original.length != 3) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b]; + } + + }, + + RGBA_ARRAY: { + read: function(original) { + if (original.length != 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b, color.a]; + } + + } + + } + + }, + + // Objects + { + + litmus: common.isObject, + + conversions: { + + RGBA_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b) && + common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + } + } + }, + + RGB_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b + } + } + }, + + HSVA_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v) && + common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + } + } + }, + + HSV_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v + } + } + + } + + } + + } + + + ]; + + return interpret; + + + })(dat.color.toString, + dat.utils.common); + + + dat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) { + + css.inject(styleSheet); + + /** Outer-most className for GUI's */ + var CSS_NAMESPACE = 'dg'; + + var HIDE_KEY_CODE = 72; + + /** The only value shared between the JS and SCSS. Use caution. */ + var CLOSE_BUTTON_HEIGHT = 20; + + var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; + + var SUPPORTS_LOCAL_STORAGE = (function() { + try { + return 'localStorage' in window && window['localStorage'] !== null; + } catch (e) { + return false; + } + })(); + + var SAVE_DIALOGUE; + + /** Have we yet to create an autoPlace GUI? */ + var auto_place_virgin = true; + + /** Fixed position div that auto place GUI's go inside */ + var auto_place_container; + + /** Are we hiding the GUI's ? */ + var hide = false; + + /** GUI's which should be hidden */ + var hideable_guis = []; + + /** + * A lightweight controller library for JavaScript. It allows you to easily + * manipulate variables and fire functions on the fly. + * @class + * + * @member dat.gui + * + * @param {Object} [params] + * @param {String} [params.name] The name of this GUI. + * @param {Object} [params.load] JSON object representing the saved state of + * this GUI. + * @param {Boolean} [params.auto=true] + * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in. + * @param {Boolean} [params.closed] If true, starts closed + */ + var GUI = function(params) { + + var _this = this; + + /** + * Outermost DOM Element + * @type DOMElement + */ + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + + dom.addClass(this.domElement, CSS_NAMESPACE); + + /** + * Nested GUI's by name + * @ignore + */ + this.__folders = {}; + + this.__controllers = []; + + /** + * List of objects I'm remembering for save, only used in top level GUI + * @ignore + */ + this.__rememberedObjects = []; + + /** + * Maps the index of remembered objects to a map of controllers, only used + * in top level GUI. + * + * @private + * @ignore + * + * @example + * [ + * { + * propertyName: Controller, + * anotherPropertyName: Controller + * }, + * { + * propertyName: Controller + * } + * ] + */ + this.__rememberedObjectIndecesToControllers = []; + + this.__listening = []; + + params = params || {}; + + // Default parameters + params = common.defaults(params, { + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + + params = common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + + + if (!common.isUndefined(params.load)) { + + // Explicit preset + if (params.preset) params.load.preset = params.preset; + + } else { + + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + + } + + if (common.isUndefined(params.parent) && params.hideable) { + hideable_guis.push(this); + } + + // Only root level GUI's are resizable. + params.resizable = common.isUndefined(params.parent) && params.resizable; + + + if (params.autoPlace && common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + // params.scrollable = common.isUndefined(params.parent) && params.scrollable === true; + + // Not part of params because I don't want people passing this in via + // constructor. Should be a 'remembered' value. + var use_local_storage = + SUPPORTS_LOCAL_STORAGE && + localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + + Object.defineProperties(this, + + /** @lends dat.gui.GUI.prototype */ + { + + /** + * The parent GUI + * @type dat.gui.GUI + */ + parent: { + get: function() { + return params.parent; + } + }, + + scrollable: { + get: function() { + return params.scrollable; + } + }, + + /** + * Handles GUI's element placement for you + * @type Boolean + */ + autoPlace: { + get: function() { + return params.autoPlace; + } + }, + + /** + * The identifier for a set of saved values + * @type String + */ + preset: { + + get: function() { + if (_this.parent) { + return _this.getRoot().preset; + } else { + return params.load.preset; + } + }, + + set: function(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + + }, + + /** + * The width of GUI element + * @type Number + */ + width: { + get: function() { + return params.width; + }, + set: function(v) { + params.width = v; + setWidth(_this, v); + } + }, + + /** + * The name of GUI. Used for folders. i.e + * a folder's name + * @type String + */ + name: { + get: function() { + return params.name; + }, + set: function(v) { + // TODO Check for collisions among sibling folders + params.name = v; + if (title_row_name) { + title_row_name.innerHTML = params.name; + } + } + }, + + /** + * Whether the GUI is collapsed or not + * @type Boolean + */ + closed: { + get: function() { + return params.closed; + }, + set: function(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + // For browsers that aren't going to respect the CSS transition, + // Lets just check our height against the window height right off + // the bat. + this.onResize(); + + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + + /** + * Contains all presets + * @type Object + */ + load: { + get: function() { + return params.load; + } + }, + + /** + * Determines whether or not to use localStorage as the means for + * remembering + * @type Boolean + */ + useLocalStorage: { + + get: function() { + return use_local_storage; + }, + set: function(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + use_local_storage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + + } + + }); + + // Are we a root level GUI? + if (common.isUndefined(params.parent)) { + + params.closed = false; + + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + + // Are we supposed to be loading locally? + if (SUPPORTS_LOCAL_STORAGE) { + + if (use_local_storage) { + + _this.useLocalStorage = true; + + var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + + if (saved_gui) { + params.load = JSON.parse(saved_gui); + } + + } + + } + + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + this.domElement.appendChild(this.__closeButton); + + dom.bind(this.__closeButton, 'click', function() { + + _this.closed = !_this.closed; + + + }); + + + // Oh, you're a nested GUI! + } else { + + if (params.closed === undefined) { + params.closed = true; + } + + var title_row_name = document.createTextNode(params.name); + dom.addClass(title_row_name, 'controller-name'); + + var title_row = addRow(_this, title_row_name); + + var on_click_title = function(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + + dom.addClass(title_row, 'title'); + dom.bind(title_row, 'click', on_click_title); + + if (!params.closed) { + this.closed = false; + } + + } + + if (params.autoPlace) { + + if (common.isUndefined(params.parent)) { + + if (auto_place_virgin) { + auto_place_container = document.createElement('div'); + dom.addClass(auto_place_container, CSS_NAMESPACE); + dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(auto_place_container); + auto_place_virgin = false; + } + + // Put it in the dom for you. + auto_place_container.appendChild(this.domElement); + + // Apply the auto styles + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + + } + + + // Make it not elastic. + if (!this.parent) setWidth(_this, params.width); + + } + + dom.bind(window, 'resize', function() { _this.onResize() }); + dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); }); + dom.bind(this.__ul, 'transitionend', function() { _this.onResize() }); + dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() }); + this.onResize(); + + + if (params.resizable) { + addResizeHandle(this); + } + + function saveToLocalStorage() { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + + var root = _this.getRoot(); + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + common.defer(function() { + root.width -= 1; + }); + } + + if (!params.parent) { + resetWidth(); + } + + }; + + GUI.toggleHide = function() { + + hide = !hide; + common.each(hideable_guis, function(gui) { + gui.domElement.style.zIndex = hide ? -999 : 999; + gui.domElement.style.opacity = hide ? 0 : 1; + }); + }; + + GUI.CLASS_AUTO_PLACE = 'a'; + GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; + GUI.CLASS_MAIN = 'main'; + GUI.CLASS_CONTROLLER_ROW = 'cr'; + GUI.CLASS_TOO_TALL = 'taller-than-window'; + GUI.CLASS_CLOSED = 'closed'; + GUI.CLASS_CLOSE_BUTTON = 'close-button'; + GUI.CLASS_DRAG = 'drag'; + + GUI.DEFAULT_WIDTH = 245; + GUI.TEXT_CLOSED = 'Close Controls'; + GUI.TEXT_OPEN = 'Open Controls'; + + dom.bind(window, 'keydown', function(e) { + + if (document.activeElement.type !== 'text' && + (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) { + GUI.toggleHide(); + } + + }, false); + + common.extend( + + GUI.prototype, + + /** @lends dat.gui.GUI */ + { + + /** + * @param object + * @param property + * @returns {dat.controllers.Controller} The new controller that was added. + * @instance + */ + add: function(object, property) { + + return add( + this, + object, + property, + { + factoryArgs: Array.prototype.slice.call(arguments, 2) + } + ); + + }, + + /** + * @param object + * @param property + * @returns {dat.controllers.ColorController} The new controller that was added. + * @instance + */ + addColor: function(object, property) { + + return add( + this, + object, + property, + { + color: true + } + ); + + }, + + /** + * @param controller + * @instance + */ + remove: function(controller) { + + // TODO listening? + this.__ul.removeChild(controller.__li); + this.__controllers.slice(this.__controllers.indexOf(controller), 1); + var _this = this; + common.defer(function() { + _this.onResize(); + }); + + }, + + destroy: function() { + + if (this.autoPlace) { + auto_place_container.removeChild(this.domElement); + } + + }, + + /** + * @param name + * @returns {dat.gui.GUI} The new folder. + * @throws {Error} if this GUI already has a folder by the specified + * name + * @instance + */ + addFolder: function(name) { + + // We have to prevent collisions on names in order to have a key + // by which to remember saved values + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + + ' name "' + name + '"'); + } + + var new_gui_params = { name: name, parent: this }; + + // We need to pass down the autoPlace trait so that we can + // attach event listeners to open/close folder actions to + // ensure that a scrollbar appears if the window is too short. + new_gui_params.autoPlace = this.autoPlace; + + // Do we have saved appearance data for this folder? + + if (this.load && // Anything loaded? + this.load.folders && // Was my parent a dead-end? + this.load.folders[name]) { // Did daddy remember me? + + // Start me closed if I was closed + new_gui_params.closed = this.load.folders[name].closed; + + // Pass down the loaded data + new_gui_params.load = this.load.folders[name]; + + } + + var gui = new GUI(new_gui_params); + this.__folders[name] = gui; + + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + + }, + + open: function() { + this.closed = false; + }, + + close: function() { + this.closed = true; + }, + + onResize: function() { + + var root = this.getRoot(); + + if (root.scrollable) { + + var top = dom.getOffset(root.__ul).top; + var h = 0; + + common.each(root.__ul.childNodes, function(node) { + if (! (root.autoPlace && node === root.__save_row)) + h += dom.getHeight(node); + }); + + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + + } + + if (root.__resize_handle) { + common.defer(function() { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + + }, + + /** + * Mark objects for saving. The order of these objects cannot change as + * the GUI grows. When remembering new objects, append them to the end + * of the list. + * + * @param {Object...} objects + * @throws {Error} if not called on a top level GUI. + * @instance + */ + remember: function() { + + if (common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents; + } + + if (this.parent) { + throw new Error("You can only call remember on a top level GUI."); + } + + var _this = this; + + common.each(Array.prototype.slice.call(arguments), function(object) { + if (_this.__rememberedObjects.length == 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) == -1) { + _this.__rememberedObjects.push(object); + } + }); + + if (this.autoPlace) { + // Set save row width + setWidth(this, this.width); + } + + }, + + /** + * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI. + * @instance + */ + getRoot: function() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + + /** + * @returns {Object} a JSON object representing the current state of + * this GUI as well as its remembered properties. + * @instance + */ + getSaveObject: function() { + + var toReturn = this.load; + + toReturn.closed = this.closed; + + // Am I remembering any values? + if (this.__rememberedObjects.length > 0) { + + toReturn.preset = this.preset; + + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + + toReturn.remembered[this.preset] = getCurrentPreset(this); + + } + + toReturn.folders = {}; + common.each(this.__folders, function(element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + + return toReturn; + + }, + + save: function() { + + if (!this.load.remembered) { + this.load.remembered = {}; + } + + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + + }, + + saveAs: function(presetName) { + + if (!this.load.remembered) { + + // Retain default values upon first save + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + + } + + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + + }, + + revert: function(gui) { + + common.each(this.__controllers, function(controller) { + // Make revert work on Default. + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + }, this); + + common.each(this.__folders, function(folder) { + folder.revert(folder); + }); + + if (!gui) { + markPresetModified(this.getRoot(), false); + } + + + }, + + listen: function(controller) { + + var init = this.__listening.length == 0; + this.__listening.push(controller); + if (init) updateDisplays(this.__listening); + + } + + } + + ); + + function add(gui, object, property, params) { + + if (object[property] === undefined) { + throw new Error("Object " + object + " has no property \"" + property + "\""); + } + + var controller; + + if (params.color) { + + controller = new ColorController(object, property); + + } else { + + var factoryArgs = [object,property].concat(params.factoryArgs); + controller = controllerFactory.apply(gui, factoryArgs); + + } + + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + + recallSavedValue(gui, controller); + + dom.addClass(controller.domElement, 'c'); + + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + + var li = addRow(gui, container, params.before); + + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + dom.addClass(li, typeof controller.getValue()); + + augmentController(gui, li, controller); + + gui.__controllers.push(controller); + + return controller; + + } + + /** + * Add a row to the end of the GUI or before another row. + * + * @param gui + * @param [dom] If specified, inserts the dom content in the new row + * @param [liBefore] If specified, places the new row before another row + */ + function addRow(gui, dom, liBefore) { + var li = document.createElement('li'); + if (dom) li.appendChild(dom); + if (liBefore) { + gui.__ul.insertBefore(li, params.before); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; + } + + function augmentController(gui, li, controller) { + + controller.__li = li; + controller.__gui = gui; + + common.extend(controller, { + + options: function(options) { + + if (arguments.length > 1) { + controller.remove(); + + return add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [common.toArray(arguments)] + } + ); + + } + + if (common.isArray(options) || common.isObject(options)) { + controller.remove(); + + return add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [options] + } + ); + + } + + }, + + name: function(v) { + controller.__li.firstElementChild.firstElementChild.innerHTML = v; + return controller; + }, + + listen: function() { + controller.__gui.listen(controller); + return controller; + }, + + remove: function() { + controller.__gui.remove(controller); + return controller; + } + + }); + + // All sliders should be accompanied by a box. + if (controller instanceof NumberControllerSlider) { + + var box = new NumberControllerBox(controller.object, controller.property, + { min: controller.__min, max: controller.__max, step: controller.__step }); + + common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function() { + var args = Array.prototype.slice.call(arguments); + pc.apply(controller, args); + return pb.apply(box, args); + } + }); + + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + + } + else if (controller instanceof NumberControllerBox) { + + var r = function(returned) { + + // Have we defined both boundaries? + if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) { + + // Well, then lets just replace this with a slider. + controller.remove(); + return add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + + } + + return returned; + + }; + + controller.min = common.compose(r, controller.min); + controller.max = common.compose(r, controller.max); + + } + else if (controller instanceof BooleanController) { + + dom.bind(li, 'click', function() { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + + dom.bind(controller.__checkbox, 'click', function(e) { + e.stopPropagation(); // Prevents double-toggle + }) + + } + else if (controller instanceof FunctionController) { + + dom.bind(li, 'click', function() { + dom.fakeEvent(controller.__button, 'click'); + }); + + dom.bind(li, 'mouseover', function() { + dom.addClass(controller.__button, 'hover'); + }); + + dom.bind(li, 'mouseout', function() { + dom.removeClass(controller.__button, 'hover'); + }); + + } + else if (controller instanceof ColorController) { + + dom.addClass(li, 'color'); + controller.updateDisplay = common.compose(function(r) { + li.style.borderLeftColor = controller.__color.toString(); + return r; + }, controller.updateDisplay); + + controller.updateDisplay(); + + } + + controller.setValue = common.compose(function(r) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return r; + }, controller.setValue); + + } + + function recallSavedValue(gui, controller) { + + // Find the topmost GUI, that's where remembered objects live. + var root = gui.getRoot(); + + // Does the object we're controlling match anything we've been told to + // remember? + var matched_index = root.__rememberedObjects.indexOf(controller.object); + + // Why yes, it does! + if (matched_index != -1) { + + // Let me fetch a map of controllers for thcommon.isObject. + var controller_map = + root.__rememberedObjectIndecesToControllers[matched_index]; + + // Ohp, I believe this is the first controller we've created for this + // object. Lets make the map fresh. + if (controller_map === undefined) { + controller_map = {}; + root.__rememberedObjectIndecesToControllers[matched_index] = + controller_map; + } + + // Keep track of this controller + controller_map[controller.property] = controller; + + // Okay, now have we saved any values for this controller? + if (root.load && root.load.remembered) { + + var preset_map = root.load.remembered; + + // Which preset are we trying to load? + var preset; + + if (preset_map[gui.preset]) { + + preset = preset_map[gui.preset]; + + } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) { + + // Uhh, you can have the default instead? + preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME]; + + } else { + + // Nada. + + return; + + } + + + // Did the loaded object remember thcommon.isObject? + if (preset[matched_index] && + + // Did we remember this particular property? + preset[matched_index][controller.property] !== undefined) { + + // We did remember something for this guy ... + var value = preset[matched_index][controller.property]; + + // And that's what it is. + controller.initialValue = value; + controller.setValue(value); + + } + + } + + } + + } + + function getLocalStorageHash(gui, key) { + // TODO how does this deal with multiple GUI's? + return document.location.href + '.' + key; + + } + + function addSaveMenu(gui) { + + var div = gui.__save_row = document.createElement('li'); + + dom.addClass(gui.domElement, 'has-save'); + + gui.__ul.insertBefore(div, gui.__ul.firstChild); + + dom.addClass(div, 'save-row'); + + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + + // TODO replace with FunctionController + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + + var select = gui.__preset_select = document.createElement('select'); + + if (gui.load && gui.load.remembered) { + + common.each(gui.load.remembered, function(value, key) { + addPresetOption(gui, key, key == gui.preset); + }); + + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + + dom.bind(select, 'change', function() { + + + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + + gui.preset = this.value; + + }); + + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + + if (SUPPORTS_LOCAL_STORAGE) { + + var saveLocally = document.getElementById('dg-save-locally'); + var explain = document.getElementById('dg-local-explain'); + + saveLocally.style.display = 'block'; + + var localStorageCheckBox = document.getElementById('dg-local-storage'); + + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + + function showHideExplain() { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; + } + + showHideExplain(); + + // TODO: Use a boolean controller, fool! + dom.bind(localStorageCheckBox, 'change', function() { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(); + }); + + } + + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + + dom.bind(newConstructorTextArea, 'keydown', function(e) { + if (e.metaKey && (e.which === 67 || e.keyCode == 67)) { + SAVE_DIALOGUE.hide(); + } + }); + + dom.bind(gears, 'click', function() { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + + dom.bind(button, 'click', function() { + gui.save(); + }); + + dom.bind(button2, 'click', function() { + var presetName = prompt('Enter a new preset name.'); + if (presetName) gui.saveAs(presetName); + }); + + dom.bind(button3, 'click', function() { + gui.revert(); + }); + + // div.appendChild(button2); + + } + + function addResizeHandle(gui) { + + gui.__resize_handle = document.createElement('div'); + + common.extend(gui.__resize_handle.style, { + + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + // border: '1px solid blue' + + }); + + var pmouseX; + + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); + + function dragStart(e) { + + e.preventDefault(); + + pmouseX = e.clientX; + + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + + return false; + + } + + function drag(e) { + + e.preventDefault(); + + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + + return false; + + } + + function dragStop() { + + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + + } + + } + + function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + // Auto placed save-rows are position fixed, so we have to + // set the width manually if we want it to bleed to the edge + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + }if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } + } + + function getCurrentPreset(gui, useInitialValues) { + + var toReturn = {}; + + // For each object I'm remembering + common.each(gui.__rememberedObjects, function(val, index) { + + var saved_values = {}; + + // The controllers I've made for thcommon.isObject by property + var controller_map = + gui.__rememberedObjectIndecesToControllers[index]; + + // Remember each value for each property + common.each(controller_map, function(controller, property) { + saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + + // Save the values for thcommon.isObject + toReturn[index] = saved_values; + + }); + + return toReturn; + + } + + function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } + } + + function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value == gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } + } + + function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + // console.log('mark', modified, opt); + if (modified) { + opt.innerHTML = opt.value + "*"; + } else { + opt.innerHTML = opt.value; + } + } + + function updateDisplays(controllerArray) { + + + if (controllerArray.length != 0) { + + requestAnimationFrame(function() { + updateDisplays(controllerArray); + }); + + } + + common.each(controllerArray, function(c) { + c.updateDisplay(); + }); + + } + + return GUI; + + })(dat.utils.css, + "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n \n
\n \n
\n\n
", + ".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n", + dat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) { + + return function(object, property) { + + var initialValue = object[property]; + + // Providing options? + if (common.isArray(arguments[2]) || common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + + // Providing a map? + + if (common.isNumber(initialValue)) { + + if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) { + + // Has min and max. + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + + } else { + + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + + } + + } + + if (common.isString(initialValue)) { + return new StringController(object, property); + } + + if (common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + + if (common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + + } + + })(dat.controllers.OptionController, + dat.controllers.NumberControllerBox, + dat.controllers.NumberControllerSlider, + dat.controllers.StringController = (function (Controller, dom, common) { + + /** + * @class Provides a text input to alter the string property of an object. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var StringController = function(object, property) { + + StringController.superclass.call(this, object, property); + + var _this = this; + + this.__input = document.createElement('input'); + this.__input.setAttribute('type', 'text'); + + dom.bind(this.__input, 'keyup', onChange); + dom.bind(this.__input, 'change', onChange); + dom.bind(this.__input, 'blur', onBlur); + dom.bind(this.__input, 'keydown', function(e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + + + function onChange() { + _this.setValue(_this.__input.value); + } + + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + this.updateDisplay(); + + this.domElement.appendChild(this.__input); + + }; + + StringController.superclass = Controller; + + common.extend( + + StringController.prototype, + Controller.prototype, + + { + + updateDisplay: function() { + // Stops the caret from moving on account of: + // keyup -> setValue -> updateDisplay + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return StringController.superclass.prototype.updateDisplay.call(this); + } + + } + + ); + + return StringController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common), + dat.controllers.FunctionController, + dat.controllers.BooleanController, + dat.utils.common), + dat.controllers.Controller, + dat.controllers.BooleanController, + dat.controllers.FunctionController, + dat.controllers.NumberControllerBox, + dat.controllers.NumberControllerSlider, + dat.controllers.OptionController, + dat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) { + + var ColorController = function(object, property) { + + ColorController.superclass.call(this, object, property); + + this.__color = new Color(this.getValue()); + this.__temp = new Color(0); + + var _this = this; + + this.domElement = document.createElement('div'); + + dom.makeSelectable(this.domElement, false); + + this.__selector = document.createElement('div'); + this.__selector.className = 'selector'; + + this.__saturation_field = document.createElement('div'); + this.__saturation_field.className = 'saturation-field'; + + this.__field_knob = document.createElement('div'); + this.__field_knob.className = 'field-knob'; + this.__field_knob_border = '2px solid '; + + this.__hue_knob = document.createElement('div'); + this.__hue_knob.className = 'hue-knob'; + + this.__hue_field = document.createElement('div'); + this.__hue_field.className = 'hue-field'; + + this.__input = document.createElement('input'); + this.__input.type = 'text'; + this.__input_textShadow = '0 1px 1px '; + + dom.bind(this.__input, 'keydown', function(e) { + if (e.keyCode === 13) { // on enter + onBlur.call(this); + } + }); + + dom.bind(this.__input, 'blur', onBlur); + + dom.bind(this.__selector, 'mousedown', function(e) { + + dom + .addClass(this, 'drag') + .bind(window, 'mouseup', function(e) { + dom.removeClass(_this.__selector, 'drag'); + }); + + }); + + var value_field = document.createElement('div'); + + common.extend(this.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + + common.extend(this.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + + common.extend(this.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + + common.extend(this.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + + common.extend(value_field.style, { + width: '100%', + height: '100%', + background: 'none' + }); + + linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000'); + + common.extend(this.__hue_field.style, { + width: '15px', + height: '100px', + display: 'inline-block', + border: '1px solid #555', + cursor: 'ns-resize' + }); + + hueGradient(this.__hue_field); + + common.extend(this.__input.style, { + outline: 'none', + // width: '120px', + textAlign: 'center', + // padding: '4px', + // marginBottom: '6px', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + + dom.bind(this.__saturation_field, 'mousedown', fieldDown); + dom.bind(this.__field_knob, 'mousedown', fieldDown); + + dom.bind(this.__hue_field, 'mousedown', function(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'mouseup', unbindH); + }); + + function fieldDown(e) { + setSV(e); + // document.body.style.cursor = 'none'; + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'mouseup', unbindSV); + } + + function unbindSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'mouseup', unbindSV); + // document.body.style.cursor = 'default'; + } + + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + + function unbindH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'mouseup', unbindH); + } + + this.__saturation_field.appendChild(value_field); + this.__selector.appendChild(this.__field_knob); + this.__selector.appendChild(this.__saturation_field); + this.__selector.appendChild(this.__hue_field); + this.__hue_field.appendChild(this.__hue_knob); + + this.domElement.appendChild(this.__input); + this.domElement.appendChild(this.__selector); + + this.updateDisplay(); + + function setSV(e) { + + e.preventDefault(); + + var w = dom.getWidth(_this.__saturation_field); + var o = dom.getOffset(_this.__saturation_field); + var s = (e.clientX - o.left + document.body.scrollLeft) / w; + var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w; + + if (v > 1) v = 1; + else if (v < 0) v = 0; + + if (s > 1) s = 1; + else if (s < 0) s = 0; + + _this.__color.v = v; + _this.__color.s = s; + + _this.setValue(_this.__color.toOriginal()); + + + return false; + + } + + function setH(e) { + + e.preventDefault(); + + var s = dom.getHeight(_this.__hue_field); + var o = dom.getOffset(_this.__hue_field); + var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s; + + if (h > 1) h = 1; + else if (h < 0) h = 0; + + _this.__color.h = h * 360; + + _this.setValue(_this.__color.toOriginal()); + + return false; + + } + + }; + + ColorController.superclass = Controller; + + common.extend( + + ColorController.prototype, + Controller.prototype, + + { + + updateDisplay: function() { + + var i = interpret(this.getValue()); + + if (i !== false) { + + var mismatch = false; + + // Check for mismatch on the interpreted value. + + common.each(Color.COMPONENTS, function(component) { + if (!common.isUndefined(i[component]) && + !common.isUndefined(this.__color.__state[component]) && + i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; // break + } + }, this); + + // If nothing diverges, we keep our previous values + // for statefulness, otherwise we recalculate fresh + if (mismatch) { + common.extend(this.__color.__state, i); + } + + } + + common.extend(this.__temp.__state, this.__color.__state); + + this.__temp.a = 1; + + var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0; + var _flip = 255 - flip; + + common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')' + }); + + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px' + + this.__temp.s = 1; + this.__temp.v = 1; + + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString()); + + common.extend(this.__input.style, { + backgroundColor: this.__input.value = this.__color.toString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip +')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)' + }); + + } + + } + + ); + + var vendors = ['-moz-','-o-','-webkit-','-ms-','']; + + function linearGradient(elem, x, a, b) { + elem.style.background = ''; + common.each(vendors, function(vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); '; + }); + } + + function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);' + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + } + + + return ColorController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.color.Color = (function (interpret, math, toString, common) { + + var Color = function() { + + this.__state = interpret.apply(this, arguments); + + if (this.__state === false) { + throw 'Failed to interpret color arguments'; + } + + this.__state.a = this.__state.a || 1; + + + }; + + Color.COMPONENTS = ['r','g','b','h','s','v','hex','a']; + + common.extend(Color.prototype, { + + toString: function() { + return toString(this); + }, + + toOriginal: function() { + return this.__state.conversion.write(this); + } + + }); + + defineRGBComponent(Color.prototype, 'r', 2); + defineRGBComponent(Color.prototype, 'g', 1); + defineRGBComponent(Color.prototype, 'b', 0); + + defineHSVComponent(Color.prototype, 'h'); + defineHSVComponent(Color.prototype, 's'); + defineHSVComponent(Color.prototype, 'v'); + + Object.defineProperty(Color.prototype, 'a', { + + get: function() { + return this.__state.a; + }, + + set: function(v) { + this.__state.a = v; + } + + }); + + Object.defineProperty(Color.prototype, 'hex', { + + get: function() { + + if (!this.__state.space !== 'HEX') { + this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b); + } + + return this.__state.hex; + + }, + + set: function(v) { + + this.__state.space = 'HEX'; + this.__state.hex = v; + + } + + }); + + function defineRGBComponent(target, component, componentHexIndex) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + + recalculateRGB(this, component, componentHexIndex); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'RGB') { + recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + + this.__state[component] = v; + + } + + }); + + } + + function defineHSVComponent(target, component) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'HSV') + return this.__state[component]; + + recalculateHSV(this); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'HSV') { + recalculateHSV(this); + this.__state.space = 'HSV'; + } + + this.__state[component] = v; + + } + + }); + + } + + function recalculateRGB(color, component, componentHexIndex) { + + if (color.__state.space === 'HEX') { + + color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex); + + } else if (color.__state.space === 'HSV') { + + common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + + } else { + + throw 'Corrupted color state'; + + } + + } + + function recalculateHSV(color) { + + var result = math.rgb_to_hsv(color.r, color.g, color.b); + + common.extend(color.__state, + { + s: result.s, + v: result.v + } + ); + + if (!common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } + + } + + return Color; + + })(dat.color.interpret, + dat.color.math = (function () { + + var tmpComponent; + + return { + + hsv_to_rgb: function(h, s, v) { + + var hi = Math.floor(h / 60) % 6; + + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - (f * s)); + var t = v * (1.0 - ((1.0 - f) * s)); + var c = [ + [v, t, p], + [q, v, p], + [p, v, t], + [p, q, v], + [t, p, v], + [v, p, q] + ][hi]; + + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + + }, + + rgb_to_hsv: function(r, g, b) { + + var min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s; + + if (max != 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + + if (r == max) { + h = (g - b) / delta; + } else if (g == max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + + rgb_to_hex: function(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + + component_from_hex: function(hex, componentIndex) { + return (hex >> (componentIndex * 8)) & 0xFF; + }, + + hex_with_component: function(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent)); + } + + } + + })(), + dat.color.toString, + dat.utils.common), + dat.color.interpret, + dat.utils.common), + dat.utils.requestAnimationFrame = (function () { + + /** + * requirejs version of Paul Irish's RequestAnimationFrame + * http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + */ + + return window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback, element) { + + window.setTimeout(callback, 1000 / 60); + + }; + })(), + dat.dom.CenteredDiv = (function (dom, common) { + + + var CenteredDiv = function() { + + this.backgroundElement = document.createElement('div'); + common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear' + }); + + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + + this.domElement = document.createElement('div'); + common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear' + }); + + + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + + var _this = this; + dom.bind(this.backgroundElement, 'click', function() { + _this.hide(); + }); + + + }; + + CenteredDiv.prototype.show = function() { + + var _this = this; + + + + this.backgroundElement.style.display = 'block'; + + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + // this.domElement.style.top = '52%'; + this.domElement.style.webkitTransform = 'scale(1.1)'; + + this.layout(); + + common.defer(function() { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + + }; + + CenteredDiv.prototype.hide = function() { + + var _this = this; + + var hide = function() { + + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + + }; + + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + + this.backgroundElement.style.opacity = 0; + // this.domElement.style.top = '48%'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + + }; + + CenteredDiv.prototype.layout = function() { + this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px'; + }; + + function lockScroll(e) { + console.log(e); + } + + return CenteredDiv; + + })(dat.dom.dom, + dat.utils.common), + dat.dom.dom, + dat.utils.common); + +/***/ }, +/* 5 */ +/***/ function(module, exports) { + + /** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + /** @namespace */ + var dat = module.exports = dat || {}; + + /** @namespace */ + dat.color = dat.color || {}; + + /** @namespace */ + dat.utils = dat.utils || {}; + + dat.utils.common = (function () { + + var ARR_EACH = Array.prototype.forEach; + var ARR_SLICE = Array.prototype.slice; + + /** + * Band-aid methods for things that should be a lot easier in JavaScript. + * Implementation and structure inspired by underscore.js + * http://documentcloud.github.com/underscore/ + */ + + return { + + BREAK: {}, + + extend: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (!this.isUndefined(obj[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + defaults: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (this.isUndefined(target[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + compose: function() { + var toCall = ARR_SLICE.call(arguments); + return function() { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length -1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + } + }, + + each: function(obj, itr, scope) { + + + if (ARR_EACH && obj.forEach === ARR_EACH) { + + obj.forEach(itr, scope); + + } else if (obj.length === obj.length + 0) { // Is number but not NaN + + for (var key = 0, l = obj.length; key < l; key++) + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) + return; + + } else { + + for (var key in obj) + if (itr.call(scope, obj[key], key) === this.BREAK) + return; + + } + + }, + + defer: function(fnc) { + setTimeout(fnc, 0); + }, + + toArray: function(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + + isUndefined: function(obj) { + return obj === undefined; + }, + + isNull: function(obj) { + return obj === null; + }, + + isNaN: function(obj) { + return obj !== obj; + }, + + isArray: Array.isArray || function(obj) { + return obj.constructor === Array; + }, + + isObject: function(obj) { + return obj === Object(obj); + }, + + isNumber: function(obj) { + return obj === obj+0; + }, + + isString: function(obj) { + return obj === obj+''; + }, + + isBoolean: function(obj) { + return obj === false || obj === true; + }, + + isFunction: function(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } + + }; + + })(); + + + dat.color.toString = (function (common) { + + return function(color) { + + if (color.a == 1 || common.isUndefined(color.a)) { + + var s = color.hex.toString(16); + while (s.length < 6) { + s = '0' + s; + } + + return '#' + s; + + } else { + + return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')'; + + } + + } + + })(dat.utils.common); + + + dat.Color = dat.color.Color = (function (interpret, math, toString, common) { + + var Color = function() { + + this.__state = interpret.apply(this, arguments); + + if (this.__state === false) { + throw 'Failed to interpret color arguments'; + } + + this.__state.a = this.__state.a || 1; + + + }; + + Color.COMPONENTS = ['r','g','b','h','s','v','hex','a']; + + common.extend(Color.prototype, { + + toString: function() { + return toString(this); + }, + + toOriginal: function() { + return this.__state.conversion.write(this); + } + + }); + + defineRGBComponent(Color.prototype, 'r', 2); + defineRGBComponent(Color.prototype, 'g', 1); + defineRGBComponent(Color.prototype, 'b', 0); + + defineHSVComponent(Color.prototype, 'h'); + defineHSVComponent(Color.prototype, 's'); + defineHSVComponent(Color.prototype, 'v'); + + Object.defineProperty(Color.prototype, 'a', { + + get: function() { + return this.__state.a; + }, + + set: function(v) { + this.__state.a = v; + } + + }); + + Object.defineProperty(Color.prototype, 'hex', { + + get: function() { + + if (!this.__state.space !== 'HEX') { + this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b); + } + + return this.__state.hex; + + }, + + set: function(v) { + + this.__state.space = 'HEX'; + this.__state.hex = v; + + } + + }); + + function defineRGBComponent(target, component, componentHexIndex) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + + recalculateRGB(this, component, componentHexIndex); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'RGB') { + recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + + this.__state[component] = v; + + } + + }); + + } + + function defineHSVComponent(target, component) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'HSV') + return this.__state[component]; + + recalculateHSV(this); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'HSV') { + recalculateHSV(this); + this.__state.space = 'HSV'; + } + + this.__state[component] = v; + + } + + }); + + } + + function recalculateRGB(color, component, componentHexIndex) { + + if (color.__state.space === 'HEX') { + + color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex); + + } else if (color.__state.space === 'HSV') { + + common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + + } else { + + throw 'Corrupted color state'; + + } + + } + + function recalculateHSV(color) { + + var result = math.rgb_to_hsv(color.r, color.g, color.b); + + common.extend(color.__state, + { + s: result.s, + v: result.v + } + ); + + if (!common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } + + } + + return Color; + + })(dat.color.interpret = (function (toString, common) { + + var result, toReturn; + + var interpret = function() { + + toReturn = false; + + var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0]; + + common.each(INTERPRETATIONS, function(family) { + + if (family.litmus(original)) { + + common.each(family.conversions, function(conversion, conversionName) { + + result = conversion.read(original); + + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return common.BREAK; + + } + + }); + + return common.BREAK; + + } + + }); + + return toReturn; + + }; + + var INTERPRETATIONS = [ + + // Strings + { + + litmus: common.isString, + + conversions: { + + THREE_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt( + '0x' + + test[1].toString() + test[1].toString() + + test[2].toString() + test[2].toString() + + test[3].toString() + test[3].toString()) + }; + + }, + + write: toString + + }, + + SIX_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString()) + }; + + }, + + write: toString + + }, + + CSS_RGB: { + + read: function(original) { + + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + + }, + + write: toString + + }, + + CSS_RGBA: { + + read: function(original) { + + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + + }, + + write: toString + + } + + } + + }, + + // Numbers + { + + litmus: common.isNumber, + + conversions: { + + HEX: { + read: function(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + } + }, + + write: function(color) { + return color.hex; + } + } + + } + + }, + + // Arrays + { + + litmus: common.isArray, + + conversions: { + + RGB_ARRAY: { + read: function(original) { + if (original.length != 3) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b]; + } + + }, + + RGBA_ARRAY: { + read: function(original) { + if (original.length != 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b, color.a]; + } + + } + + } + + }, + + // Objects + { + + litmus: common.isObject, + + conversions: { + + RGBA_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b) && + common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + } + } + }, + + RGB_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b + } + } + }, + + HSVA_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v) && + common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + } + } + }, + + HSV_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v + } + } + + } + + } + + } + + + ]; + + return interpret; + + + })(dat.color.toString, + dat.utils.common), + dat.color.math = (function () { + + var tmpComponent; + + return { + + hsv_to_rgb: function(h, s, v) { + + var hi = Math.floor(h / 60) % 6; + + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - (f * s)); + var t = v * (1.0 - ((1.0 - f) * s)); + var c = [ + [v, t, p], + [q, v, p], + [p, v, t], + [p, q, v], + [t, p, v], + [v, p, q] + ][hi]; + + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + + }, + + rgb_to_hsv: function(r, g, b) { + + var min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s; + + if (max != 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + + if (r == max) { + h = (g - b) / delta; + } else if (g == max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + + rgb_to_hex: function(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + + component_from_hex: function(hex, componentIndex) { + return (hex >> (componentIndex * 8)) & 0xFF; + }, + + hex_with_component: function(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent)); + } + + } + + })(), + dat.color.toString, + dat.utils.common); + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + (function (global, factory) { + true ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.THREE = global.THREE || {}))); + }(this, (function (exports) { 'use strict'; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( Function.prototype.name === undefined ) { + + // Missing in IE9-11. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*(\S*)\s*\(/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + 'use strict'; + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign( EventDispatcher.prototype, { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) { + + return true; + + } + + return false; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = [], i = 0; + var length = listenerArray.length; + + for ( i = 0; i < length; i ++ ) { + + array[ i ] = listenerArray[ i ]; + + } + + for ( i = 0; i < length; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + } ); + + var REVISION = '82'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var CullFaceFrontBack = 3; + var FrontFaceDirectionCW = 0; + var FrontFaceDirectionCCW = 1; + var BasicShadowMap = 0; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var SmoothShading = 2; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var TextureMapping = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var TextureWrapping = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var TextureFilter = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var RGBEFormat = RGBAFormat; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RGB_S3TC_DXT1_Format = 2001; + var RGBA_S3TC_DXT1_Format = 2002; + var RGBA_S3TC_DXT3_Format = 2003; + var RGBA_S3TC_DXT5_Format = 2004; + var RGB_PVRTC_4BPPV1_Format = 2100; + var RGB_PVRTC_2BPPV1_Format = 2101; + var RGBA_PVRTC_4BPPV1_Format = 2102; + var RGBA_PVRTC_2BPPV1_Format = 2103; + var RGB_ETC1_Format = 2151; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var LogLuvEncoding = 3003; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function generateUUID() { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i === 8 || i === 13 || i === 18 || i === 23 ) { + + uuid[ i ] = '-'; + + } else if ( i === 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + + } + + return uuid.join( '' ); + + }; + + }(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + random16: function () { + + console.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nearestPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Vector2.prototype = { + + constructor: Vector2, + + isVector2: true, + + get width() { + + return this.x; + + }, + + set width( value ) { + + this.x = value; + + }, + + get height() { + + return this.y; + + }, + + set height( value ) { + + this.y = value; + + }, + + // + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + + this.x *= scalar; + this.y *= scalar; + + } else { + + this.x = 0; + this.y = 0; + + } + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector2(); + max = new Vector2(); + + } + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + lengthManhattan: function() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: TextureIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.sourceFile = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Texture.prototype = { + + constructor: Texture, + + isTexture: true, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + if ( meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image.toDataURL !== undefined ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height ); + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + metadata: { + version: 4.4, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + wrap: [ this.wrapS, this.wrapT ], + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + meta.textures[ this.uuid ] = output; + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return; + + uv.multiply( this.repeat ); + uv.add( this.offset ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + + }; + + Object.assign( Texture.prototype, EventDispatcher.prototype ); + + var count = 0; + function TextureIdCount() { return count++; } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Vector4.prototype = { + + constructor: Vector4, + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + } else { + + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 0; + + } + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + this.w = attribute.array[ index + 3 ]; + + return this; + + } + + }; + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.uuid = _Math.generateUUID(); + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + Object.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, { + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Quaternion.prototype = { + + constructor: Quaternion, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get w () { + + return this._w; + + }, + + set w ( value ) { + + this._w = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( (euler && euler.isEuler) === false ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var c1 = Math.cos( euler._x / 2 ); + var c2 = Math.cos( euler._y / 2 ); + var c3 = Math.cos( euler._z / 2 ); + var s1 = Math.sin( euler._x / 2 ); + var s2 = Math.sin( euler._y / 2 ); + var s3 = Math.sin( euler._z / 2 ); + + var order = euler.order; + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final + + // assumes direction vectors vFrom and vTo are normalized + + var v1, r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + inverse: function () { + + return this.conjugate().normalize(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + }; + + Object.assign( Quaternion, { + + slerp: function( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function( + dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author *kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Vector3.prototype = { + + constructor: Vector3, + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + } else { + + this.x = 0; + this.y = 0; + this.z = 0; + + } + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion; + + return function applyEuler( euler ) { + + if ( (euler && euler.isEuler) === false ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + if ( quaternion === undefined ) quaternion = new Quaternion(); + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion; + + return function applyAxisAngle( axis, angle ) { + + if ( quaternion === undefined ) quaternion = new Quaternion(); + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + // input: THREE.Matrix4 affine matrix + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; + + return this; + + }, + + applyProjection: function ( m ) { + + // input: THREE.Matrix4 projection matrix + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + var d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix; + + return function project( camera ) { + + if ( matrix === undefined ) matrix = new Matrix4(); + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix; + + return function unproject( camera ) { + + if ( matrix === undefined ) matrix = new Matrix4(); + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector3(); + max = new Vector3(); + + } + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1; + + return function projectOnPlane( planeNormal ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1; + + return function reflect( normal ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function( s ) { + + var sinPhiRadius = Math.sin( s.phi ) * s.radius; + + this.x = sinPhiRadius * Math.sin( s.theta ); + this.y = Math.cos( s.phi ) * s.radius; + this.z = sinPhiRadius * Math.cos( s.theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + return this.setFromMatrixColumn( m, 3 ); + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + if ( typeof m === 'number' ) { + + console.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' ); + var temp = m; + m = index; + index = temp; + + } + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + + return this; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = new Float32Array( [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Matrix4.prototype = { + + constructor: Matrix4, + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + this.elements.set( m.elements ); + + return this; + + }, + + copyPosition: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.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 + ); + + return this; + + }, + + extractRotation: function () { + + var v1; + + return function extractRotation( m ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( (euler && euler.isEuler) === false ) { + + console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q.x, y = q.y, z = q.z, w = q.w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x, y, z; + + return function lookAt( eye, target, up ) { + + if ( x === undefined ) { + + x = new Vector3(); + y = new Vector3(); + z = new Vector3(); + + } + + var te = this.elements; + + z.subVectors( eye, target ).normalize(); + + if ( z.lengthSq() === 0 ) { + + z.z = 1; + + } + + x.crossVectors( up, z ).normalize(); + + if ( x.lengthSq() === 0 ) { + + z.z += 0.0001; + x.crossVectors( up, z ).normalize(); + + } + + y.crossVectors( z, x ); + + + te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; + te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; + te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyToArray: function ( a, b, r ) { + + var te = this.elements; + + this.multiplyMatrices( a, b ); + + r[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ]; + r[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ]; + r[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ]; + r[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ]; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToVector3Array: function () { + + var v1; + + return function applyToVector3Array( array, offset, length ) { + + if ( v1 === undefined ) v1 = new Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = array.length; + + for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) { + + v1.fromArray( array, j ); + v1.applyMatrix4( this ); + v1.toArray( array, j ); + + } + + return array; + + }; + + }(), + + applyToBuffer: function () { + + var v1; + + return function applyToBuffer( buffer, offset, length ) { + + if ( v1 === undefined ) v1 = new Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = buffer.length / buffer.itemSize; + + for ( var i = 0, j = offset; i < length; i ++, j ++ ) { + + v1.x = buffer.getX( j ); + v1.y = buffer.getY( j ); + v1.z = buffer.getZ( j ); + + v1.applyMatrix4( this ); + + buffer.setXYZ( j, v1.x, v1.y, v1.z ); + + } + + return buffer; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + 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 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset is deprecated " + + "- just use .toArray instead." ); + + return this.toArray( array, offset ); + + }, + + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + 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 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector, matrix; + + return function decompose( position, quaternion, scale ) { + + if ( vector === undefined ) { + + vector = new Vector3(); + matrix = new Matrix4(); + + } + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) { + + sx = - sx; + + } + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + + matrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy() + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makeFrustum: function ( left, right, bottom, top, near, far ) { + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makePerspective: function ( fov, aspect, near, far ) { + + var ymax = near * Math.tan( _Math.DEG2RAD * fov * 0.5 ); + var ymin = - ymax; + var xmin = ymin * aspect; + var xmax = ymax * aspect; + + return this.makeFrustum( xmin, xmax, ymin, ymax, near, far ); + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author tschw + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); } + function setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform2fv( this.addr, v ); + else gl.uniform2f( this.addr, v.x, v.y ); + + } + + function setValue3fv( gl, v ) { + + if ( v.x !== undefined ) + gl.uniform3f( this.addr, v.x, v.y, v.z ); + else if ( v.r !== undefined ) + gl.uniform3f( this.addr, v.r, v.g, v.b ); + else + gl.uniform3fv( this.addr, v ); + + } + + function setValue4fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform4fv( this.addr, v ); + else gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, v.elements || v ); + + } + + function setValue3fm( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, v.elements || v ); + + } + + function setValue4fm( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, v.elements || v ); + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); } + function setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); } + function setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: return setValueT1; // SAMPLER_2D + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); } + function setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) ); + + } + + function setValueV3a( gl, v ) { + + gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) ); + + } + + function setValueV4a( gl, v ) { + + gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) ); + + } + + function setValueM3a( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) ); + + } + + function setValueM4a( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function( gl, value ) { + + // Note: Don't need an extra 'renderer' parameter, since samplers + // are not allowed in structured uniforms. + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ] ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g; + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + for (; ;) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || + subscript === '[' && matchEnd + 2 === pathLength ) { + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + // step into inner node / create it in case it doesn't exist + + var map = container.map, + next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i !== n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + path = info.name, + addr = gl.getUniformLocation( program, path ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.set = function( gl, object, name ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + // note: always updating when .needsUpdate is undefined + + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var bsdfs = "bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\n\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t\t}\n\t\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\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 G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\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}\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;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\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}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\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\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\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}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n"; + + var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + 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 = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\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\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n"; + + var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n"; + + var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\n"; + + var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n"; + + var defaultnormal_vertex = "#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n return value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n return 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 return 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}\nvec4 RGBEToLinear( in vec4 value ) {\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n float maxComponent = max( max( value.r, value.g ), value.b );\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n M = ceil( M * 255.0 ) / 255.0;\n return vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float D = max( maxRange / maxRGB, 1.0 );\n D = min( floor( D ) / 255.0, 1.0 );\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n vec4 vResult;\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n vResult.w = fract(Le);\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n return vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n float Le = value.z * 255.0 + value.w;\n vec3 Xp_Y_XYZp;\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n return vec4( max(vRGB, 0.0), 1.0 );\n}\n"; + + var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n"; + + var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntenstiy;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n"; + + var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n"; + + var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n"; + + var fog_fragment = "#ifdef USE_FOG\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\t#else\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\t#endif\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n"; + + var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n"; + + var lights_pars = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\n\t\t\tdirectLight.color = pointLight.color;\n\t\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\t#include \n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\t#include \n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; + + var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n"; + + var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat 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"; + + var lights_template = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t \tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\t\t\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; + + var logdepthbuf_fragment = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif"; + + var logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n"; + + var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif"; + + var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var map_particle_fragment = "#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.r;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n"; + + var morphtarget_pars_vertex = "#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"; + + var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n"; + + var normal_flip = "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n"; + + var normal_fragment = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n"; + + var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n"; + + var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n return 1.0 - 2.0 * rgb.xyz;\n}\nconst 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\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n return linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var project_vertex = "#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.r;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\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\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n"; + + var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n"; + + var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n"; + + var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n"; + + var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + + var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n"; + + var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\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#endif\n"; + + var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n"; + + var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var tonemapping_pars_fragment = "#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n return toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\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"; + + var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif"; + + var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n"; + + var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n"; + + var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; + + var cube_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n"; + + var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var distanceRGBA_frag = "uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include \n#include \n#include \nvoid main () {\n\t#include \n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n"; + + var distanceRGBA_vert = "varying vec4 vWorldPosition;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition;\n}\n"; + + var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n"; + + var equirect_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight;\n\treflectedLight.directDiffuse = vec3( 0.0 );\n\treflectedLight.directSpecular = vec3( 0.0 );\n\treflectedLight.indirectDiffuse = diffuseColor.rgb;\n\treflectedLight.indirectSpecular = vec3( 0.0 );\n\t#include \n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nuniform float envMapIntensity;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n}\n"; + + var normal_frag = "uniform float opacity;\nvarying vec3 vNormal;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\n\t#include \n}\n"; + + var normal_vert = "varying vec3 vNormal;\n#include \n#include \n#include \n#include \nvoid main() {\n\tvNormal = normalize( normalMatrix * normal );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var points_vert = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var shadow_frag = "uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n"; + + var shadow_vert = "#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_vertex: envmap_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars: lights_pars, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_template: lights_template, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_flip: normal_flip, + normal_fragment: normal_fragment, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Color.prototype = { + + constructor: Color, + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( (value && value.isColor) ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( optionalTarget ) { + + // h,s,l ranges are in 0.0 - 1.0 + + var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + hsl.h = hue; + hsl.s = saturation; + hsl.l = lightness; + + return hsl; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function ( h, s, l ) { + + var hsl = this.getHSL(); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }, + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + }; + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }, + + specularMap: { value: null }, + alphaMap: { value: null }, + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.fog + + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + + { + emissive : { value: new Color( 0x000000 ) } + } + + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + + { + emissive : { value: new Color( 0x000000 ) }, + specular : { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + + { + emissive : { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0 }, + envMapIntensity : { value: 1 }, // temporary + } + + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.points, + UniformsLib.fog + + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.fog, + + { + scale : { value: 1 }, + dashSize : { value: 1 }, + totalSize: { value: 2 } + } + + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.displacementmap + + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: { + + opacity : { value: 1.0 } + + }, + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + equirect: { + + uniforms: { + tEquirect: { value: null }, + tFlip: { value: - 1 } + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: { + + lightPos: { value: new Vector3() } + + }, + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + + ShaderLib.standard.uniforms, + + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Box2.prototype = { + + constructor: Box2, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + if ( point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ) { + + return false; + + } + + return true; + + }, + + containsBox: function ( box ) { + + if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && + ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) { + + return true; + + } + + return false; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector2(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + + if ( box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ) { + + return false; + + } + + return true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlarePlugin( renderer, flares ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var shader, program, attributes, uniforms; + + var tempTexture, occlusionTexture; + + function init() { + + var vertices = new Float32Array( [ + - 1, - 1, 0, 0, + 1, - 1, 1, 0, + 1, 1, 1, 1, + - 1, 1, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + // buffers + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + // textures + + tempTexture = gl.createTexture(); + occlusionTexture = gl.createTexture(); + + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "uniform sampler2D occlusionMap;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", + + "vVisibility = visibility.r / 9.0;", + "vVisibility *= 1.0 - visibility.g / 9.0;", + "vVisibility *= visibility.b / 9.0;", + "vVisibility *= 1.0 - visibility.a / 9.0;", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * vVisibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + program = createProgram( shader ); + + attributes = { + vertex: gl.getAttribLocation ( program, "position" ), + uv: gl.getAttribLocation ( program, "uv" ) + }; + + uniforms = { + renderType: gl.getUniformLocation( program, "renderType" ), + map: gl.getUniformLocation( program, "map" ), + occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), + opacity: gl.getUniformLocation( program, "opacity" ), + color: gl.getUniformLocation( program, "color" ), + scale: gl.getUniformLocation( program, "scale" ), + rotation: gl.getUniformLocation( program, "rotation" ), + screenPosition: gl.getUniformLocation( program, "screenPosition" ) + }; + + } + + /* + * Render lens flares + * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, + * reads these back and calculates occlusion. + */ + + this.render = function ( scene, camera, viewport ) { + + if ( flares.length === 0 ) return; + + var tempPosition = new Vector3(); + + var invAspect = viewport.w / viewport.z, + halfViewportWidth = viewport.z * 0.5, + halfViewportHeight = viewport.w * 0.5; + + var size = 16 / viewport.w, + scale = new Vector2( size * invAspect, size ); + + var screenPosition = new Vector3( 1, 1, 0 ), + screenPositionPixels = new Vector2( 1, 1 ); + + var validArea = new Box2(); + + validArea.min.set( viewport.x, viewport.y ); + validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) ); + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.vertex ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + // loop through all lens flares to update their occlusion and positions + // setup gl and common used attribs/uniforms + + gl.uniform1i( uniforms.occlusionMap, 0 ); + gl.uniform1i( uniforms.map, 1 ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + state.disable( gl.CULL_FACE ); + state.setDepthWrite( false ); + + for ( var i = 0, l = flares.length; i < l; i ++ ) { + + size = 16 / viewport.w; + scale.set( size * invAspect, size ); + + // calc object screen position + + var flare = flares[ i ]; + + tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); + + tempPosition.applyMatrix4( camera.matrixWorldInverse ); + tempPosition.applyProjection( camera.projectionMatrix ); + + // setup arrays for gl programs + + screenPosition.copy( tempPosition ); + + // horizontal and vertical coordinate of the lower left corner of the pixels to copy + + screenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8; + screenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8; + + // screen cull + + if ( validArea.containsPoint( screenPositionPixels ) === true ) { + + // save current RGB to temp texture + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, null ); + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // render pink quad + + gl.uniform1i( uniforms.renderType, 0 ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + + state.disable( gl.BLEND ); + state.enable( gl.DEPTH_TEST ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // copy result to occlusionMap + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // restore graphics + + gl.uniform1i( uniforms.renderType, 1 ); + state.disable( gl.DEPTH_TEST ); + + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // update object positions + + flare.positionScreen.copy( screenPosition ); + + if ( flare.customUpdateCallback ) { + + flare.customUpdateCallback( flare ); + + } else { + + flare.updateLensFlares(); + + } + + // render flares + + gl.uniform1i( uniforms.renderType, 2 ); + state.enable( gl.BLEND ); + + for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { + + var sprite = flare.lensFlares[ j ]; + + if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { + + screenPosition.x = sprite.x; + screenPosition.y = sprite.y; + screenPosition.z = sprite.z; + + size = sprite.size * sprite.scale / viewport.w; + + scale.x = size * invAspect; + scale.y = size; + + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform1f( uniforms.rotation, sprite.rotation ); + + gl.uniform1f( uniforms.opacity, sprite.opacity ); + gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); + + state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); + renderer.setTexture2D( sprite.texture, 1 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + } + + } + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + state.enable( gl.DEPTH_TEST ); + state.setDepthWrite( true ); + + renderer.resetGLState(); + + }; + + function createProgram( shader ) { + + var program = gl.createProgram(); + + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + + var prefix = "precision " + renderer.getPrecision() + " float;\n"; + + gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); + gl.shaderSource( vertexShader, prefix + shader.vertexShader ); + + gl.compileShader( fragmentShader ); + gl.compileShader( vertexShader ); + + gl.attachShader( program, fragmentShader ); + gl.attachShader( program, vertexShader ); + + gl.linkProgram( program ); + + return program; + + } + + } + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function SpritePlugin( renderer, sprites ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new Vector3(); + var spriteRotation = new Quaternion(); + var spriteScale = new Vector3(); + + function init() { + + var vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation ( program, 'position' ), + uv: gl.getAttribLocation ( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new Texture( canvas ); + texture.needsUpdate = true; + + } + + this.render = function ( scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( (fog && fog.isFog) ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( (fog && fog.isFogExp2) ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + if ( material.visible === false ) continue; + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + + if ( material.map ) { + + renderer.setTexture2D( material.map, 0 ); + + } else { + + renderer.setTexture2D( texture, 0 ); + + } + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + renderer.resetGLState(); + + }; + + function createProgram() { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vUV = uvOffset + uv * uvScale;', + + 'vec2 alignedPosition = position * scale;', + + 'vec2 rotatedPosition;', + 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + 'vec4 finalPosition;', + + 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + 'finalPosition.xy += rotatedPosition;', + 'finalPosition = projectionMatrix * finalPosition;', + + 'gl_Position = finalPosition;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vec4 texture = texture2D( map, vUV );', + + 'if ( texture.a < alphaTest ) discard;', + + 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + 'if ( fogType > 0 ) {', + + 'float depth = gl_FragCoord.z / gl_FragCoord.w;', + 'float fogFactor = 0.0;', + + 'if ( fogType == 1 ) {', + + 'fogFactor = smoothstep( fogNear, fogFar, depth );', + + '} else {', + + 'const float LOG2 = 1.442695;', + 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', + 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + '}', + + 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', + + '}', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Material() { + + Object.defineProperty( this, 'id', { value: MaterialIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this._needsUpdate = true; + + } + + Material.prototype = { + + constructor: Material, + + isMaterial: true, + + get needsUpdate() { + + return this._needsUpdate; + + }, + + set needsUpdate( value ) { + + if ( value === true ) this.update(); + this._needsUpdate = value; + + }, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( (currentValue && currentValue.isColor) ) { + + currentValue.set( newValue ); + + } else if ( (currentValue && currentValue.isVector3) && (newValue && newValue.isVector3) ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = meta === undefined; + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.4, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( (this.color && this.color.isColor) ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( (this.emissive && this.emissive.isColor) ) data.emissive = this.emissive.getHex(); + if ( (this.specular && this.specular.isColor) ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + + if ( (this.map && this.map.isTexture) ) data.map = this.map.toJSON( meta ).uuid; + if ( (this.alphaMap && this.alphaMap.isTexture) ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( (this.lightMap && this.lightMap.isTexture) ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( (this.bumpMap && this.bumpMap.isTexture) ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( (this.normalMap && this.normalMap.isTexture) ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale.toArray(); + + } + if ( (this.displacementMap && this.displacementMap.isTexture) ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( (this.roughnessMap && this.roughnessMap.isTexture) ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( (this.metalnessMap && this.metalnessMap.isTexture) ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( (this.emissiveMap && this.emissiveMap.isTexture) ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( (this.specularMap && this.specularMap.isTexture) ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( (this.envMap && this.envMap.isTexture) ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.shading !== SmoothShading ) data.shading = this.shading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + data.skinning = this.skinning; + data.morphTargets = this.morphTargets; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.shading = source.shading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.alphaTest = source.alphaTest; + + this.premultipliedAlpha = source.premultipliedAlpha; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + return this; + + }, + + update: function () { + + this.dispatchEvent( { type: 'update' } ); + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + }; + + Object.assign( Material.prototype, EventDispatcher.prototype ); + + var count$1 = 0; + function MaterialIdCount() { return count$1++; } + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = source.defines; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Box3.prototype = { + + constructor: Box3, + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var v1 = new Vector3(); + + return function setFromObject( object ) { + + var scope = this; + + object.updateMatrixWorld( true ); + + this.makeEmpty(); + + object.traverse( function ( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( (geometry && geometry.isGeometry) ) { + + var vertices = geometry.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( (geometry && geometry.isBufferGeometry) ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + var array, offset, stride; + + if ( (attribute && attribute.isInterleavedBufferAttribute) ) { + + array = attribute.data.array; + offset = attribute.offset; + stride = attribute.data.stride; + + } else { + + array = attribute.array; + offset = 0; + stride = 3; + + } + + for ( var i = offset, il = array.length; i < il; i += stride ) { + + v1.fromArray( array, i ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + if ( 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 ) { + + return false; + + } + + return true; + + }, + + containsBox: function ( box ) { + + if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && + ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) && + ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) { + + return true; + + } + + return false; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector3(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + + if ( box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ) { + + return false; + + } + + return true; + + }, + + intersectsSphere: ( function () { + + var closestPoint; + + return function intersectsSphere( sphere ) { + + if ( closestPoint === undefined ) closestPoint = new Vector3(); + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= plane.constant && max >= plane.constant ); + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( optionalTarget ) { + + var result = optionalTarget || new Sphere(); + + this.getCenter( result.center ); + + result.radius = this.getSize( v1 ).length() * 0.5; + + return result; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + }; + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Sphere.prototype = { + + constructor: Sphere, + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + // We use the following equation to compute the signed distance from + // the center of the sphere to the plane. + // + // distance = q * n - d + // + // If this distance is greater than the radius of the sphere, + // then there is no intersection. + + return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + var result = optionalTarget || new Vector3(); + + result.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + result.sub( this.center ).normalize(); + result.multiplyScalar( this.radius ).add( this.center ); + + } + + return result; + + }, + + getBoundingBox: function ( optionalTarget ) { + + var box = optionalTarget || new Box3(); + + box.set( this.center, this.center ); + box.expandByScalar( this.radius ); + + return box; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = new Float32Array( [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Matrix3.prototype = { + + constructor: Matrix3, + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 3 ], me[ 6 ], + me[ 1 ], me[ 4 ], me[ 7 ], + me[ 2 ], me[ 5 ], me[ 8 ] + + ); + + return this; + + }, + + setFromMatrix4: function( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToVector3Array: function () { + + var v1; + + return function applyToVector3Array( array, offset, length ) { + + if ( v1 === undefined ) v1 = new Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = array.length; + + for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) { + + v1.fromArray( array, j ); + v1.applyMatrix3( this ); + v1.toArray( array, j ); + + } + + return array; + + }; + + }(), + + applyToBuffer: function () { + + var v1; + + return function applyToBuffer( buffer, offset, length ) { + + if ( v1 === undefined ) v1 = new Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = buffer.length / buffer.itemSize; + + for ( var i = 0, j = offset; i < length; i ++, j ++ ) { + + v1.x = buffer.getX( j ); + v1.y = buffer.getY( j ); + v1.z = buffer.getZ( j ); + + v1.applyMatrix3( this ); + + buffer.setXYZ( j, v1.x, v1.y, v1.z ); + + } + + return buffer; + + }; + + }(), + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( (matrix && matrix.isMatrix4) ) { + + console.error( "THREE.Matrix3.getInverse no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) { + + var msg = "THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset is deprecated " + + "- just use .toArray instead." ); + + return this.toArray( array, offset ); + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Plane.prototype = { + + constructor: Plane, + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, optionalTarget ) { + + return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); + + }, + + orthoPoint: function ( point, optionalTarget ) { + + var perpendicularMagnitude = this.distanceToPoint( point ); + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return result.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return result.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + // transform normal based on theory here: + // http://www.songho.ca/opengl/gl_normaltransform.html + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + // recalculate constant (like in setFromNormalAndCoplanarPoint) + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant = this.constant - offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Frustum.prototype = { + + constructor: Frustum, + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new Vector3(), + p2 = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6 ; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { + + var _gl = _renderer.context, + _state = _renderer.state, + _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _lightShadows = _lights.shadows, + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _renderList = [], + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + var depthMaterialTemplate = new MeshDepthMaterial(); + depthMaterialTemplate.depthPacking = RGBADepthPacking; + depthMaterialTemplate.clipping = true; + + var distanceShader = ShaderLib[ "distanceRGBA" ]; + var distanceUniforms = UniformsUtils.clone( distanceShader.uniforms ); + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = depthMaterialTemplate.clone(); + depthMaterial.morphTargets = useMorphing; + depthMaterial.skinning = useSkinning; + + _depthMaterials[ i ] = depthMaterial; + + var distanceMaterial = new ShaderMaterial( { + defines: { + 'USE_SHADOWMAP': '' + }, + uniforms: distanceUniforms, + vertexShader: distanceShader.vertexShader, + fragmentShader: distanceShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning, + clipping: true + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.renderReverseSided = true; + this.renderSingleSided = true; + + this.render = function ( scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( _lightShadows.length === 0 ) return; + + // Set GL state for depth map. + _state.clearColor( 1, 1, 1, 1 ); + _state.disable( _gl.BLEND ); + _state.setDepthTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount, isPointLight; + + for ( var i = 0, il = _lightShadows.length; i < il; i ++ ) { + + var light = _lightShadows[ i ]; + var shadow = light.shadow; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( (light && light.isPointLight) ) { + + faceCount = 6; + isPointLight = true; + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } else { + + faceCount = 1; + isPointLight = false; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + + shadowCamera.updateProjectionMatrix(); + + } + + if ( (shadow && shadow.isSpotLightShadow) ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } else { + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + + } + + shadowCamera.updateMatrixWorld(); + shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); + + // compute shadow matrix + + shadowMatrix.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 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + _renderList.length = 0; + + projectObject( scene, camera, shadowCamera ); + + // render shadow map + // render regular objects + + for ( var j = 0, jl = _renderList.length; j < jl; j ++ ) { + + var object = _renderList[ j ]; + var geometry = _objects.update( object ); + var material = object.material; + + if ( (material && material.isMultiMaterial) ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + } + + // Restore GL state. + var clearColor = _renderer.getClearColor(), + clearAlpha = _renderer.getClearAlpha(); + _renderer.setClearColor( clearColor, clearAlpha ); + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( (geometry && geometry.isBufferGeometry) ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( (geometry && geometry.isGeometry) ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + var side = material.side; + + if ( scope.renderSingleSided && side == DoubleSide ) { + + side = FrontSide; + + } + + if ( scope.renderReverseSided ) { + + if ( side === FrontSide ) side = BackSide; + else if ( side === BackSide ) side = FrontSide; + + } + + result.side = side; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.uniforms.lightPos !== undefined ) { + + result.uniforms.lightPos.value.copy( lightPositionWorld ); + + } + + return result; + + } + + function projectObject( object, camera, shadowCamera ) { + + if ( object.visible === false ) return; + + var visible = ( object.layers.mask & camera.layers.mask ) !== 0; + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) { + + var material = object.material; + + if ( material.visible === true ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + _renderList.push( object ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, shadowCamera ); + + } + + } + + } + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Ray.prototype = { + + constructor: Ray, + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + result.subVectors( point, this.origin ); + var directionDistance = result.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return result.copy( this.origin ); + + } + + return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, optionalTarget ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, optionalTarget ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, optionalTarget ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, optionalTarget ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, optionalTarget ); + + }, + + + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + intersectBox: function ( box, optionalTarget ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, optionalTarget ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.direction.add( this.origin ).applyMatrix4( matrix4 ); + this.origin.applyMatrix4( matrix4 ); + this.direction.sub( this.origin ); + this.direction.normalize(); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Euler.prototype = { + + constructor: Euler, + + isEuler: true, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get order () { + + return this._order; + + }, + + set order ( value ) { + + this._order = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix; + + return function setFromQuaternion( q, order, update ) { + + if ( matrix === undefined ) matrix = new Matrix4(); + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1; + + } + + Layers.prototype = { + + constructor: Layers, + + set: function ( channel ) { + + this.mask = 1 << channel; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + function Object3D() { + + Object.defineProperty( this, 'id', { value: Object3DIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + + this.onBeforeRender = function(){}; + this.onAfterRender = function(){}; + + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object.assign( Object3D.prototype, EventDispatcher.prototype, { + + isObject3D: true, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This routine does not support objects with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + + return function lookAt( vector ) { + + m1.lookAt( vector, this.position, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( (object && object.isObject3D) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + return result.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( optionalTarget ) { + + var result = optionalTarget || new Quaternion(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, result, scale ); + + return result; + + }; + + }(), + + getWorldRotation: function () { + + var quaternion = new Quaternion(); + + return function getWorldRotation( optionalTarget ) { + + var result = optionalTarget || new Euler(); + + this.getWorldQuaternion( quaternion ); + + return result.setFromQuaternion( quaternion, this.rotation.order, false ); + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, result ); + + return result; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate === true ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate === true || force === true ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + // meta is '' when called from JSON.stringify + var isRootObject = ( meta === undefined || meta === '' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {} + }; + + output.metadata = { + version: 4.4, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + + object.matrix = this.matrix.toArray(); + + // + + if ( this.geometry !== undefined ) { + + if ( meta.geometries[ this.geometry.uuid ] === undefined ) { + + meta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta ); + + } + + object.geometry = this.geometry.uuid; + + } + + if ( this.material !== undefined ) { + + if ( meta.materials[ this.material.uuid ] === undefined ) { + + meta.materials[ this.material.uuid ] = this.material.toJSON( meta ); + + } + + object.material = this.material.uuid; + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + } ); + + var count$2 = 0; + function Object3DIdCount() { return count$2++; } + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Line3.prototype = { + + constructor: Line3, + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, optionalTarget ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + }; + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Triangle.normal = function () { + + var v0 = new Vector3(); + + return function normal( a, b, c, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + result.subVectors( c, b ); + v0.subVectors( a, b ); + result.cross( v0 ); + + var resultLengthSq = result.lengthSq(); + if ( resultLengthSq > 0 ) { + + return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); + + } + + return result.set( 0, 0, 0 ); + + }; + + }(); + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + Triangle.barycoordFromPoint = function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function barycoordFromPoint( point, a, b, c, optionalTarget ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + var result = optionalTarget || new Vector3(); + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return result.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return result.set( 1 - u - v, v, u ); + + }; + + }(); + + Triangle.containsPoint = function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + var result = Triangle.barycoordFromPoint( point, a, b, c, v1 ); + + return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); + + }; + + }(); + + Triangle.prototype = { + + constructor: Triangle, + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + area: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function area() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + midpoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + normal: function ( optionalTarget ) { + + return Triangle.normal( this.a, this.b, this.c, optionalTarget ); + + }, + + plane: function ( optionalTarget ) { + + var result = optionalTarget || new Plane(); + + return result.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + barycoordFromPoint: function ( point, optionalTarget ) { + + return Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + closestPointToPoint: function () { + + var plane, edgeList, projectedPoint, closestPoint; + + return function closestPointToPoint( point, optionalTarget ) { + + if ( plane === undefined ) { + + plane = new Plane(); + edgeList = [ new Line3(), new Line3(), new Line3() ]; + projectedPoint = new Vector3(); + closestPoint = new Vector3(); + + } + + var result = optionalTarget || new Vector3(); + var minDistance = Infinity; + + // project the point onto the plane of the triangle + + plane.setFromCoplanarPoints( this.a, this.b, this.c ); + plane.projectPoint( point, projectedPoint ); + + // check if the projection lies within the triangle + + if( this.containsPoint( projectedPoint ) === true ) { + + // if so, this is the closest point + + result.copy( projectedPoint ); + + } else { + + // if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices + + edgeList[ 0 ].set( this.a, this.b ); + edgeList[ 1 ].set( this.b, this.c ); + edgeList[ 2 ].set( this.c, this.a ); + + for( var i = 0; i < edgeList.length; i ++ ) { + + edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint ); + + var distance = projectedPoint.distanceToSquared( closestPoint ); + + if( distance < minDistance ) { + + minDistance = distance; + + result.copy( closestPoint ); + + } + + } + + } + + return result; + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = (normal && normal.isVector3) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = (color && color.isColor) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Face3.prototype = { + + constructor: Face3, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * shading: THREE.SmoothShading, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + BufferAttribute.prototype = { + + constructor: BufferAttribute, + + isBufferAttribute: true, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyIndicesArray: function ( indices ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + var index = indices[ i ]; + + array[ offset ++ ] = index.a; + array[ offset ++ ] = index.b; + array[ offset ++ ] = index.c; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + }; + + // + + function Int8Attribute( array, itemSize ) { + + return new BufferAttribute( new Int8Array( array ), itemSize ); + + } + + function Uint8Attribute( array, itemSize ) { + + return new BufferAttribute( new Uint8Array( array ), itemSize ); + + } + + function Uint8ClampedAttribute( array, itemSize ) { + + return new BufferAttribute( new Uint8ClampedArray( array ), itemSize ); + + } + + function Int16Attribute( array, itemSize ) { + + return new BufferAttribute( new Int16Array( array ), itemSize ); + + } + + function Uint16Attribute( array, itemSize ) { + + return new BufferAttribute( new Uint16Array( array ), itemSize ); + + } + + function Int32Attribute( array, itemSize ) { + + return new BufferAttribute( new Int32Array( array ), itemSize ); + + } + + function Uint32Attribute( array, itemSize ) { + + return new BufferAttribute( new Uint32Array( array ), itemSize ); + + } + + function Float32Attribute( array, itemSize ) { + + return new BufferAttribute( new Float32Array( array ), itemSize ); + + } + + function Float64Attribute( array, itemSize ) { + + return new BufferAttribute( new Float64Array( array ), itemSize ); + + } + + // Deprecated + + function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + function Geometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [ [] ]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( Geometry.prototype, EventDispatcher.prototype, { + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + } + + if ( indices !== undefined ) { + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } + + } + + } else { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeTangents: function () { + + console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + + computeLineDistances: function () { + + var d = 0; + var vertices = this.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + if ( i > 0 ) { + + d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); + + } + + this.lineDistances[ i ] = d; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( (geometry && geometry.isGeometry) === false ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( (mesh && mesh.isMesh) === false ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + mesh.matrixAutoUpdate && mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + var dupIndex = - 1; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + dupIndex = n; + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + this.vertices = []; + this.faces = []; + this.faceVertexUvs = [ [] ]; + this.colors = []; + + var vertices = source.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + var colors = source.colors; + + for ( var i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + var faces = source.faces; + + for ( var i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + for ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( var k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + var count$3 = 0; + function GeometryIdCount() { return count$3++; } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'DirectGeometry'; + + this.indices = []; + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, EventDispatcher.prototype, { + + computeBoundingBox: Geometry.prototype.computeBoundingBox, + computeBoundingSphere: Geometry.prototype.computeBoundingSphere, + + computeFaceNormals: function () { + + console.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' ); + + }, + + computeVertexNormals: function () { + + console.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' ); + + }, + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + } + + Object.assign( BufferGeometry.prototype, EventDispatcher.prototype, { + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + this.index = index; + + }, + + addAttribute: function ( name, attribute ) { + + if ( (attribute && attribute.isBufferAttribute) === false && (attribute && attribute.isInterleavedBufferAttribute) === false ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToVector3Array( position.array ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToVector3Array( normal.array ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( (object && object.isPoints) || (object && object.isLine) ) { + + var positions = new Float32Attribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32Attribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32Attribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( (object && object.isMesh) ) { + + if ( (geometry && geometry.isGeometry) ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( (object && object.isMesh) ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + if ( geometry.indices.length > 0 ) { + + var TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array; + var indices = new TypeArray( geometry.indices.length * 3 ); + this.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32Attribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32Attribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32Attribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var positions = this.attributes.position.array; + + if ( positions !== undefined ) { + + this.boundingBox.setFromArray( positions ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var positions = this.attributes.position; + + if ( positions ) { + + var array = positions.array; + var center = this.boundingSphere.center; + + box.setFromArray( array ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = array.length; i < il; i += 3 ) { + + vector.fromArray( array, i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC, + + pA = new Vector3(), + pB = new Vector3(), + pC = new Vector3(), + + cb = new Vector3(), + ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( (geometry && geometry.isBufferGeometry) === false ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) offset = 0; + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var normals = this.attributes.normal.array; + + var x, y, z, n; + + for ( var i = 0, il = normals.length; i < il; i += 3 ) { + + x = normals[ i ]; + y = normals[ i + 1 ]; + z = normals[ i + 2 ]; + + n = 1.0 / Math.sqrt( x * x + y * y + z * z ); + + normals[ i ] *= n; + normals[ i + 1 ] *= n; + normals[ i + 2 ] *= n; + + } + + }, + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + BufferGeometry.MaxIndex = 65535; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + return this; + + }, + + updateMorphTargets: function () { + + var morphTargets = this.geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ morphTargets[ m ].name ] = m; + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var barycoord = new Vector3(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord ); + + uv1.multiplyScalar( barycoord.x ); + uv2.multiplyScalar( barycoord.y ); + uv3.multiplyScalar( barycoord.z ); + + uv1.add( uv2 ).add( uv3 ); + + return uv1.clone(); + + } + + function checkIntersection( object, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + var material = object.material; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) { + + vA.fromArray( positions, a * 3 ); + vB.fromArray( positions, b * 3 ); + vC.fromArray( positions, c * 3 ); + + var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs ) { + + uvA.fromArray( uvs, a * 2 ); + uvB.fromArray( uvs, b * 2 ); + uvC.fromArray( uvs, c * 2 ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + intersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) ); + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var uvs, intersection; + + if ( (geometry && geometry.isBufferGeometry) ) { + + var a, b, c; + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( attributes.uv !== undefined ) { + + uvs = attributes.uv.array; + + } + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length; i < l; i += 3 ) { + + a = indices[ i ]; + b = indices[ i + 1 ]; + c = indices[ i + 2 ]; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else { + + + for ( var i = 0, l = positions.length; i < l; i += 9 ) { + + a = i / 3; + b = a + 1; + c = a + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c ); + + if ( intersection ) { + + intersection.index = a; // triangle number in positions buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( (geometry && geometry.isGeometry) ) { + + var fvA, fvB, fvC; + var isFaceMaterial = (material && material.isMultiMaterial); + var materials = isFaceMaterial === true ? material.materials : null; + + var vertices = geometry.vertices; + var faces = geometry.faces; + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + // segments + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // these are used to calculate buffer length + var vertexCount = calculateVertexCount( widthSegments, heightSegments, depthSegments ); + var indexCount = calculateIndexCount( widthSegments, heightSegments, depthSegments ); + + // buffers + var indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ); + var vertices = new Float32Array( vertexCount * 3 ); + var normals = new Float32Array( vertexCount * 3 ); + var uvs = new Float32Array( vertexCount * 2 ); + + // offset variables + var vertexBufferOffset = 0; + var uvBufferOffset = 0; + var indexBufferOffset = 0; + var numberOfVertices = 0; + + // group variables + var groupStart = 0; + + // build each side of the box geometry + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + this.setIndex( new BufferAttribute( indices, 1 ) ); + this.addAttribute( 'position', new BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) ); + + // helper functions + + function calculateVertexCount( w, h, d ) { + + var vertices = 0; + + // calculate the amount of vertices for each side (plane) + vertices += (w + 1) * (h + 1) * 2; // xy + vertices += (w + 1) * (d + 1) * 2; // xz + vertices += (d + 1) * (h + 1) * 2; // zy + + return vertices; + + } + + function calculateIndexCount( w, h, d ) { + + var index = 0; + + // calculate the amount of squares for each side + index += w * h * 2; // xy + index += w * d * 2; // xz + index += d * h * 2; // zy + + return index * 6; // two triangles per square => six vertices per square + + } + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( var iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( var ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + vertices[ vertexBufferOffset ] = vector.x; + vertices[ vertexBufferOffset + 1 ] = vector.y; + vertices[ vertexBufferOffset + 2 ] = vector.z; + + // set values to correct vector component + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + normals[ vertexBufferOffset ] = vector.x; + normals[ vertexBufferOffset + 1 ] = vector.y; + normals[ vertexBufferOffset + 2 ] = vector.z; + + // uvs + uvs[ uvBufferOffset ] = ix / gridX; + uvs[ uvBufferOffset + 1 ] = 1 - ( iy / gridY ); + + // update offsets and counters + vertexBufferOffset += 3; + uvBufferOffset += 2; + vertexCounter += 1; + + } + + } + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + // indices + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // face one + indices[ indexBufferOffset ] = a; + indices[ indexBufferOffset + 1 ] = b; + indices[ indexBufferOffset + 2 ] = d; + + // face two + indices[ indexBufferOffset + 3 ] = b; + indices[ indexBufferOffset + 4 ] = c; + indices[ indexBufferOffset + 5 ] = d; + + // update offsets and counters + indexBufferOffset += 6; + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + groupStart += groupCount; + + // update total number of vertices + numberOfVertices += vertexCounter; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var vertices = new Float32Array( gridX1 * gridY1 * 3 ); + var normals = new Float32Array( gridX1 * gridY1 * 3 ); + var uvs = new Float32Array( gridX1 * gridY1 * 2 ); + + var offset = 0; + var offset2 = 0; + + for ( var iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( var ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices[ offset ] = x; + vertices[ offset + 1 ] = - y; + + normals[ offset + 2 ] = 1; + + uvs[ offset2 ] = ix / gridX; + uvs[ offset2 + 1 ] = 1 - ( iy / gridY ); + + offset += 3; + offset2 += 2; + + } + + } + + offset = 0; + + var indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 ); + + for ( var iy = 0; iy < gridY; iy ++ ) { + + for ( var ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + indices[ offset ] = a; + indices[ offset + 1 ] = b; + indices[ offset + 2 ] = d; + + indices[ offset + 3 ] = b; + indices[ offset + 4 ] = c; + indices[ offset + 5 ] = d; + + offset += 6; + + } + + } + + this.setIndex( new BufferAttribute( indices, 1 ) ); + this.addAttribute( 'position', new BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + + } + + Camera.prototype = Object.create( Object3D.prototype ); + Camera.prototype.constructor = Camera; + + Camera.prototype.isCamera = true; + + Camera.prototype.getWorldDirection = function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + + }(); + + Camera.prototype.lookAt = function () { + + // This routine does not support cameras with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + + return function lookAt( vector ) { + + m1.lookAt( this.position, vector, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(); + + Camera.prototype.clone = function () { + + return new this.constructor().copy( this ); + + }; + + Camera.prototype.copy = function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function() { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( + _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( view !== null ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makeFrustum( + left, left + width, top - height, top, near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function( fullWidth, fullHeight, x, y, width, height ) { + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function() { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, size; + + function setIndex( index ) { + + if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { + + type = gl.UNSIGNED_INT; + size = 4; + + } else { + + type = gl.UNSIGNED_SHORT; + size = 2; + + } + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * size ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + extension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount ); + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + return { + + setMode: setMode, + setIndex: setIndex, + render: render, + renderInstances: renderInstances + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + var count = 0; + + if ( (position && position.isInterleavedBufferAttribute) ) { + + count = position.data.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } else { + + count = position.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + return { + setMode: setMode, + render: render, + renderInstances: renderInstances + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLLights() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear','( value )' ]; + case sRGBEncoding: + return [ 'sRGB','( value )' ]; + case RGBEEncoding: + return [ 'RGBE','( value )' ]; + case RGBM7Encoding: + return [ 'RGBM','( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM','( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD','( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }"; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }"; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = "Linear"; + break; + + case ReinhardToneMapping: + toneMappingName = "Reinhard"; + break; + + case Uncharted2ToneMapping: + toneMappingName = "Uncharted2"; + break; + + case CineonToneMapping: + toneMappingName = "OptimizedCineon"; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '', + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program, identifiers ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function parseIncludes( string ) { + + var pattern = /#include +<([\w\d.]+)>/g; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, code, material, parameters ) { + + var gl = renderer.context; + + var extensions = material.extensions; + var defines = material.defines; + + var vertexShader = material.__webglShader.vertexShader; + var fragmentShader = material.__webglShader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = generateExtensions( extensions, parameters, renderer.extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + '#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection), + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '', + + parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? "#define TONE_MAPPING" : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '', + + parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader, parameters ); + vertexShader = replaceLightNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader, parameters ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + + if ( ! material.isShaderMaterial ) { + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ); + var vertexLog = gl.getShaderInfoLog( glVertexShader ); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function() { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = + new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function() { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function() { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking" + ]; + + + function allocateBones( object ) { + + if ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = nVertexMatrices; + + if ( object !== undefined && (object && object.isSkinnedMesh) ) { + + maxBones = Math.min( object.skeleton.bones.length, maxBones ); + + if ( maxBones < object.skeleton.bones.length ) { + + console.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' ); + + } + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( (map && map.isTexture) ) { + + encoding = map.encoding; + + } else if ( (map && map.isWebGLRenderTarget) ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = allocateBones( object ); + var precision = renderer.getPrecision(); + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getCurrentRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: (fog && fog.isFogExp2), + + flatShading: material.shading === FlatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + return array.join(); + + }; + + this.acquireProgram = function ( material, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, code, material, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, properties, info ) { + + var geometries = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + deleteAttribute( buffergeometry.index ); + + } + + deleteAttributes( buffergeometry.attributes ); + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + // TODO + + var property = properties.get( geometry ); + + if ( property.wireframe ) { + + deleteAttribute( property.wireframe ); + + } + + properties.delete( geometry ); + + var bufferproperty = properties.get( buffergeometry ); + + if ( bufferproperty.wireframe ) { + + deleteAttribute( bufferproperty.wireframe ); + + } + + properties.delete( buffergeometry ); + + // + + info.memory.geometries --; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function deleteAttribute( attribute ) { + + var buffer = getAttributeBuffer( attribute ); + + if ( buffer !== undefined ) { + + gl.deleteBuffer( buffer ); + removeAttributeBuffer( attribute ); + + } + + } + + function deleteAttributes( attributes ) { + + for ( var name in attributes ) { + + deleteAttribute( attributes[ name ] ); + + } + + } + + function removeAttributeBuffer( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + properties.delete( attribute.data ); + + } else { + + properties.delete( attribute ); + + } + + } + + return { + + get: function ( object ) { + + var geometry = object.geometry; + + if ( geometries[ geometry.id ] !== undefined ) { + + return geometries[ geometry.id ]; + + } + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + var buffergeometry; + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( gl, properties, info ) { + + var geometries = new WebGLGeometries( gl, properties, info ); + + // + + function update( object ) { + + // TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter. + + var geometry = geometries.get( object ); + + if ( object.geometry.isGeometry ) { + + geometry.updateFromObject( object ); + + } + + var index = geometry.index; + var attributes = geometry.attributes; + + if ( index !== null ) { + + updateAttribute( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in attributes ) { + + updateAttribute( attributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + updateAttribute( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + return geometry; + + } + + function updateAttribute( attribute, bufferType ) { + + var data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute; + + var attributeProperties = properties.get( data ); + + if ( attributeProperties.__webglBuffer === undefined ) { + + createBuffer( attributeProperties, data, bufferType ); + + } else if ( attributeProperties.version !== data.version ) { + + updateBuffer( attributeProperties, data, bufferType ); + + } + + } + + function createBuffer( attributeProperties, data, bufferType ) { + + attributeProperties.__webglBuffer = gl.createBuffer(); + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + var usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + gl.bufferData( bufferType, data.array, usage ); + + attributeProperties.version = data.version; + + } + + function updateBuffer( attributeProperties, data, bufferType ) { + + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + if ( data.dynamic === false ) { + + gl.bufferData( bufferType, data.array, gl.STATIC_DRAW ); + + } else if ( data.updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, data.array ); + + } else if ( data.updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT, + data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) ); + + data.updateRange.count = 0; // reset range + + } + + attributeProperties.version = data.version; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function getWireframeAttribute( geometry ) { + + var property = properties.get( geometry ); + + if ( property.wireframe !== undefined ) { + + return property.wireframe; + + } + + var indices = []; + + var index = geometry.index; + var attributes = geometry.attributes; + var position = attributes.position; + + // console.time( 'wireframe' ); + + if ( index !== null ) { + + var edges = {}; + var array = index.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = attributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + var TypeArray = position.count > 65535 ? Uint32Array : Uint16Array; + var attribute = new BufferAttribute( new TypeArray( indices ), 1 ); + + updateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + property.wireframe = attribute; + + return attribute; + + } + + return { + + getAttributeBuffer: getAttributeBuffer, + getWireframeAttribute: getWireframeAttribute, + + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) { + + var _infoMemory = info.memory; + var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = _Math.nearestPowerOfTwo( image.width ); + canvas.height = _Math.nearestPowerOfTwo( image.height ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) return true; + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) return true; + + return false; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + _infoMemory.textures --; + + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + _infoMemory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.delete( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.delete( renderTarget.texture ); + properties.delete( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = (texture && texture.isCompressedTexture); + var isDataTexture = (texture.image[ 0 ] && texture.image[ 0 ].isDataTexture); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) { + + _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( (texture && texture.isDepthTexture) ) { + + // populate depth texture with dummy data + + var internalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0'); + internalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( _isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + internalFormat = _gl.DEPTH_COMPONENT16; + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + internalFormat = _gl.DEPTH_STENCIL; + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( (texture && texture.isDataTexture) ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } else if ( (texture && texture.isCompressedTexture) ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = paramThreeToGL( renderTarget.texture.format ); + var glType = paramThreeToGL( renderTarget.texture.type ); + state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ); + if ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!'); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( !( (renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture) ) ) { + + throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture'); + + } + + // upload an empty depth texture with framebuffer size + if ( !properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error('Unknown depthTexture format') + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets'); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + var isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + + if ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) && + texture.minFilter !== NearestFilter && + texture.minFilter !== LinearFilter ) { + + var target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + _gl.generateMipmap( target ); + state.bindTexture( target, null ); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = {}; + + return { + + get: function ( object ) { + + var uuid = object.uuid; + var map = properties[ uuid ]; + + if ( map === undefined ) { + + map = {}; + properties[ uuid ] = map; + + } + + return map; + + }, + + delete: function ( object ) { + + delete properties[ object.uuid ]; + + }, + + clear: function () { + + properties = {}; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, paramThreeToGL ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var currentColorClear = new Vector4(); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a ) { + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( 0, 0, 0, 1 ); + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var currentScissorTest = null; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // + + function init() { + + clearColor( 0, 0, 0, 1 ); + clearDepth( 1 ); + clearStencil( 0 ); + + enable( gl.DEPTH_TEST ); + setDepthFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + enable( gl.BLEND ); + setBlending( NormalBlending ); + + } + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending !== NoBlending ) { + + enable( gl.BLEND ); + + } else { + + disable( gl.BLEND ); + + } + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( blending === AdditiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } + + } else if ( blending === SubtractiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } + + } else if ( blending === MultiplyBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } + + } else { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + } + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + if ( blending === CustomBlending ) { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } else { + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } + + } + + // TODO Deprecate + + function setColorWrite( colorWrite ) { + + colorBuffer.setMask( colorWrite ); + + } + + function setDepthTest( depthTest ) { + + depthBuffer.setTest( depthTest ); + + } + + function setDepthWrite( depthWrite ) { + + depthBuffer.setMask( depthWrite ); + + } + + function setDepthFunc( depthFunc ) { + + depthBuffer.setFunc( depthFunc ); + + } + + function setStencilTest( stencilTest ) { + + stencilBuffer.setTest( stencilTest ); + + } + + function setStencilWrite( stencilWrite ) { + + stencilBuffer.setMask( stencilWrite ); + + } + + function setStencilFunc( stencilFunc, stencilRef, stencilMask ) { + + stencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask ); + + } + + function setStencilOp( stencilFail, stencilZFail, stencilZPass ) { + + stencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function getScissorTest() { + + return currentScissorTest; + + } + + function setScissorTest( scissorTest ) { + + currentScissorTest = scissorTest; + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + // TODO Deprecate + + function clearColor( r, g, b, a ) { + + colorBuffer.setClear( r, g, b, a ); + + } + + function clearDepth( depth ) { + + depthBuffer.setClear( depth ); + + } + + function clearStencil( stencil ) { + + stencilBuffer.setClear( stencil ); + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + init: init, + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + setBlending: setBlending, + + setColorWrite: setColorWrite, + setDepthTest: setDepthTest, + setDepthWrite: setDepthWrite, + setDepthFunc: setDepthFunc, + setStencilTest: setStencilTest, + setStencilWrite: setStencilWrite, + setStencilFunc: setStencilFunc, + setStencilOp: setStencilOp, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + getScissorTest: getScissorTest, + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + + clearColor: clearColor, + clearDepth: clearDepth, + clearStencil: clearStencil, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' ); + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + case 'WEBGL_compressed_texture_etc1': + extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function() { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function() { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || + planes === null || planes.length === 0 || + renderingShadows && ! clipShadows ) { + // there's no local clipping + + if ( renderingShadows ) { + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; + i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ). + applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false; + + var lights = []; + + var opaqueObjects = []; + var opaqueObjectsLastIndex = - 1; + var transparentObjects = []; + var transparentObjectsLastIndex = - 1; + + var morphInfluences = new Float32Array( 8 ); + + var sprites = []; + var lensFlares = []; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + // internal state cache + + _currentProgram = null, + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + _currentCamera = null, + + _currentScissor = new Vector4(), + _currentScissorTest = null, + + _currentViewport = new Vector4(), + + // + + _usedTextureUnits = 0, + + // + + _clearColor = new Color( 0x000000 ), + _clearAlpha = 0, + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + _viewport = new Vector4( 0, 0, _width, _height ), + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + _sphere = new Sphere(), + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(), + + // light arrays cache + + _lights = { + + hash: '', + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + + shadows: [] + + }, + + // info + + _infoRender = { + + calls: 0, + vertices: 0, + faces: 0, + points: 0 + + }; + + this.info = { + + render: _infoRender, + memory: { + + geometries: 0, + textures: 0 + + }, + programs: null + + }; + + + // initialize + + var _gl; + + try { + + var attributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer + }; + + _gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw 'Error creating WebGL context with your selected attributes.'; + + } else { + + throw 'Error creating WebGL context.'; + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error ); + + } + + var extensions = new WebGLExtensions( _gl ); + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extensions.get( 'OES_element_index_uint' ) ) { + + BufferGeometry.MaxIndex = 4294967296; + + } + + var capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + var state = new WebGLState( _gl, extensions, paramThreeToGL ); + var properties = new WebGLProperties(); + var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info ); + var objects = new WebGLObjects( _gl, properties, this.info ); + var programCache = new WebGLPrograms( this, capabilities ); + var lightCache = new WebGLLights(); + + this.info.programs = programCache.programs; + + var bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender ); + var indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ); + + // + + var backgroundCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + var backgroundCamera2 = new PerspectiveCamera(); + var backgroundPlaneMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } ) + ); + var backgroundBoxShader = ShaderLib[ 'cube' ]; + var backgroundBoxMesh = new Mesh( + new BoxBufferGeometry( 5, 5, 5 ), + new ShaderMaterial( { + uniforms: backgroundBoxShader.uniforms, + vertexShader: backgroundBoxShader.vertexShader, + fragmentShader: backgroundBoxShader.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + // + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + function glClearColor( r, g, b, a ) { + + if ( _premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + state.clearColor( r, g, b, a ); + + } + + function setDefaultGLState() { + + state.init(); + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + } + + function resetGLState() { + + _currentProgram = null; + _currentCamera = null; + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + + state.reset(); + + } + + setDefaultGLState(); + + this.context = _gl; + this.capabilities = capabilities; + this.extensions = extensions; + this.properties = properties; + this.state = state; + + // shadow map + + var shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities ); + + this.shadowMap = shadowMap; + + + // Plugins + + var spritePlugin = new SpritePlugin( this, sprites ); + var lensFlarePlugin = new LensFlarePlugin( this, lensFlares ); + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + extensions.get( 'WEBGL_lose_context' ).loseContext(); + + }; + + this.getMaxAnisotropy = function () { + + return capabilities.getMaxAnisotropy(); + + }; + + this.getPrecision = function () { + + return capabilities.precision; + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _viewport.z, _viewport.w, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + state.viewport( _viewport.set( x, y, width, height ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + state.scissor( _scissor.set( x, y, width, height ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return _clearColor; + + }; + + this.setClearColor = function ( color, alpha ) { + + _clearColor.set( color ); + + _clearAlpha = alpha !== undefined ? alpha : 1; + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + }; + + this.getClearAlpha = function () { + + return _clearAlpha; + + }; + + this.setClearAlpha = function ( alpha ) { + + _clearAlpha = alpha; + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // Reset + + this.resetGLState = resetGLState; + + this.dispose = function() { + + transparentObjects = []; + transparentObjectsLastIndex = -1; + opaqueObjects = []; + opaqueObjectsLastIndex = -1; + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + resetGLState(); + setDefaultGLState(); + + properties.clear(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.delete( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var attributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.position ); + _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( ! material.isMeshPhongMaterial && + ! material.isMeshStandardMaterial && + material.shading === FlatShading ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.normal ); + + _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.uv ); + + _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.color ); + + _gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + setMaterial( material ); + + var program = setProgram( camera, fog, material, object ); + + var updateBuffers = false; + var geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + // morph targets + + var morphTargetInfluences = object.morphTargetInfluences; + + if ( morphTargetInfluences !== undefined ) { + + var activeInfluences = []; + + for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { + + var influence = morphTargetInfluences[ i ]; + activeInfluences.push( [ influence, i ] ); + + } + + activeInfluences.sort( absNumericalSort ); + + if ( activeInfluences.length > 8 ) { + + activeInfluences.length = 8; + + } + + var morphAttributes = geometry.morphAttributes; + + for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { + + var influence = activeInfluences[ i ]; + morphInfluences[ i ] = influence[ 0 ]; + + if ( influence[ 0 ] !== 0 ) { + + var index = influence[ 1 ]; + + if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); + if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); + + } else { + + if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); + if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) { + + morphInfluences[ i ] = 0.0; + + } + + program.getUniforms().setValue( + _gl, 'morphTargetInfluences', morphInfluences ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = objects.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var renderer; + + if ( index !== null ) { + + renderer = indexedBufferRenderer; + renderer.setIndex( index ); + + } else { + + renderer = bufferRenderer; + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) ); + + } + + } + + // + + var dataCount = 0; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry, startIndex ) { + + var extension; + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + if ( startIndex === undefined ) startIndex = 0; + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var type = _gl.FLOAT; + var array = geometryAttribute.array; + var normalized = geometryAttribute.normalized; + + if ( array instanceof Float32Array ) { + + type = _gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( "Unsupported data buffer format: Float64Array" ); + + } else if ( array instanceof Uint16Array ) { + + type = _gl.UNSIGNED_SHORT; + + } else if ( array instanceof Int16Array ) { + + type = _gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = _gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = _gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = _gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = _gl.UNSIGNED_BYTE; + + } + + var size = geometryAttribute.itemSize; + var buffer = objects.getAttributeBuffer( geometryAttribute ); + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * geometryAttribute.array.BYTES_PER_ELEMENT ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Sorting + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] ); + + } + + function painterSortStable( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) { + + return a.material.program.id - b.material.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + lights.length = 0; + + opaqueObjectsLastIndex = - 1; + transparentObjectsLastIndex = - 1; + + sprites.length = 0; + lensFlares.length = 0; + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + projectObject( scene, camera ); + + opaqueObjects.length = opaqueObjectsLastIndex + 1; + transparentObjects.length = transparentObjectsLastIndex + 1; + + if ( _this.sortObjects === true ) { + + opaqueObjects.sort( painterSortStable ); + transparentObjects.sort( reversePainterSortStable ); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + setupShadows( lights ); + + shadowMap.render( scene, camera ); + + setupLights( lights, camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + _infoRender.calls = 0; + _infoRender.vertices = 0; + _infoRender.faces = 0; + _infoRender.points = 0; + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + var background = scene.background; + + if ( background === null ) { + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + } else if ( background && background.isColor ) { + + glClearColor( background.r, background.g, background.b, 1 ); + forceClear = true; + + } + + if ( this.autoClear || forceClear ) { + + this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); + + } + + if ( background && background.isCubeTexture ) { + + backgroundCamera2.projectionMatrix.copy( camera.projectionMatrix ); + + backgroundCamera2.matrixWorld.extractRotation( camera.matrixWorld ); + backgroundCamera2.matrixWorldInverse.getInverse( backgroundCamera2.matrixWorld ); + + backgroundBoxMesh.material.uniforms[ "tCube" ].value = background; + backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundCamera2.matrixWorldInverse, backgroundBoxMesh.matrixWorld ); + + objects.update( backgroundBoxMesh ); + + _this.renderBufferDirect( backgroundCamera2, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null ); + + } else if ( background && background.isTexture ) { + + backgroundPlaneMesh.material.map = background; + + objects.update( backgroundPlaneMesh ); + + _this.renderBufferDirect( backgroundCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null ); + + } + + // + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + state.setBlending( NoBlending ); + renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + renderObjects( transparentObjects, scene, camera ); + + } + + // custom render plugins (post pass) + + spritePlugin.render( scene, camera ); + lensFlarePlugin.render( scene, camera, _currentViewport ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.setDepthTest( true ); + state.setDepthWrite( true ); + state.setColorWrite( true ); + + // _gl.finish(); + + }; + + function pushRenderItem( object, geometry, material, z, group ) { + + var array, index; + + // allocate the next position in the appropriate array + + if ( material.transparent ) { + + array = transparentObjects; + index = ++ transparentObjectsLastIndex; + + } else { + + array = opaqueObjects; + index = ++ opaqueObjectsLastIndex; + + } + + // recycle existing render item or grow the array + + var renderItem = array[ index ]; + + if ( renderItem !== undefined ) { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.z = _vector3.z; + renderItem.group = group; + + } else { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + z: _vector3.z, + group: group + }; + + // assert( index === array.length ); + array.push( renderItem ); + + } + + } + + // TODO Duplicated code (Frustum) + + function isObjectViewable( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ). + applyMatrix4( object.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSpriteViewable( sprite ) { + + _sphere.center.set( 0, 0, 0 ); + _sphere.radius = 0.7071067811865476; + _sphere.applyMatrix4( sprite.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSphereViewable( sphere ) { + + if ( ! _frustum.intersectsSphere( sphere ) ) return false; + + var numPlanes = _clipping.numPlanes; + + if ( numPlanes === 0 ) return true; + + var planes = _this.clippingPlanes, + + center = sphere.center, + negRad = - sphere.radius, + i = 0; + + do { + + // out when deeper than radius in the negative halfspace + if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; + + } while ( ++ i !== numPlanes ); + + return true; + + } + + function projectObject( object, camera ) { + + if ( object.visible === false ) return; + + var visible = ( object.layers.mask & camera.layers.mask ) !== 0; + + if ( visible ) { + + if ( object.isLight ) { + + lights.push( object ); + + } else if ( object.isSprite ) { + + if ( object.frustumCulled === false || isSpriteViewable( object ) === true ) { + + sprites.push( object ); + + } + + } else if ( object.isLensFlare ) { + + lensFlares.push( object ); + + } else if ( object.isImmediateRenderObject ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyProjection( _projScreenMatrix ); + + } + + pushRenderItem( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( object.frustumCulled === false || isObjectViewable( object ) === true ) { + + var material = object.material; + + if ( material.visible === true ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyProjection( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + + if ( material.isMultiMaterial ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + pushRenderItem( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else { + + pushRenderItem( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + if ( object.isImmediateRenderObject ) { + + setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram = ''; + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + + } + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var parameters = programCache.getParameters( + material, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.__webglShader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.__webglShader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.__webglShader = materialProperties.__webglShader; + + program = programCache.acquireProgram( material, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var attributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( attributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( attributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.__webglShader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + + materialProperties.lightsHash = _lights.hash; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = _lights.ambient; + uniforms.directionalLights.value = _lights.directional; + uniforms.spotLights.value = _lights.spot; + uniforms.pointLights.value = _lights.point; + uniforms.hemisphereLights.value = _lights.hemi; + + uniforms.directionalShadowMap.value = _lights.directionalShadowMap; + uniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix; + uniforms.spotShadowMap.value = _lights.spotShadowMap; + uniforms.spotShadowMatrix.value = _lights.spotShadowMatrix; + uniforms.pointShadowMap.value = _lights.pointShadowMap; + uniforms.pointShadowMatrix.value = _lights.pointShadowMatrix; + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setMaterial( material ) { + + material.side === DoubleSide + ? state.disable( _gl.CULL_FACE ) + : state.enable( _gl.CULL_FACE ); + + state.setFlipSided( material.side === BackSide ); + + material.transparent === true + ? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) + : state.setBlending( NoBlending ); + + state.setDepthFunc( material.depthFunc ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + state.setColorWrite( material.colorWrite ); + state.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.__webglShader.uniforms; + + if ( program.id !== _currentProgram ) { + + _gl.useProgram( program.program ); + _currentProgram = program.id; + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + p_uniforms.set( _gl, camera, 'projectionMatrix' ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + + if ( camera !== _currentCamera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + p_uniforms.set( _gl, _this, 'toneMappingExposure' ); + p_uniforms.set( _gl, _this, 'toneMappingWhitePoint' ); + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + if ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) { + + p_uniforms.set( _gl, skeleton, 'boneTexture' ); + p_uniforms.set( _gl, skeleton, 'boneTextureWidth' ); + p_uniforms.set( _gl, skeleton, 'boneTextureHeight' ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial || + material.isMeshLambertMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } + + // refresh single material specific uniforms + + if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + } else if ( material.isLineDashedMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + refreshUniformsDash( m_uniforms, material ); + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsPhong( m_uniforms, material ); + + } else if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsStandard( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + if ( material.displacementMap ) { + + m_uniforms.displacementMap.value = material.displacementMap; + m_uniforms.displacementScale.value = material.displacementScale; + m_uniforms.displacementBias.value = material.displacementBias; + + } + + } else if ( material.isMeshNormalMaterial ) { + + m_uniforms.opacity.value = material.opacity; + + } + + WebGLUniforms.upload( + _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + + // common matrices + + p_uniforms.set( _gl, object, 'modelViewMatrix' ); + p_uniforms.set( _gl, object, 'normalMatrix' ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value = material.color; + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + var offset = uvScaleMap.offset; + var repeat = uvScaleMap.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + var offset = material.map.offset; + var repeat = material.map.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + refreshUniformsStandard( uniforms, material ); + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Lighting + + function setupShadows( lights ) { + + var lightShadowsLength = 0; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + if ( light.castShadow ) { + + _lights.shadows[ lightShadowsLength ++ ] = light; + + } + + } + + _lights.shadows.length = lightShadowsLength; + + } + + function setupLights( lights, camera ) { + + var l, ll, light, + r = 0, g = 0, b = 0, + color, + intensity, + distance, + shadowMap, + + viewMatrix = camera.matrixWorldInverse, + + directionalLength = 0, + pointLength = 0, + spotLength = 0, + hemiLength = 0; + + for ( l = 0, ll = lights.length; l < ll; l ++ ) { + + light = lights[ l ]; + + color = light.color; + intensity = light.intensity; + distance = light.distance; + + shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + uniforms.shadowBias = light.shadow.bias; + uniforms.shadowRadius = light.shadow.radius; + uniforms.shadowMapSize = light.shadow.mapSize; + + } + + _lights.directionalShadowMap[ directionalLength ] = shadowMap; + _lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + _lights.directional[ directionalLength ++ ] = uniforms; + + } else if ( light.isSpotLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + uniforms.shadowBias = light.shadow.bias; + uniforms.shadowRadius = light.shadow.radius; + uniforms.shadowMapSize = light.shadow.mapSize; + + } + + _lights.spotShadowMap[ spotLength ] = shadowMap; + _lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + _lights.spot[ spotLength ++ ] = uniforms; + + } else if ( light.isPointLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + uniforms.shadowBias = light.shadow.bias; + uniforms.shadowRadius = light.shadow.radius; + uniforms.shadowMapSize = light.shadow.mapSize; + + } + + _lights.pointShadowMap[ pointLength ] = shadowMap; + + if ( _lights.pointShadowMatrix[ pointLength ] === undefined ) { + + _lights.pointShadowMatrix[ pointLength ] = new Matrix4(); + + } + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + _vector3.setFromMatrixPosition( light.matrixWorld ).negate(); + _lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 ); + + _lights.point[ pointLength ++ ] = uniforms; + + } else if ( light.isHemisphereLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + _lights.hemi[ hemiLength ++ ] = uniforms; + + } + + } + + _lights.ambient[ 0 ] = r; + _lights.ambient[ 1 ] = g; + _lights.ambient[ 2 ] = b; + + _lights.directional.length = directionalLength; + _lights.spot.length = spotLength; + _lights.point.length = pointLength; + _lights.hemi.length = hemiLength; + + _lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + hemiLength + ',' + _lights.shadows.length; + + } + + // GL state setting + + this.setFaceCulling = function ( cullFace, frontFaceDirection ) { + + state.setCullFace( cullFace ); + state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW ); + + }; + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function() { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function() { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function() { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + this.getCurrentRenderTarget = function() { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + var framebuffer; + + if ( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + if ( isCube ) { + + framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; + + } else { + + framebuffer = renderTargetProperties.__webglFramebuffer; + + } + + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + _currentViewport.copy( renderTarget.viewport ); + + } else { + + framebuffer = null; + + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + state.viewport( _currentViewport ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + // Map three.js constants to WebGL constants + + function paramThreeToGL( p ) { + + var extension; + + if ( p === RepeatWrapping ) return _gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return _gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return _gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return _gl.BYTE; + if ( p === ShortType ) return _gl.SHORT; + if ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT; + if ( p === IntType ) return _gl.INT; + if ( p === UnsignedIntType ) return _gl.UNSIGNED_INT; + if ( p === FloatType ) return _gl.FLOAT; + + if ( p === HalfFloatType ) { + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return _gl.ALPHA; + if ( p === RGBFormat ) return _gl.RGB; + if ( p === RGBAFormat ) return _gl.RGBA; + if ( p === LuminanceFormat ) return _gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return _gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL; + + if ( p === AddEquation ) return _gl.FUNC_ADD; + if ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return _gl.ZERO; + if ( p === OneFactor ) return _gl.ONE; + if ( p === SrcColorFactor ) return _gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return _gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return _gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === MinEquation || p === MaxEquation ) { + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2 ( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color.getHex(), this.density ); + + }; + + FogExp2.prototype.toJSON = function ( meta ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog ( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color.getHex(), this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( meta ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene () { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.create( Object3D.prototype ); + + Scene.prototype.constructor = Scene; + + Scene.prototype.copy = function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }; + + Scene.prototype.toJSON = function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlare( texture, size, distance, blending, color ) { + + Object3D.call( this ); + + this.lensFlares = []; + + this.positionScreen = new Vector3(); + this.customUpdateCallback = undefined; + + if ( texture !== undefined ) { + + this.add( texture, size, distance, blending, color ); + + } + + } + + LensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LensFlare, + + isLensFlare: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.positionScreen.copy( source.positionScreen ); + this.customUpdateCallback = source.customUpdateCallback; + + for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { + + this.lensFlares.push( source.lensFlares[ i ] ); + + } + + return this; + + }, + + add: function ( texture, size, distance, blending, color, opacity ) { + + if ( size === undefined ) size = - 1; + if ( distance === undefined ) distance = 0; + if ( opacity === undefined ) opacity = 1; + if ( color === undefined ) color = new Color( 0xffffff ); + if ( blending === undefined ) blending = NormalBlending; + + distance = Math.min( distance, Math.max( 0, distance ) ); + + this.lensFlares.push( { + texture: texture, // THREE.Texture + size: size, // size in pixels (-1 = use texture.width) + distance: distance, // distance (0-1) from light source (0=at light source) + x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back + scale: 1, // scale + rotation: 0, // rotation + opacity: opacity, // opacity + color: color, // color + blending: blending // blending + } ); + + }, + + /* + * Update lens flares update positions on all flares based on the screen position + * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. + */ + + updateLensFlares: function () { + + var f, fl = this.lensFlares.length; + var flare; + var vecX = - this.positionScreen.x * 2; + var vecY = - this.positionScreen.y * 2; + + for ( f = 0; f < fl; f ++ ) { + + flare = this.lensFlares[ f ]; + + flare.x = this.positionScreen.x + vecX * flare.distance; + flare.y = this.positionScreen.y + vecY * flare.distance; + + flare.wantedRotation = flare.x * Math.PI * 0.25; + flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2() + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition ); + var guessSizeSq = this.scale.x * this.scale.y / 4; + + if ( distanceSq > guessSizeSq ) { + + return; + + } + + intersects.push( { + + distance: Math.sqrt( distanceSq ), + point: this.position, + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses, useVertexTexture ) { + + this.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true; + + this.identityMatrix = new Matrix4(); + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + + // create a bone texture or an array of floats + + if ( this.useVertexTexture ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.nextPowerOfTwo( Math.ceil( size ) ); + size = Math.max( size, 4 ); + + this.boneTextureWidth = size; + this.boneTextureHeight = size; + + this.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel + this.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType ); + + } else { + + this.boneMatrices = new Float32Array( 16 * this.bones.length ); + + } + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton bonInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ b ] ) { + + inverse.getInverse( this.bones[ b ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone; + + // recover the bind-time world matrices + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ b ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + if ( (bone.parent && bone.parent.isBone) ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + + return function update() { + + // flatten bone matrices to array + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + // compute the offset between the current and the original transform + + var matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] ); + offsetMatrix.toArray( this.boneMatrices, b * 16 ); + + } + + if ( this.useVertexTexture ) { + + this.boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses, this.useVertexTexture ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone( skin ) { + + Object3D.call( this ); + + this.type = 'Bone'; + + this.skin = skin; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.skin = source.skin; + + return this; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material, useVertexTexture ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = "attached"; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + // init bones + + // TODO: remove bone creation as there is no reason (other than + // convenience) for THREE.SkinnedMesh to do this. + + var bones = []; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + var bone, gbone; + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + bone = new Bone( this ); + bones.push( bone ); + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + if ( gbone.parent !== - 1 && gbone.parent !== null && + bones[ gbone.parent ] !== undefined ) { + + bones[ gbone.parent ].add( bones[ b ] ); + + } else { + + this.add( bones[ b ] ); + + } + + } + + } + + this.normalizeSkinWeights(); + + this.updateMatrixWorld( true ); + this.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld ); + + } + + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + bind: function( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + if ( (this.geometry && this.geometry.isGeometry) ) { + + for ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + var scale = 1.0 / sw.lengthManhattan(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( (this.geometry && this.geometry.isBufferGeometry) ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( var i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + var scale = 1.0 / vec.lengthManhattan(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, true ); + + if ( this.bindMode === "attached" ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === "detached" ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function() { + + return new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new LineSegments( geometry, material ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = (this && this.isLineSegments) ? 2 : 1; + + if ( (geometry && geometry.isBufferGeometry) ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( (geometry && geometry.isGeometry) ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + var intersectPoint = ray.closestPointToPoint( point ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( (geometry && geometry.isBufferGeometry) ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + var scope = this; + + function update() { + + requestAnimationFrame( update ); + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + scope.needsUpdate = true; + + } + + } + + update(); + + } + + VideoTexture.prototype = Object.create( Texture.prototype ); + VideoTexture.prototype.constructor = VideoTexture; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ) + + } + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.type = type !== undefined ? type : UnsignedShortType; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + var edge = [ 0, 0 ], hash = {}; + + function sortFunction( a, b ) { + + return a - b; + + } + + var keys = [ 'a', 'b', 'c' ]; + + if ( (geometry && geometry.isGeometry) ) { + + var vertices = geometry.vertices; + var faces = geometry.faces; + var numEdges = 0; + + // allocate maximal size + var edges = new Uint32Array( 6 * faces.length ); + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + edges[ 2 * numEdges ] = edge[ 0 ]; + edges[ 2 * numEdges + 1 ] = edge[ 1 ]; + hash[ key ] = true; + numEdges ++; + + } + + } + + } + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numEdges; i < l; i ++ ) { + + for ( var j = 0; j < 2; j ++ ) { + + var vertex = vertices[ edges [ 2 * i + j ] ]; + + var index = 6 * i + 3 * j; + coords[ index + 0 ] = vertex.x; + coords[ index + 1 ] = vertex.y; + coords[ index + 2 ] = vertex.z; + + } + + } + + this.addAttribute( 'position', new BufferAttribute( coords, 3 ) ); + + } else if ( (geometry && geometry.isBufferGeometry) ) { + + if ( geometry.index !== null ) { + + // Indexed BufferGeometry + + var indices = geometry.index.array; + var vertices = geometry.attributes.position; + var groups = geometry.groups; + var numEdges = 0; + + if ( groups.length === 0 ) { + + geometry.addGroup( 0, indices.length ); + + } + + // allocate maximal size + var edges = new Uint32Array( 2 * indices.length ); + + for ( var o = 0, ol = groups.length; o < ol; ++ o ) { + + var group = groups[ o ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = indices[ i + j ]; + edge[ 1 ] = indices[ i + ( j + 1 ) % 3 ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + edges[ 2 * numEdges ] = edge[ 0 ]; + edges[ 2 * numEdges + 1 ] = edge[ 1 ]; + hash[ key ] = true; + numEdges ++; + + } + + } + + } + + } + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numEdges; i < l; i ++ ) { + + for ( var j = 0; j < 2; j ++ ) { + + var index = 6 * i + 3 * j; + var index2 = edges[ 2 * i + j ]; + + coords[ index + 0 ] = vertices.getX( index2 ); + coords[ index + 1 ] = vertices.getY( index2 ); + coords[ index + 2 ] = vertices.getZ( index2 ); + + } + + } + + this.addAttribute( 'position', new BufferAttribute( coords, 3 ) ); + + } else { + + // non-indexed BufferGeometry + + var vertices = geometry.attributes.position.array; + var numEdges = vertices.length / 3; + var numTris = numEdges / 3; + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numTris; i < l; i ++ ) { + + for ( var j = 0; j < 3; j ++ ) { + + var index = 18 * i + 6 * j; + + var index1 = 9 * i + 3 * j; + coords[ index + 0 ] = vertices[ index1 ]; + coords[ index + 1 ] = vertices[ index1 + 1 ]; + coords[ index + 2 ] = vertices[ index1 + 2 ]; + + var index2 = 9 * i + 3 * ( ( j + 1 ) % 3 ); + coords[ index + 3 ] = vertices[ index2 ]; + coords[ index + 4 ] = vertices[ index2 + 1 ]; + coords[ index + 5 ] = vertices[ index2 + 2 ]; + + } + + } + + this.addAttribute( 'position', new BufferAttribute( coords, 3 ) ); + + } + + } + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // generate vertices and uvs + + var vertices = []; + var uvs = []; + + var i, j, p; + var u, v; + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + u = j / slices; + + p = func( u, v ); + vertices.push( p.x, p.y, p.z ); + + uvs.push( u, v ); + + } + + } + + // generate indices + + var indices = []; + var a, b, c, d; + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + a = i * sliceCount + j; + b = i * sliceCount + j + 1; + c = ( i + 1 ) * sliceCount + j + 1; + d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) ); + this.addAttribute( 'position', Float32Attribute( vertices, 3 ) ); + this.addAttribute( 'uv', Float32Attribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', Float32Attribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', Float32Attribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', Float32Attribute( uvBuffer, 2 ) ); + this.normalizeNormals(); + + this.boundingSphere = new Sphere( new Vector3(), radius ); + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0 ; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( i = 0; i < cols ; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + */ + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function OctahedronBufferGeometry( radius,detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + */ + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + */ + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±1, ±1, ±1) + - 1, - 1, - 1, - 1, - 1, 1, + - 1, 1, - 1, - 1, 1, 1, + 1, - 1, - 1, 1, - 1, 1, + 1, 1, - 1, 1, 1, 1, + + // (0, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + */ + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + */ + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Creates a tube which extrudes along a 3d spline. + * + */ + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) ); + this.addAttribute( 'position', Float32Attribute( vertices, 3 ) ); + this.addAttribute( 'normal', Float32Attribute( normals, 3 ) ); + this.addAttribute( 'uv', Float32Attribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + var P = path.getPointAt( i / tubularSegments ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * + * Creates a tube which extrudes along a 3d spline. + */ + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * see: http://www.blackpawn.com/texts/pqtorus/ + */ + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 100; + tube = tube || 40; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // used to calculate buffer length + var vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) ); + var indexCount = radialSegments * tubularSegments * 2 * 3; + + // buffers + var indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 ); + var vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + // helper variables + var i, j, index = 0, indexOffset = 0; + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var N = new Vector3(); + + // generate vertices, normals and uvs + + for ( i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + // vertex + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + normal.subVectors( vertex, P1 ).normalize(); + normals.setXYZ( index, normal.x, normal.y, normal.z ); + + // uv + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index ++; + + } + + } + + // generate indices + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + // indices + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // face one + indices.setX( indexOffset, a ); indexOffset++; + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + // face two + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, c ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', vertices ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + */ + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // used to calculate buffer length + var vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) ); + var indexCount = radialSegments * tubularSegments * 2 * 3; + + // buffers + var indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ); + var vertices = new Float32Array( vertexCount * 3 ); + var normals = new Float32Array( vertexCount * 3 ); + var uvs = new Float32Array( vertexCount * 2 ); + + // offset variables + var vertexBufferOffset = 0; + var uvBufferOffset = 0; + var indexBufferOffset = 0; + + // helper variables + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + // vertex + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices[ vertexBufferOffset ] = vertex.x; + vertices[ vertexBufferOffset + 1 ] = vertex.y; + vertices[ vertexBufferOffset + 2 ] = vertex.z; + + // this vector is used to calculate the normal + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + + // normal + normal.subVectors( vertex, center ).normalize(); + + normals[ vertexBufferOffset ] = normal.x; + normals[ vertexBufferOffset + 1 ] = normal.y; + normals[ vertexBufferOffset + 2 ] = normal.z; + + // uv + uvs[ uvBufferOffset ] = i / tubularSegments; + uvs[ uvBufferOffset + 1 ] = j / radialSegments; + + // update offsets + vertexBufferOffset += 3; + uvBufferOffset += 2; + + } + + } + + // generate indices + + for ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + // face one + indices[ indexBufferOffset ] = a; + indices[ indexBufferOffset + 1 ] = b; + indices[ indexBufferOffset + 2 ] = d; + + // face two + indices[ indexBufferOffset + 3 ] = b; + indices[ indexBufferOffset + 4 ] = c; + indices[ indexBufferOffset + 5 ] = d; + + // update offset + indexBufferOffset += 6; + + } + + } + + // build geometry + this.setIndex( new BufferAttribute( indices, 1 ) ); + this.addAttribute( 'position', new BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888 + */ + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + triangulate: ( function () { + + /** + * This code is a quick port of code written in C++ which was submitted to + * flipcode.com by John W. Ratcliff // July 22, 2000 + * See original code and more information here: + * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml + * + * ported to actionscript by Zevan Rosser + * www.actionsnippet.com + * + * ported to javascript by Joshua Koo + * http://www.lab4games.net/zz85/blog + * + */ + + function snip( contour, u, v, w, n, verts ) { + + var p; + var ax, ay, bx, by; + var cx, cy, px, py; + + ax = contour[ verts[ u ] ].x; + ay = contour[ verts[ u ] ].y; + + bx = contour[ verts[ v ] ].x; + by = contour[ verts[ v ] ].y; + + cx = contour[ verts[ w ] ].x; + cy = contour[ verts[ w ] ].y; + + if ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false; + + var aX, aY, bX, bY, cX, cY; + var apx, apy, bpx, bpy, cpx, cpy; + var cCROSSap, bCROSScp, aCROSSbp; + + aX = cx - bx; aY = cy - by; + bX = ax - cx; bY = ay - cy; + cX = bx - ax; cY = by - ay; + + for ( p = 0; p < n; p ++ ) { + + px = contour[ verts[ p ] ].x; + py = contour[ verts[ p ] ].y; + + if ( ( ( px === ax ) && ( py === ay ) ) || + ( ( px === bx ) && ( py === by ) ) || + ( ( px === cx ) && ( py === cy ) ) ) continue; + + apx = px - ax; apy = py - ay; + bpx = px - bx; bpy = py - by; + cpx = px - cx; cpy = py - cy; + + // see if p is inside triangle abc + + aCROSSbp = aX * bpy - aY * bpx; + cCROSSap = cX * apy - cY * apx; + bCROSScp = bX * cpy - bY * cpx; + + if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; + + } + + return true; + + } + + // takes in an contour array and returns + + return function triangulate( contour, indices ) { + + var n = contour.length; + + if ( n < 3 ) return null; + + var result = [], + verts = [], + vertIndices = []; + + /* we want a counter-clockwise polygon in verts */ + + var u, v, w; + + if ( ShapeUtils.area( contour ) > 0.0 ) { + + for ( v = 0; v < n; v ++ ) verts[ v ] = v; + + } else { + + for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; + + } + + var nv = n; + + /* remove nv - 2 vertices, creating 1 triangle every time */ + + var count = 2 * nv; /* error detection */ + + for ( v = nv - 1; nv > 2; ) { + + /* if we loop, it is probably a non-simple polygon */ + + if ( ( count -- ) <= 0 ) { + + //** Triangulate: ERROR - probable bad polygon! + + //throw ( "Warning, unable to triangulate polygon!" ); + //return null; + // Sometimes warning is fine, especially polygons are triangulated in reverse. + console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); + + if ( indices ) return vertIndices; + return result; + + } + + /* three consecutive vertices in current polygon, */ + + u = v; if ( nv <= u ) u = 0; /* previous */ + v = u + 1; if ( nv <= v ) v = 0; /* new v */ + w = v + 1; if ( nv <= w ) w = 0; /* next */ + + if ( snip( contour, u, v, w, nv, verts ) ) { + + var a, b, c, s, t; + + /* true names of the vertices */ + + a = verts[ u ]; + b = verts[ v ]; + c = verts[ w ]; + + /* output Triangle */ + + result.push( [ contour[ a ], + contour[ b ], + contour[ c ] ] ); + + + vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); + + /* remove v from the remaining polygon */ + + for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { + + verts[ s ] = verts[ t ]; + + } + + nv --; + + /* reset error detection counter */ + + count = 2 * nv; + + } + + } + + if ( indices ) return vertIndices; + return result; + + } + + } )(), + + triangulateShape: function ( contour, holes ) { + + function removeDupEndPts(points) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + removeDupEndPts( contour ); + holes.forEach( removeDupEndPts ); + + function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { + + // inOtherPt needs to be collinear to the inSegment + if ( inSegPt1.x !== inSegPt2.x ) { + + if ( inSegPt1.x < inSegPt2.x ) { + + return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); + + } else { + + return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); + + } + + } else { + + if ( inSegPt1.y < inSegPt2.y ) { + + return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); + + } else { + + return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); + + } + + } + + } + + function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { + + var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; + var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; + + var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; + var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; + + var limit = seg1dy * seg2dx - seg1dx * seg2dy; + var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; + + if ( Math.abs( limit ) > Number.EPSILON ) { + + // not parallel + + var perpSeg2; + if ( limit > 0 ) { + + if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; + + } else { + + if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; + + } + + // i.e. to reduce rounding errors + // intersection at endpoint of segment#1? + if ( perpSeg2 === 0 ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt1 ]; + + } + if ( perpSeg2 === limit ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt2 ]; + + } + // intersection at endpoint of segment#2? + if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; + if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; + + // return real intersection point + var factorSeg1 = perpSeg2 / limit; + return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, + y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; + + } else { + + // parallel or collinear + if ( ( perpSeg1 !== 0 ) || + ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; + + // they are collinear or degenerate + var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? + var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? + // both segments are points + if ( seg1Pt && seg2Pt ) { + + if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || + ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points + return [ inSeg1Pt1 ]; // they are the same point + + } + // segment#1 is a single point + if ( seg1Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 + return [ inSeg1Pt1 ]; + + } + // segment#2 is a single point + if ( seg2Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 + return [ inSeg2Pt1 ]; + + } + + // they are collinear segments, which might overlap + var seg1min, seg1max, seg1minVal, seg1maxVal; + var seg2min, seg2max, seg2minVal, seg2maxVal; + if ( seg1dx !== 0 ) { + + // the segments are NOT on a vertical line + if ( inSeg1Pt1.x < inSeg1Pt2.x ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; + + } + if ( inSeg2Pt1.x < inSeg2Pt2.x ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; + + } + + } else { + + // the segments are on a vertical line + if ( inSeg1Pt1.y < inSeg1Pt2.y ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; + + } + if ( inSeg2Pt1.y < inSeg2Pt2.y ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; + + } + + } + if ( seg1minVal <= seg2minVal ) { + + if ( seg1maxVal < seg2minVal ) return []; + if ( seg1maxVal === seg2minVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg2min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; + return [ seg2min, seg2max ]; + + } else { + + if ( seg1minVal > seg2maxVal ) return []; + if ( seg1minVal === seg2maxVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg1min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; + return [ seg1min, seg2max ]; + + } + + } + + } + + function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { + + // The order of legs is important + + // translation of all points, so that Vertex is at (0,0) + var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; + var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; + var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; + + // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. + var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; + var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; + + if ( Math.abs( from2toAngle ) > Number.EPSILON ) { + + // angle != 180 deg. + + var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; + // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); + + if ( from2toAngle > 0 ) { + + // main angle < 180 deg. + return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); + + } else { + + // main angle > 180 deg. + return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); + + } + + } else { + + // angle == 180 deg. + // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); + return ( from2otherAngle > 0 ); + + } + + } + + + function removeHoles( contour, holes ) { + + var shape = contour.concat(); // work on this shape + var hole; + + function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { + + // Check if hole point lies within angle around shape point + var lastShapeIdx = shape.length - 1; + + var prevShapeIdx = inShapeIdx - 1; + if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; + + var nextShapeIdx = inShapeIdx + 1; + if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; + + var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); + return false; + + } + + // Check if shape point lies within angle around hole point + var lastHoleIdx = hole.length - 1; + + var prevHoleIdx = inHoleIdx - 1; + if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; + + var nextHoleIdx = inHoleIdx + 1; + if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; + + insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); + return false; + + } + + return true; + + } + + function intersectsShapeEdge( inShapePt, inHolePt ) { + + // checks for intersections with shape edges + var sIdx, nextIdx, intersection; + for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { + + nextIdx = sIdx + 1; nextIdx %= shape.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + return false; + + } + + var indepHoles = []; + + function intersectsHoleEdge( inShapePt, inHolePt ) { + + // checks for intersections with hole edges + var ihIdx, chkHole, + hIdx, nextIdx, intersection; + for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { + + chkHole = holes[ indepHoles[ ihIdx ]]; + for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { + + nextIdx = hIdx + 1; nextIdx %= chkHole.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + } + return false; + + } + + var holeIndex, shapeIndex, + shapePt, holePt, + holeIdx, cutKey, failedCuts = [], + tmpShape1, tmpShape2, + tmpHole1, tmpHole2; + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + indepHoles.push( h ); + + } + + var minShapeIndex = 0; + var counter = indepHoles.length * 2; + while ( indepHoles.length > 0 ) { + + counter --; + if ( counter < 0 ) { + + console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); + break; + + } + + // search for shape-vertex and hole-vertex, + // which can be connected without intersections + for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { + + shapePt = shape[ shapeIndex ]; + holeIndex = - 1; + + // search for hole which can be reached without intersections + for ( var h = 0; h < indepHoles.length; h ++ ) { + + holeIdx = indepHoles[ h ]; + + // prevent multiple checks + cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; + if ( failedCuts[ cutKey ] !== undefined ) continue; + + hole = holes[ holeIdx ]; + for ( var h2 = 0; h2 < hole.length; h2 ++ ) { + + holePt = hole[ h2 ]; + if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; + if ( intersectsShapeEdge( shapePt, holePt ) ) continue; + if ( intersectsHoleEdge( shapePt, holePt ) ) continue; + + holeIndex = h2; + indepHoles.splice( h, 1 ); + + tmpShape1 = shape.slice( 0, shapeIndex + 1 ); + tmpShape2 = shape.slice( shapeIndex ); + tmpHole1 = hole.slice( holeIndex ); + tmpHole2 = hole.slice( 0, holeIndex + 1 ); + + shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); + + minShapeIndex = shapeIndex; + + // Debug only, to show the selected cuts + // glob_CutLines.push( [ shapePt, holePt ] ); + + break; + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + failedCuts[ cutKey ] = true; // remember failure + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + } + + } + + return shape; /* shape with no holes */ + + } + + + var i, il, f, face, + key, index, + allPointsMap = {}; + + // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. + + var allpoints = contour.concat(); + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + Array.prototype.push.apply( allpoints, holes[ h ] ); + + } + + //console.log( "allpoints",allpoints, allpoints.length ); + + // prepare all points map + + for ( i = 0, il = allpoints.length; i < il; i ++ ) { + + key = allpoints[ i ].x + ":" + allpoints[ i ].y; + + if ( allPointsMap[ key ] !== undefined ) { + + console.warn( "THREE.ShapeUtils: Duplicate point", key, i ); + + } + + allPointsMap[ key ] = i; + + } + + // remove holes by cutting paths to holes and adding them to the shape + var shapeWithoutHoles = removeHoles( contour, holes ); + + var triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape + //console.log( "triangles",triangles, triangles.length ); + + // check all face vertices against all points map + + for ( i = 0, il = triangles.length; i < il; i ++ ) { + + face = triangles[ i ]; + + for ( f = 0; f < 3; f ++ ) { + + key = face[ f ].x + ":" + face[ f ].y; + + index = allPointsMap[ key ]; + + if ( index !== undefined ) { + + face[ f ] = index; + + } + + } + + } + + return triangles.concat(); + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + }, + + // Bezier Curves formulas obtained from + // http://en.wikipedia.org/wiki/B%C3%A9zier_curve + + // Quad Bezier Functions + + b2: ( function () { + + function b2p0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function b2p1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function b2p2( t, p ) { + + return t * t * p; + + } + + return function b2( t, p0, p1, p2 ) { + + return b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 ); + + }; + + } )(), + + // Cubic Bezier Functions + + b3: ( function () { + + function b3p0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function b3p1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function b3p2( t, p ) { + + var k = 1 - t; + return 3 * k * t * t * p; + + } + + function b3p3( t, p ) { + + return t * t * t * p; + + } + + return function b3( t, p0, p1, p2, p3 ) { + + return b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 ); + + }; + + } )() + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined) + * frames: // containing arrays of tangents, normals, binormals + * + * uvGenerator: // object that provides UV generator functions + * + * } + **/ + + function ExtrudeGeometry( shapes, options ) { + + if ( typeof( shapes ) === "undefined" ) { + + shapes = []; + return; + + } + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeFaceNormals(); + + // can't really use automatic vertex normals + // as then front and back sides get smoothed too + // should do separate smoothing just for sides + + //this.computeVertexNormals(); + + //console.log( "took", ( Date.now() - startTime ) ); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + ExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) { + + var sl = shapes.length; + + for ( var s = 0; s < sl; s ++ ) { + + var shape = shapes[ s ]; + this.addShape( shape, options ); + + } + + }; + + ExtrudeGeometry.prototype.addShape = function ( shape, options ) { + + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var steps = options.steps !== undefined ? options.steps : 1; + + var extrudePath = options.extrudePath; + var extrudePts, extrudeByPath = false; + + // Use default WorldUVGenerator if no UV generators are specified. + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator; + + var splineTube, binormal, normal, position2; + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + var scope = this; + + var shapesOffset = this.vertices.length; + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos ( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d, contour, s, sl, j, k ); + + } + + } + + } + + + function v( x, y, z ) { + + scope.vertices.push( new Vector3( x, y, z ) ); + + } + + function f3( a, b, c ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + + scope.faces.push( new Face3( a, b, c, null, null, 0 ) ); + + var uvs = uvgen.generateTopUV( scope, a, b, c ); + + scope.faceVertexUvs[ 0 ].push( uvs ); + + } + + function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + d += shapesOffset; + + scope.faces.push( new Face3( a, b, d, null, null, 1 ) ); + scope.faces.push( new Face3( b, c, d, null, null, 1 ) ); + + var uvs = uvgen.generateSideWallUV( scope, a, b, c, d ); + + scope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] ); + scope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] ); + + } + + }; + + ExtrudeGeometry.WorldUVGenerator = { + + generateTopUV: function ( geometry, indexA, indexB, indexC ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + + return [ + new Vector2( a.x, a.y ), + new Vector2( b.x, b.y ), + new Vector2( c.x, c.y ) + ]; + + }, + + generateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + var d = vertices[ indexD ]; + + if ( Math.abs( a.y - b.y ) < 0.01 ) { + + return [ + new Vector2( a.x, 1 - a.z ), + new Vector2( b.x, 1 - b.z ), + new Vector2( c.x, 1 - c.z ), + new Vector2( d.x, 1 - d.z ) + ]; + + } else { + + return [ + new Vector2( a.y, 1 - a.z ), + new Vector2( b.y, 1 - b.z ), + new Vector2( c.y, 1 - c.z ), + new Vector2( d.y, 1 - d.z ) + ]; + + } + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: // how far from text outline is bevel + * } + */ + + function TextGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( (font && font.isFont) === false ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments ); + + // translate parameters to ExtrudeGeometry API + + parameters.amount = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeGeometry.call( this, shapes, parameters ); + + this.type = 'TextGeometry'; + + } + + TextGeometry.prototype = Object.create( ExtrudeGeometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * based on THREE.SphereGeometry + */ + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) ); + + var positions = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + var index = 0, vertices = [], normal = new Vector3(); + + for ( var y = 0; y <= heightSegments; y ++ ) { + + var verticesRow = []; + + var v = y / heightSegments; + + for ( var x = 0; x <= widthSegments; x ++ ) { + + var u = x / widthSegments; + + var px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + var py = radius * Math.cos( thetaStart + v * thetaLength ); + var pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + normal.set( px, py, pz ).normalize(); + + positions.setXYZ( index, px, py, pz ); + normals.setXYZ( index, normal.x, normal.y, normal.z ); + uvs.setXY( index, u, 1 - v ); + + verticesRow.push( index ); + + index ++; + + } + + vertices.push( verticesRow ); + + } + + var indices = []; + + for ( var y = 0; y < heightSegments; y ++ ) { + + for ( var x = 0; x < widthSegments; x ++ ) { + + var v1 = vertices[ y ][ x + 1 ]; + var v2 = vertices[ y ][ x ]; + var v3 = vertices[ y + 1 ][ x ]; + var v4 = vertices[ y + 1 ][ x + 1 ]; + + if ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 ); + if ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 ); + + } + + } + + this.setIndex( new ( positions.count > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) ); + this.addAttribute( 'position', positions ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + this.boundingSphere = new Sphere( new Vector3(), radius ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 20; + outerRadius = outerRadius || 50; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // these are used to calculate buffer length + var vertexCount = ( thetaSegments + 1 ) * ( phiSegments + 1 ); + var indexCount = thetaSegments * phiSegments * 2 * 3; + + // buffers + var indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 ); + var vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + // some helper variables + var index = 0, indexOffset = 0, segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + // values are generate from the inside of the ring to the outside + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // normal + normals.setXYZ( index, 0, 0, 1 ); + + // uv + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index++; + + } + + // increase the radius for next row of vertices + radius += radiusStep; + + } + + // generate indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + // indices + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // face one + indices.setX( indexOffset, a ); indexOffset++; + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, c ); indexOffset++; + + // face two + indices.setX( indexOffset, a ); indexOffset++; + indices.setX( indexOffset, c ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', vertices ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author Kaleb Murphy + */ + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + // points - to create a closed torus, one must use a set of points + // like so: [ a, b, c, d, a ], see first is the same as last. + // segments - the number of circumference segments to create + // phiStart - the starting radian + // phiLength - the radian (0 to 2PI) range of the lathed section + // 2PI is a closed lathe, less than 2PI is a portion. + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + // these are used to calculate buffer length + var vertexCount = ( segments + 1 ) * points.length; + var indexCount = segments * points.length * 2 * 3; + + // buffers + var indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 ); + var vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + // helper variables + var index = 0, indexOffset = 0, base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // uv + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index ++; + + } + + } + + // generate indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + // indices + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // face one + indices.setX( indexOffset, a ); indexOffset++; + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + // face two + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, c ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', vertices ); + this.addAttribute( 'uv', uvs ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + base = segments * points.length * 3; + + for( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } // next row + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + */ + + // points - to create a closed torus, one must use a set of points + // like so: [ a, b, c, d, a ], see first is the same as last. + // segments - the number of circumference segments to create + // phiStart - the starting radian + // phiLength - the radian (0 to 2PI) range of the lathed section + // 2PI is a closed lathe, less than 2PI is a portion. + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + * + * Creates a one-sided polygonal geometry from a path shape. Similar to + * ExtrudeGeometry. + * + * parameters = { + * + * curveSegments: , // number of points on the curves. NOT USED AT THE MOMENT. + * + * material: // material index for front and back faces + * uvGenerator: // object that provides UV generator functions + * + * } + **/ + + function ShapeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( Array.isArray( shapes ) === false ) shapes = [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeFaceNormals(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + /** + * Add an array of shapes to THREE.ShapeGeometry. + */ + ShapeGeometry.prototype.addShapeList = function ( shapes, options ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + this.addShape( shapes[ i ], options ); + + } + + return this; + + }; + + /** + * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry. + */ + ShapeGeometry.prototype.addShape = function ( shape, options ) { + + if ( options === undefined ) options = {}; + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var material = options.material; + var uvgen = options.UVGenerator === undefined ? ExtrudeGeometry.WorldUVGenerator : options.UVGenerator; + + // + + var i, l, hole; + + var shapesOffset = this.vertices.length; + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe... + + for ( i = 0, l = holes.length; i < l; i ++ ) { + + hole = holes[ i ]; + + if ( ShapeUtils.isClockWise( hole ) ) { + + holes[ i ] = hole.reverse(); + + } + + } + + reverse = false; + + } + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + // Vertices + + for ( i = 0, l = holes.length; i < l; i ++ ) { + + hole = holes[ i ]; + vertices = vertices.concat( hole ); + + } + + // + + var vert, vlen = vertices.length; + var face, flen = faces.length; + + for ( i = 0; i < vlen; i ++ ) { + + vert = vertices[ i ]; + + this.vertices.push( new Vector3( vert.x, vert.y, 0 ) ); + + } + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + + var a = face[ 0 ] + shapesOffset; + var b = face[ 1 ] + shapesOffset; + var c = face[ 2 ] + shapesOffset; + + this.faces.push( new Face3( a, b, c, null, null, material ) ); + this.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) ); + + } + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + + var edge = [ 0, 0 ], hash = {}; + + function sortFunction( a, b ) { + + return a - b; + + } + + var keys = [ 'a', 'b', 'c' ]; + + var geometry2; + + if ( (geometry && geometry.isBufferGeometry) ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var vertices = geometry2.vertices; + var faces = geometry2.faces; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + hash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + hash[ key ].face2 = i; + + } + + } + + } + + var coords = []; + + for ( var key in hash ) { + + var h = hash[ key ]; + + if ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) { + + var vertex = vertices[ h.vert1 ]; + coords.push( vertex.x ); + coords.push( vertex.y ); + coords.push( vertex.z ); + + vertex = vertices[ h.vert2 ]; + coords.push( vertex.x ); + coords.push( vertex.y ); + coords.push( vertex.z ); + + } + + } + + this.addAttribute( 'position', new BufferAttribute( new Float32Array( coords ), 3 ) ); + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 20; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; + height = height !== undefined ? height : 100; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI; + + // used to calculate buffer length + + var nbCap = 0; + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) nbCap ++; + if ( radiusBottom > 0 ) nbCap ++; + + } + + var vertexCount = calculateVertexCount(); + var indexCount = calculateIndexCount(); + + // buffers + + var indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ), 1 ); + var vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + // helper variables + + var index = 0, + indexOffset = 0, + indexArray = [], + halfHeight = height / 2; + + // group variables + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', vertices ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + // helper functions + + function calculateVertexCount() { + + var count = ( radialSegments + 1 ) * ( heightSegments + 1 ); + + if ( openEnded === false ) { + + count += ( ( radialSegments + 1 ) * nbCap ) + ( radialSegments * nbCap ); + + } + + return count; + + } + + function calculateIndexCount() { + + var count = radialSegments * heightSegments * 2 * 3; + + if ( openEnded === false ) { + + count += radialSegments * nbCap * 3; + + } + + return count; + + } + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var cosTheta = Math.cos( theta ); + + // vertex + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // normal + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.setXYZ( index, normal.x, normal.y, normal.z ); + + // uv + uvs.setXY( index, u, 1 - v ); + + // save index of vertex in respective row + indexRow.push( index ); + + // increase index + index ++; + + } + + // now save vertices of the row in our index array + indexArray.push( indexRow ); + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + for ( y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + var i1 = indexArray[ y ][ x ]; + var i2 = indexArray[ y + 1 ][ x ]; + var i3 = indexArray[ y + 1 ][ x + 1 ]; + var i4 = indexArray[ y ][ x + 1 ]; + + // face one + indices.setX( indexOffset, i1 ); indexOffset ++; + indices.setX( indexOffset, i2 ); indexOffset ++; + indices.setX( indexOffset, i4 ); indexOffset ++; + + // face two + indices.setX( indexOffset, i2 ); indexOffset ++; + indices.setX( indexOffset, i3 ); indexOffset ++; + indices.setX( indexOffset, i4 ); indexOffset ++; + + // update counters + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + groupStart += groupCount; + + } + + function generateCap( top ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( x = 1; x <= radialSegments; x ++ ) { + + // vertex + vertices.setXYZ( index, 0, halfHeight * sign, 0 ); + + // normal + normals.setXYZ( index, 0, sign, 0 ); + + // uv + uv.x = 0.5; + uv.y = 0.5; + + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index ++; + + } + + // save the index of the last center vertex + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var sinTheta = Math.sin( theta ); + + // vertex + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // normal + normals.setXYZ( index, 0, sign, 0 ); + + // uv + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index ++; + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + var c = centerIndexStart + x; + var i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + indices.setX( indexOffset, i ); indexOffset ++; + indices.setX( indexOffset, i + 1 ); indexOffset ++; + indices.setX( indexOffset, c ); indexOffset ++; + + } else { + + // face bottom + indices.setX( indexOffset, i + 1 ); indexOffset ++; + indices.setX( indexOffset, i ); indexOffset ++; + indices.setX( indexOffset, c ); indexOffset ++; + + } + + // update counters + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + groupStart += groupCount; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + /** + * @author: abelnation / http://github.com/abelnation + */ + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + var vertices = segments + 2; + + var positions = new Float32Array( vertices * 3 ); + var normals = new Float32Array( vertices * 3 ); + var uvs = new Float32Array( vertices * 2 ); + + // center data is already zero, but need to set a few extras + normals[ 2 ] = 1.0; + uvs[ 0 ] = 0.5; + uvs[ 1 ] = 0.5; + + for ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) { + + var segment = thetaStart + s / segments * thetaLength; + + positions[ i ] = radius * Math.cos( segment ); + positions[ i + 1 ] = radius * Math.sin( segment ); + + normals[ i + 2 ] = 1; // normal z + + uvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2; + uvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2; + + } + + var indices = []; + + for ( var i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + this.setIndex( new BufferAttribute( new Uint16Array( indices ), 1 ) ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) ); + + this.boundingSphere = new Sphere( new Vector3(), radius ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + /** + * @author hughes + */ + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as + */ + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + + + var Geometries = Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + SphereBufferGeometry: SphereBufferGeometry, + SphereGeometry: SphereGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + PlaneGeometry: PlaneGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ExtrudeGeometry: ExtrudeGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleBufferGeometry: CircleBufferGeometry, + CircleGeometry: CircleGeometry, + BoxBufferGeometry: BoxBufferGeometry, + BoxGeometry: BoxGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ShadowMaterial() { + + ShaderMaterial.call( this, { + uniforms: UniformsUtils.merge( [ + UniformsLib[ "lights" ], + { + opacity: { value: 1.0 } + } + ] ), + vertexShader: ShaderChunk[ 'shadow_vert' ], + fragmentShader: ShaderChunk[ 'shadow_frag' ] + } ); + + this.lights = true; + this.transparent = true; + + Object.defineProperties( this, { + opacity: { + enumerable: true, + get: function () { + return this.uniforms.opacity.value; + }, + set: function ( value ) { + this.uniforms.opacity.value = value; + } + } + } ); + + } + + ShadowMaterial.prototype = Object.create( ShaderMaterial.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MultiMaterial( materials ) { + + this.uuid = _Math.generateUUID(); + + this.type = 'MultiMaterial'; + + this.materials = materials instanceof Array ? materials : []; + + this.visible = true; + + } + + MultiMaterial.prototype = { + + constructor: MultiMaterial, + + isMultiMaterial: true, + + toJSON: function ( meta ) { + + var output = { + metadata: { + version: 4.2, + type: 'material', + generator: 'MaterialExporter' + }, + uuid: this.uuid, + type: this.type, + materials: [] + }; + + var materials = this.materials; + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + var material = materials[ i ].toJSON( meta ); + delete material.metadata; + + output.materials.push( material ); + + } + + output.visible = this.visible; + + return output; + + }, + + clone: function () { + + var material = new this.constructor(); + + for ( var i = 0; i < this.materials.length; i ++ ) { + + material.materials.push( this.materials[ i ].clone() ); + + } + + material.visible = this.visible; + + return material; + + } + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * opacity: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this, parameters ); + + this.type = 'MeshNormalMaterial'; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + this.morphTargets = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + + function LineDashedMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineDashedMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( Material.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MultiMaterial: MultiMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshBasicMaterial: MeshBasicMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false, itemsLoaded = 0, itemsTotal = 0; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function XHRLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( XHRLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[1]; + var isBase64 = !!dataUriRegexResult[2]; + var data = dataUriRegexResult[3]; + + data = window.decodeURIComponent(data); + + if( isBase64 ) { + data = window.atob(data); + } + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + response = new ArrayBuffer( data.length ); + var view = new Uint8Array( response ); + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ response ], { "type" : mimeType } ); + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick + window.setTimeout( function() { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0); + + } catch ( error ) { + + // Wait for next browser tick + window.setTimeout( function() { + + if ( onError ) onError( error ); + + scope.manager.itemError( url ); + + }, 0); + + } + + } else { + + var request = new XMLHttpRequest(); + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = event.target.response; + + Cache.add( url, response ); + + if ( this.status === 200 ) { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else if ( this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + console.warn( 'THREE.XHRLoader: HTTP Status 0 received.' ); + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + } + + }, false ); + + if ( onProgress !== undefined ) { + + request.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' ); + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new XHRLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + var DataTextureLoader = BinaryTextureLoader; + function BinaryTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( BinaryTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new XHRLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + image.onload = function () { + + image.onload = null; + + URL.revokeObjectURL( image.src ); + + if ( onLoad ) onLoad( image ); + + scope.manager.itemEnd( url ); + + }; + image.onerror = onError; + + if ( url.indexOf( 'data:' ) === 0 ) { + + image.src = url; + + } else { + + var loader = new XHRLoader(); + loader.setPath( this.path ); + loader.setResponseType( 'blob' ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( blob ) { + + image.src = URL.createObjectURL( blob ); + + }, onProgress, onError ); + + } + + scope.manager.itemStart( url ); + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new Texture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setWithCredentials( this.withCredentials ); + loader.setPath( this.path ); + loader.load( url, function ( image ) { + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.image = image; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || 500; + + var camera = this.camera; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * Math.PI; + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / Math.PI; + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / ( 4 * Math.PI ); + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( light ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true, + + } ); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + return new array.constructor( array.subarray( from, to ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Interpolant.prototype = { + + constructor: Interpolant, + + evaluate: function( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ;) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ;) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function() { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function( i1, t0, t, t1 ) { + + throw new Error( "call to abstract method" ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + // empty + + } + + }; + + Object.assign( Interpolant.prototype, { + + beforeStart_: //( 0, t, t0 ), returns this.resultBuffer + Interpolant.prototype.copySampleValue_, + + afterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer + Interpolant.prototype.copySampleValue_ + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = -0; + this._offsetPrev = -0; + this._weightNext = -0; + this._offsetNext = -0; + + } + + CubicInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1; + var s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + var KeyframeTrackPrototype; + + KeyframeTrackPrototype = { + + TimeBufferType: Float32Array, + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function( result ) { + + return new DiscreteInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function( result ) { + + return new LinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function( result ) { + + return new CubicInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( message ); + return; + + } + + this.createInterpolant = factoryMethod; + + }, + + getInterpolation: function() { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function() { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function( timeOffset ) { + + if( timeOffset !== 0.0 ) { + + var times = this.times; + + for( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function( timeScale ) { + + if( timeScale !== 1.0 ) { + + var times = this.times; + + for( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) ++ from; + while ( to !== -1 && times[ to ] > endTime ) -- to; + + ++ to; // inclusive -> exclusive bound + + if( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to , 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils. + arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function() { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( "invalid value size in track", this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if( nKeys === 0 ) { + + console.error( "track is empty", this ); + valid = false; + + } + + var prevTime = null; + + for( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( "time is not a valid number", this, i, currTime ); + valid = false; + break; + + } + + if( prevTime !== null && prevTime > currTime ) { + + console.error( "out of order keys", this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( "value is not a valid number", this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function() { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else keep = true; + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + }; + + function KeyframeTrackConstructor( name, times, values, interpolation ) { + + if( name === undefined ) throw new Error( "track name is undefined" ); + + if( times === undefined || times.length === 0 ) { + + throw new Error( "no keyframes in track named " + name ); + + } + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + this.validate(); + this.optimize(); + + } + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, + values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function( result ) { + + return new QuaternionLinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number', + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrackConstructor.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.apply( this, arguments ); + + } + + KeyframeTrack.prototype = KeyframeTrackPrototype; + KeyframeTrackPrototype.constructor = KeyframeTrack; + + // Static methods: + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + parse: function( json ) { + + if( json.type === undefined ) { + + throw new Error( "track type undefined, can not parse" ); + + } + + var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we asssume a constructor compatible with the base + return new trackType( + json.name, json.times, json.values, json.interpolation ); + + } + + }, + + toJSON: function( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + }, + + _getTrackTypeForValueTypeName: function( typeName ) { + + switch( typeName.toLowerCase() ) { + + case "scalar": + case "double": + case "float": + case "number": + case "integer": + + return NumberKeyframeTrack; + + case "vector": + case "vector2": + case "vector3": + case "vector4": + + return VectorKeyframeTrack; + + case "color": + + return ColorKeyframeTrack; + + case "quaternion": + + return QuaternionKeyframeTrack; + + case "bool": + case "boolean": + + return BooleanKeyframeTrack; + + case "string": + + return StringKeyframeTrack; + + } + + throw new Error( "Unsupported typeName: " + typeName ); + + } + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : -1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + this.optimize(); + + } + + AnimationClip.prototype = { + + constructor: AnimationClip, + + resetDuration: function() { + + var tracks = this.tracks, + duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( + duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + }, + + trim: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + }; + + // Static methods: + + Object.assign( AnimationClip, { + + parse: function( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + + toJSON: function( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + + CreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + } + + return new AnimationClip( name, -1, tracks ); + + }, + + findByName: function( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function( animation, bones ) { + + if ( ! animation ) { + + console.error( " no animation in JSONLoader data" ); + return null; + + } + + var addNonemptyTrack = function( + trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( + animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || -1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets in a way exactly compatible + // with AnimationHandler.init( animation ) + if ( animationKeys[0].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[k].morphTargets ) { + + for ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[k].morphTargets[m] ] = -1; + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; + m !== animationKeys[k].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[k]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( + '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new XHRLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.shading !== undefined ) material.shading = json.shading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + // MultiMaterial + + if ( json.materials !== undefined ) { + + for ( var i = 0, l = json.materials.length; i < l; i ++ ) { + + material.materials.push( this.parse( json.materials[ i ] ) ); + + } + + } + + return material; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new XHRLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + var TYPED_ARRAYS = { + 'Int8Array': Int8Array, + 'Uint8Array': Uint8Array, + 'Uint8ClampedArray': Uint8ClampedArray, + 'Int16Array': Int16Array, + 'Uint16Array': Uint16Array, + 'Int32Array': Int32Array, + 'Uint32Array': Uint32Array, + 'Float32Array': Float32Array, + 'Float64Array': Float64Array + }; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() { + + this.onLoadStart = function () {}; + this.onLoadProgress = function () {}; + this.onLoadComplete = function () {}; + + } + + Loader.prototype = { + + constructor: Loader, + + crossOrigin: undefined, + + extractUrlBase: function ( url ) { + + var parts = url.split( '/' ); + + if ( parts.length === 1 ) return './'; + + parts.pop(); + + return parts.join( '/' ) + '/'; + + }, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var color, textureLoader, materialLoader; + + return function createMaterial( m, texturePath, crossOrigin ) { + + if ( color === undefined ) color = new Color(); + if ( textureLoader === undefined ) textureLoader = new TextureLoader(); + if ( materialLoader === undefined ) materialLoader = new MaterialLoader(); + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = [ value, value ]; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + }; + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + load: function( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : Loader.prototype.extractUrlBase( url ); + + var loader = new XHRLoader( this.manager ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + if ( type.toLowerCase() === 'scene' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: function ( json, texturePath ) { + + var geometry = new Geometry(), + scale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0; + + parseModel( scale ); + + parseSkin(); + parseMorphing( scale ); + parseAnimations(); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + function parseModel( scale ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + nUvLayers = 0; + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin() { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( scale ) { + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations() { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.texturePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new XHRLoader( scope.manager ); + loader.load( url, function ( text ) { + + scope.parse( JSON.parse( text ), onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var geometries = this.parseGeometries( json.geometries ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseGeometries: function ( json ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'IcosahedronGeometry': + case 'OctahedronGeometry': + case 'TetrahedronGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data.data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var material = loader.parse( json[ i ] ); + materials[ material.uuid ] = material; + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof( value ) === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping ); + + } + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function () { + + var matrix = new Matrix4(); + + return function parseObject( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + if ( data.matrix !== undefined ) { + + matrix.fromArray( data.matrix ); + matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + for ( var child in data.children ) { + + object.add( this.parseObject( data.children[ child ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + }; + + }() + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of Curve methods + * .getPoint(t), getTangent(t) + * .getPointAt(u), getTangentAt(u) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following classes subclasses THREE.Curve: + * + * -- 2d classes -- + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.CubicBezierCurve + * THREE.SplineCurve + * THREE.ArcCurve + * THREE.EllipseCurve + * + * -- 3d classes -- + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * THREE.CubicBezierCurve3 + * THREE.SplineCurve3 + * + * A series of curves can be represented as a THREE.CurvePath + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() {} + + Curve.prototype = { + + constructor: Curve, + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( t ) { + + console.warn( "THREE.Curve: Warning, getPoint() not implemented!" ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( ! divisions ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( ! divisions ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200; + + if ( this.cacheArcLengths + && ( this.cacheArcLengths.length === divisions + 1 ) + && ! this.needsUpdate ) { + + //console.log( "cached", this.cacheArcLengths ); + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint ( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum:sum }; Sum is in the last element. + + }, + + updateArcLengths: function() { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + //var time = Date.now(); + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = 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 + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + //console.log('b' , i, low, high, Date.now()- time); + + if ( arcLengths[ i ] === targetArcLength ) { + + var t = i / ( il - 1 ); + return t; + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + } + + }; + + // TODO: Transformation for Curves? + + /************************************************************** + * 3D Curves + **************************************************************/ + + // A Factory method for creating new curve subclasses + + Curve.create = function ( constructor, getPointFunc ) { + + constructor.prototype = Object.create( Curve.prototype ); + constructor.prototype.constructor = constructor; + constructor.prototype.getPoint = getPointFunc; + + return constructor; + + }; + + /************************************************************** + * Line + **************************************************************/ + + function LineCurve( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var point = this.v2.clone().sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function ( u ) { + + return this.getPoint( u ); + + }; + + LineCurve.prototype.getTangent = function( t ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + this.curves = []; + + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + /************************************************************** + * Create Geometries Helpers + **************************************************************/ + + /// Generate geometry from path points (for Line or Points objects) + + createPointsGeometry: function ( divisions ) { + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + // Generate geometry from equidistant sampling along the path + + createSpacedPointsGeometry: function ( divisions ) { + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + /************************************************************** + * Ellipse curve + **************************************************************/ + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function( t ) { + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return new Vector2( x, y ); + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var CurveUtils = { + + tangentQuadraticBezier: function ( t, p0, p1, p2 ) { + + return 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 ); + + }, + + // Puay Bing, thanks for helping with this derivative! + + tangentCubicBezier: function ( t, p0, p1, p2, p3 ) { + + return - 3 * p0 * ( 1 - t ) * ( 1 - t ) + + 3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) + + 6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 + + 3 * t * t * p3; + + }, + + tangentSpline: function ( t, p0, p1, p2, p3 ) { + + // To check if my formulas are correct + + var h00 = 6 * t * t - 6 * t; // derived from 2t^3 − 3t^2 + 1 + var h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t + var h01 = - 6 * t * t + 6 * t; // − 2t3 + 3t2 + var h11 = 3 * t * t - 2 * t; // t3 − t2 + + return h00 + h10 + h01 + h11; + + }, + + // Catmull-Rom + + interpolate: function( p0, p1, p2, p3, t ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + }; + + /************************************************************** + * Spline curve + **************************************************************/ + + function SplineCurve( points /* array of Vector2 */ ) { + + this.points = ( points === undefined ) ? [] : points; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + var interpolate = CurveUtils.interpolate; + + return new Vector2( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ) + ); + + }; + + /************************************************************** + * Cubic Bezier curve + **************************************************************/ + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.getPoint = function ( t ) { + + var b3 = ShapeUtils.b3; + + return new Vector2( + b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ) + ); + + }; + + CubicBezierCurve.prototype.getTangent = function( t ) { + + var tangentCubicBezier = CurveUtils.tangentCubicBezier; + + return new Vector2( + tangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + tangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ) + ).normalize(); + + }; + + /************************************************************** + * Quadratic Bezier curve + **************************************************************/ + + + function QuadraticBezierCurve( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + + QuadraticBezierCurve.prototype.getPoint = function ( t ) { + + var b2 = ShapeUtils.b2; + + return new Vector2( + b2( t, this.v0.x, this.v1.x, this.v2.x ), + b2( t, this.v0.y, this.v1.y, this.v2.y ) + ); + + }; + + + QuadraticBezierCurve.prototype.getTangent = function( t ) { + + var tangentQuadraticBezier = CurveUtils.tangentQuadraticBezier; + + return new Vector2( + tangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ), + tangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y ) + ).normalize(); + + }; + + var PathPrototype = Object.assign( Object.create( CurvePath.prototype ), { + + fromPoints: function ( vectors ) { + + this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); + + for ( var i = 1, l = vectors.length; i < l; i ++ ) { + + this.lineTo( vectors[ i ].x, vectors[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape() { + + Path.apply( this, arguments ); + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( PathPrototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // Get points of shape and holes (keypoints based on segments parameter) + + extractAllPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + extractPoints: function ( divisions ) { + + return this.extractAllPoints( divisions ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + * + **/ + + function Path( points ) { + + CurvePath.call( this ); + this.currentPoint = new Vector2(); + + if ( points ) { + + this.fromPoints( points ); + + } + + } + + Path.prototype = PathPrototype; + PathPrototype.constructor = Path; + + + // minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + function ShapePath() { + this.subPaths = []; + this.currentPath = null; + } + + ShapePath.prototype = { + moveTo: function ( x, y ) { + this.currentPath = new Path(); + this.subPaths.push(this.currentPath); + this.currentPath.moveTo( x, y ); + }, + lineTo: function ( x, y ) { + this.currentPath.lineTo( x, y ); + }, + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + }, + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + }, + splineThru: function ( pts ) { + this.currentPath.splineThru( pts ); + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + function Font( data ) { + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size, divisions ) { + + function createPaths( text ) { + + var chars = String( text ).split( '' ); + var scale = size / data.resolution; + var offset = 0; + + var paths = []; + + for ( var i = 0; i < chars.length; i ++ ) { + + var ret = createPath( chars[ i ], scale, offset ); + offset += ret.offset; + + paths.push( ret.path ); + + } + + return paths; + + } + + function createPath( c, scale, offset ) { + + var glyph = data.glyphs[ c ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var pts = [], b2 = ShapeUtils.b2, b3 = ShapeUtils.b3; + var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offset; + y = outline[ i ++ ] * scale; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offset; + y = outline[ i ++ ] * scale; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offset; + cpy = outline[ i ++ ] * scale; + cpx1 = outline[ i ++ ] * scale + offset; + cpy1 = outline[ i ++ ] * scale; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + b2( t, cpx0, cpx1, cpx ); + b2( t, cpy0, cpy1, cpy ); + + } + + } + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offset; + cpy = outline[ i ++ ] * scale; + cpx1 = outline[ i ++ ] * scale + offset; + cpy1 = outline[ i ++ ] * scale; + cpx2 = outline[ i ++ ] * scale + offset; + cpy2 = outline[ i ++ ] * scale; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + b3( t, cpx0, cpx1, cpx2, cpx ); + b3( t, cpy0, cpy1, cpy2, cpy ); + + } + + } + + break; + + } + + } + + } + + return { offset: glyph.ha * scale, path: path }; + + } + + // + + if ( size === undefined ) size = 100; + if ( divisions === undefined ) divisions = 4; + + var data = this.data; + + var paths = createPaths( text ); + var shapes = []; + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new XHRLoader( this.manager ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + } + + } ); + + var context; + + function getAudioContext() { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + } + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new XHRLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.load( url, function ( buffer ) { + + var context = getAudioContext(); + + context.decodeAudioData( buffer, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + var eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // for left eye + + xmin = - ymax * aspect + eyeSepOnProjection; + xmax = ymax * aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * aspect - eyeSepOnProjection; + xmax = ymax * aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + + this.updateCubeMap = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = getAudioContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.value = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + this.source = this.context.createBufferSource(); + this.source.onended = this.onEnded.bind( this ); + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.startTime = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.source.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.source.buffer; + source.loop = this.source.loop; + source.onended = this.source.onended; + source.start( 0, this.startTime ); + source.playbackRate.value = this.playbackRate; + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = this.context.currentTime; + this.isPlaying = false; + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.value = this.playbackRate; + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.source.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.loop = value; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + + setVolume: function ( value ) { + + this.gain.gain.value = value; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': mixFunction = this._slerp; break; + + case 'string': + case 'bool': + + bufferType = Array, mixFunction = this._select; break; + + default: mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + PropertyMixer.prototype = { + + constructor: PropertyMixer, + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function() { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function() { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function( buffer, dstOffset, srcOffset, t, stride ) { + + Quaternion.slerpFlat( buffer, dstOffset, + buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + }; + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || + PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( + rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + PropertyBinding.prototype = { + + constructor: PropertyBinding, + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function() { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( + this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( " trying to update node for track: " + this.path + " but it wasn't found." ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( ' can not bind to material as node does not have a material', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( ' can not bind to material.materials as node.material does not have a materials array', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( ' can not bind to bones as node does not have a skeleton', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( ' can not bind to objectName of node, undefined', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( " trying to bind to objectIndex of objectName, but is undefined:", this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( " trying to update property for track: " + nodeName + + '.' + propertyName + " but it wasn't found.", targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + this.targetObject = targetObject; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + this.targetObject = targetObject; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this ); + return; + + } + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( nodeProperty.length !== undefined ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function() { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + }; + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function() {}, + _setValue_unavailable: function() {}, + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ] + + } ); + + PropertyBinding.Composite = + function( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || + PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + }; + + PropertyBinding.Composite.prototype = { + + constructor: PropertyBinding.Composite, + + getValue: function( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function() { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function() { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + }; + + PropertyBinding.create = function( root, path, parsedPath ) { + + if ( ! ( (root && root.isAnimationObjectGroup) ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }; + + PropertyBinding.parseTrackName = function( trackName ) { + + // matches strings in the form of: + // nodeName.property + // nodeName.property[accessor] + // nodeName.material.property[accessor] + // uuid.property[accessor] + // uuid.objectName[objectIndex].propertyName[propertyIndex] + // parentName/nodeName.property + // parentName/parentName/nodeName.property[index] + // .bone[Armature.DEF_cog].position + // scene:helium_balloon_model:helium_balloon_model.position + // created and tested via https://regex101.com/#javascript + + var re = /^((?:\w+[\/:])*)(\w+)?(?:\.(\w+)(?:\[(.+)\])?)?\.(\w+)(?:\[(.+)\])?$/; + var matches = re.exec( trackName ); + + if ( ! matches ) { + + throw new Error( "cannot parse trackName at all: " + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], // allowed to be null, specified root node. + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], + propertyIndex: matches[ 6 ] // allowed to be null, specifies that the whole property is set. + }; + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( "can not parse propertyName from trackName: " + trackName ); + + } + + return results; + + }; + + PropertyBinding.findNode = function( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var searchSkeleton = function( skeleton ) { + + for( var i = 0; i < skeleton.bones.length; i ++ ) { + + var bone = skeleton.bones[ i ]; + + if ( bone.name === nodeName ) { + + return bone; + + } + } + + return null; + + }; + + var bone = searchSkeleton( root.skeleton ); + + if ( bone ) { + + return bone; + + } + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function( children ) { + + for( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + }; + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup( var_args ) { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { return scope._objects.length; }, + get inUse() { return this.total - scope.nCachedObjects_; } + }, + + get bindingsPerObject() { return scope._bindings.length; } + + }; + + } + + AnimationObjectGroup.prototype = { + + constructor: AnimationObjectGroup, + + isAnimationObjectGroup: true, + + add: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( + new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + var knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject) { + + console.error( "Different objects with the same UUID " + + "detected. Clean the caches or recreate your " + + "infrastructure when reloading scenes..." ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function( var_args ) { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function( path, parsedPath ) { + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, + n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + + bindingsForPath[ i ] = + new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function( path ) { + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + }; + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = -1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // false -> zero effective time scale + this.enabled = true; // true -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + AnimationAction.prototype = { + + constructor: AnimationAction, + + // State & Scheduling + + play: function() { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = -1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function() { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function() { + + return this._effectiveWeight; + + }, + + fadeIn: function( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function() { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the weight stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 :timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function() { + + return this._effectiveTimeScale; + + }, + + setDuration: function( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(), + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function() { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function() { + + return this._mixer; + + }, + + getClip: function() { + + return this._clip; + + }, + + getRoot: function() { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function( time, deltaTime, timeDirection, accuIndex ) { + // called by the mixer + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function( deltaTime ) { + + var time = this.time + deltaTime; + + if ( deltaTime === 0 ) return time; + + var duration = this._clip.duration, + + loop = this.loop, + loopCount = this._loopCount; + + if ( loop === LoopOnce ) { + + if ( loopCount === -1 ) { + // just started + + this.loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? -1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + var pingPong = ( loop === LoopPingPong ); + + if ( loopCount === -1 ) { + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( + true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( + this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending < 0 ) { + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : -1 + } ); + + } else { + // keep running + + if ( pending === 0 ) { + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(), + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + }; + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + Object.assign( AnimationMixer.prototype, EventDispatcher.prototype, { + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function() { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + if ( action.enabled ) { + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function() { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + // Implementation details: + + Object.assign( AnimationMixer.prototype, { + + _bindAction: function( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function() { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { return scope._actions.length; }, + get inUse() { return scope._nActiveActions; } + }, + bindings: { + get total() { return scope._bindings.length; }, + get inUse() { return scope._nActiveBindings; } + }, + controlInterpolants: { + get total() { return scope._controlInterpolants.length; }, + get inUse() { return scope._nActiveControlInterpolants; } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( actions._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function() { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ) + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + InstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry; + + InstancedBufferGeometry.prototype.isInstancedBufferGeometry = true; + + InstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex + + } ); + + }; + + InstancedBufferGeometry.prototype.copy = function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + return this; + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.uuid = _Math.generateUUID(); + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + + InterleavedBufferAttribute.prototype = { + + constructor: InterleavedBufferAttribute, + + isInterleavedBufferAttribute: true, + + get count() { + + return this.data.count; + + }, + + get array() { + + return this.data.array; + + }, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + InterleavedBuffer.prototype = { + + constructor: InterleavedBuffer, + + isInterleavedBuffer: true, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype ); + InstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer; + + InstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true; + + InstancedInterleavedBuffer.prototype.copy = function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) { + + BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + InstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute; + + InstancedBufferAttribute.prototype.isInstancedBufferAttribute = true; + + InstancedBufferAttribute.prototype.copy = function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + // + + Raycaster.prototype = { + + constructor: Raycaster, + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( (camera && camera.isPerspectiveCamera) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( (camera && camera.isOrthographicCamera) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive ) { + + var intersects = []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive ) { + + var intersects = []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Clock.prototype = { + + constructor: Clock, + + start: function () { + + this.startTime = ( performance || Date ).now(); + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + + } + + if ( this.running ) { + + var newTime = ( performance || Date ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + }; + + /** + * Spline from Tween.js, slightly optimized (and trashed) + * http://sole.github.com/tween.js/examples/05_spline.html + * + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Spline( points ) { + + this.points = points; + + var c = [], v3 = { x: 0, y: 0, z: 0 }, + point, intPoint, weight, w2, w3, + pa, pb, pc, pd; + + this.initFromArray = function ( a ) { + + this.points = []; + + for ( var i = 0; i < a.length; i ++ ) { + + this.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] }; + + } + + }; + + this.getPoint = function ( k ) { + + point = ( this.points.length - 1 ) * k; + intPoint = Math.floor( point ); + weight = point - intPoint; + + c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1; + c[ 1 ] = intPoint; + c[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1; + c[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2; + + pa = this.points[ c[ 0 ] ]; + pb = this.points[ c[ 1 ] ]; + pc = this.points[ c[ 2 ] ]; + pd = this.points[ c[ 3 ] ]; + + w2 = weight * weight; + w3 = weight * w2; + + v3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 ); + v3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 ); + v3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 ); + + return v3; + + }; + + this.getControlPointsArray = function () { + + var i, p, l = this.points.length, + coords = []; + + for ( i = 0; i < l; i ++ ) { + + p = this.points[ i ]; + coords[ i ] = [ p.x, p.y, p.z ]; + + } + + return coords; + + }; + + // approximate length by summing linear segments + + this.getLength = function ( nSubDivisions ) { + + var i, index, nSamples, position, + point = 0, intPoint = 0, oldIntPoint = 0, + oldPosition = new Vector3(), + tmpVec = new Vector3(), + chunkLengths = [], + totalLength = 0; + + // first point has 0 length + + chunkLengths[ 0 ] = 0; + + if ( ! nSubDivisions ) nSubDivisions = 100; + + nSamples = this.points.length * nSubDivisions; + + oldPosition.copy( this.points[ 0 ] ); + + for ( i = 1; i < nSamples; i ++ ) { + + index = i / nSamples; + + position = this.getPoint( index ); + tmpVec.copy( position ); + + totalLength += tmpVec.distanceTo( oldPosition ); + + oldPosition.copy( position ); + + point = ( this.points.length - 1 ) * index; + intPoint = Math.floor( point ); + + if ( intPoint !== oldIntPoint ) { + + chunkLengths[ intPoint ] = totalLength; + oldIntPoint = intPoint; + + } + + } + + // last point ends with total length + + chunkLengths[ chunkLengths.length ] = totalLength; + + return { chunks: chunkLengths, total: totalLength }; + + }; + + this.reparametrizeByArcLength = function ( samplingCoef ) { + + var i, j, + index, indexCurrent, indexNext, + realDistance, + sampling, position, + newpoints = [], + tmpVec = new Vector3(), + sl = this.getLength(); + + newpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() ); + + for ( i = 1; i < this.points.length; i ++ ) { + + //tmpVec.copy( this.points[ i - 1 ] ); + //linearDistance = tmpVec.distanceTo( this.points[ i ] ); + + realDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ]; + + sampling = Math.ceil( samplingCoef * realDistance / sl.total ); + + indexCurrent = ( i - 1 ) / ( this.points.length - 1 ); + indexNext = i / ( this.points.length - 1 ); + + for ( j = 1; j < sampling - 1; j ++ ) { + + index = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent ); + + position = this.getPoint( index ); + newpoints.push( tmpVec.copy( position ).clone() ); + + } + + newpoints.push( tmpVec.copy( this.points[ i ] ).clone() ); + + } + + this.points = newpoints; + + }; + + // Catmull-Rom + + function interpolate( p0, p1, p2, p3, t, t2, t3 ) { + + var v0 = ( p2 - p0 ) * 0.5, + v1 = ( p3 - p1 ) * 0.5; + + return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + } + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The poles (phi) are at the positive and negative y axis. + * The equator starts at positive z. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole + this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere + + return this; + + } + + Spherical.prototype = { + + constructor: Spherical, + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function() { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = vec3.length(); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis + this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle + + } + + return this; + + }, + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function MorphBlendMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.animationsMap = {}; + this.animationsList = []; + + // prepare default animation + // (all frames played together in 1 second) + + var numFrames = this.geometry.morphTargets.length; + + var name = "__default"; + + var startFrame = 0; + var endFrame = numFrames - 1; + + var fps = numFrames / 1; + + this.createAnimation( name, startFrame, endFrame, fps ); + this.setAnimationWeight( name, 1 ); + + } + + MorphBlendMesh.prototype = Object.create( Mesh.prototype ); + MorphBlendMesh.prototype.constructor = MorphBlendMesh; + + MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { + + var animation = { + + start: start, + end: end, + + length: end - start + 1, + + fps: fps, + duration: ( end - start ) / fps, + + lastFrame: 0, + currentFrame: 0, + + active: false, + + time: 0, + direction: 1, + weight: 1, + + directionBackwards: false, + mirroredLoop: false + + }; + + this.animationsMap[ name ] = animation; + this.animationsList.push( animation ); + + }; + + MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { + + var pattern = /([a-z]+)_?(\d+)/i; + + var firstAnimation, frameRanges = {}; + + var geometry = this.geometry; + + for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { + + var morph = geometry.morphTargets[ i ]; + var chunks = morph.name.match( pattern ); + + if ( chunks && chunks.length > 1 ) { + + var name = chunks[ 1 ]; + + if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; + + var range = frameRanges[ name ]; + + if ( i < range.start ) range.start = i; + if ( i > range.end ) range.end = i; + + if ( ! firstAnimation ) firstAnimation = name; + + } + + } + + for ( var name in frameRanges ) { + + var range = frameRanges[ name ]; + this.createAnimation( name, range.start, range.end, fps ); + + } + + this.firstAnimation = firstAnimation; + + }; + + MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = 1; + animation.directionBackwards = false; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = - 1; + animation.directionBackwards = true; + + } + + }; + + MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.fps = fps; + animation.duration = ( animation.end - animation.start ) / animation.fps; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.duration = duration; + animation.fps = ( animation.end - animation.start ) / animation.duration; + + } + + }; + + MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.weight = weight; + + } + + }; + + MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = time; + + } + + }; + + MorphBlendMesh.prototype.getAnimationTime = function ( name ) { + + var time = 0; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + time = animation.time; + + } + + return time; + + }; + + MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { + + var duration = - 1; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + duration = animation.duration; + + } + + return duration; + + }; + + MorphBlendMesh.prototype.playAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = 0; + animation.active = true; + + } else { + + console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); + + } + + }; + + MorphBlendMesh.prototype.stopAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.active = false; + + } + + }; + + MorphBlendMesh.prototype.update = function ( delta ) { + + for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { + + var animation = this.animationsList[ i ]; + + if ( ! animation.active ) continue; + + var frameTime = animation.duration / animation.length; + + animation.time += animation.direction * delta; + + if ( animation.mirroredLoop ) { + + if ( animation.time > animation.duration || animation.time < 0 ) { + + animation.direction *= - 1; + + if ( animation.time > animation.duration ) { + + animation.time = animation.duration; + animation.directionBackwards = true; + + } + + if ( animation.time < 0 ) { + + animation.time = 0; + animation.directionBackwards = false; + + } + + } + + } else { + + animation.time = animation.time % animation.duration; + + if ( animation.time < 0 ) animation.time += animation.duration; + + } + + var keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); + var weight = animation.weight; + + if ( keyframe !== animation.currentFrame ) { + + this.morphTargetInfluences[ animation.lastFrame ] = 0; + this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; + + this.morphTargetInfluences[ keyframe ] = 0; + + animation.lastFrame = animation.currentFrame; + animation.currentFrame = keyframe; + + } + + var mix = ( animation.time % frameTime ) / frameTime; + + if ( animation.directionBackwards ) mix = 1 - mix; + + if ( animation.currentFrame !== animation.lastFrame ) { + + this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; + this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; + + } else { + + this.morphTargetInfluences[ animation.currentFrame ] = weight; + + } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( renderCallback ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( (objGeometry && objGeometry.isGeometry) ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( (objGeometry && objGeometry.isBufferGeometry) ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32Attribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( (objGeometry && objGeometry.isGeometry) ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( (objGeometry && objGeometry.isBufferGeometry) ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + return this; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new BufferGeometry(); + + var positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32Attribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + this.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + */ + + function SkeletonHelper( object ) { + + this.bones = this.getBoneList( object ); + + var geometry = new Geometry(); + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( (bone.parent && bone.parent.isBone) ) { + + geometry.vertices.push( new Vector3() ); + geometry.vertices.push( new Vector3() ); + geometry.colors.push( new Color( 0, 0, 1 ) ); + geometry.colors.push( new Color( 0, 1, 0 ) ); + + } + + } + + geometry.dynamic = true; + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + } + + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.getBoneList = function( object ) { + + var boneList = []; + + if ( (object && object.isBone) ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + }; + + SkeletonHelper.prototype.update = function () { + + var geometry = this.geometry; + + var matrixWorldInv = new Matrix4().getInverse( this.root.matrixWorld ); + + var boneMatrix = new Matrix4(); + + var j = 0; + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( (bone.parent && bone.parent.isBone) ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + geometry.vertices[ j ].setFromMatrixPosition( boneMatrix ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + geometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix ); + + j += 2; + + } + + } + + geometry.verticesNeedUpdate = true; + + geometry.computeBoundingSphere(); + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize ) { + + this.light = light; + this.light.updateMatrixWorld(); + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + this.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function HemisphereLightHelper( light, sphereSize ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.colors = [ new Color(), new Color() ]; + + var geometry = new SphereGeometry( sphereSize, 4, 2 ); + geometry.rotateX( - Math.PI / 2 ); + + for ( var i = 0, il = 8; i < il; i ++ ) { + + geometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ]; + + } + + var material = new MeshBasicMaterial( { vertexColors: FaceColors, wireframe: true } ); + + this.lightSphere = new Mesh( geometry, material ); + this.add( this.lightSphere ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.lightSphere.geometry.dispose(); + this.lightSphere.material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + return function update() { + + this.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity ); + this.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity ); + + this.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + this.lightSphere.geometry.colorsNeedUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + divisions = divisions || 1; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = ( size * 2 ) / divisions; + var vertices = [], colors = []; + + for ( var i = 0, j = 0, k = - size; i <= divisions; i ++, k += step ) { + + vertices.push( - size, 0, k, size, 0, k ); + vertices.push( k, 0, - size, k, 0, size ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32Attribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32Attribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( (objGeometry && objGeometry.isGeometry) ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32Attribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + return this; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32Attribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.add( new Line( geometry, material ) ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.add( new Line( geometry, material )); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.geometry.dispose(); + lightPlane.material.dispose(); + targetLine.geometry.dispose(); + targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.lookAt( v3 ); + lightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + targetLine.lookAt( v3 ); + targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new Geometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var pointMap = {}; + + // colors + + var hexFrustum = 0xffaa00; + var hexCone = 0xff0000; + var hexUp = 0x00aaff; + var hexTarget = 0xffffff; + var hexCross = 0x333333; + + // near + + addLine( "n1", "n2", hexFrustum ); + addLine( "n2", "n4", hexFrustum ); + addLine( "n4", "n3", hexFrustum ); + addLine( "n3", "n1", hexFrustum ); + + // far + + addLine( "f1", "f2", hexFrustum ); + addLine( "f2", "f4", hexFrustum ); + addLine( "f4", "f3", hexFrustum ); + addLine( "f3", "f1", hexFrustum ); + + // sides + + addLine( "n1", "f1", hexFrustum ); + addLine( "n2", "f2", hexFrustum ); + addLine( "n3", "f3", hexFrustum ); + addLine( "n4", "f4", hexFrustum ); + + // cone + + addLine( "p", "n1", hexCone ); + addLine( "p", "n2", hexCone ); + addLine( "p", "n3", hexCone ); + addLine( "p", "n4", hexCone ); + + // up + + addLine( "u1", "u2", hexUp ); + addLine( "u2", "u3", hexUp ); + addLine( "u3", "u1", hexUp ); + + // target + + addLine( "c", "t", hexTarget ); + addLine( "p", "c", hexCross ); + + // cross + + addLine( "cn1", "cn2", hexCross ); + addLine( "cn3", "cn4", hexCross ); + + addLine( "cf1", "cf2", hexCross ); + addLine( "cf3", "cf4", hexCross ); + + function addLine( a, b, hex ) { + + addPoint( a, hex ); + addPoint( b, hex ); + + } + + function addPoint( id, hex ) { + + geometry.vertices.push( new Vector3() ); + geometry.colors.push( new Color( hex ) ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( geometry.vertices.length - 1 ); + + } + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + geometry.vertices[ points[ i ] ].copy( vector ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( "c", 0, 0, - 1 ); + setPoint( "t", 0, 0, 1 ); + + // near + + setPoint( "n1", - w, - h, - 1 ); + setPoint( "n2", w, - h, - 1 ); + setPoint( "n3", - w, h, - 1 ); + setPoint( "n4", w, h, - 1 ); + + // far + + setPoint( "f1", - w, - h, 1 ); + setPoint( "f2", w, - h, 1 ); + setPoint( "f3", - w, h, 1 ); + setPoint( "f4", w, h, 1 ); + + // up + + setPoint( "u1", w * 0.7, h * 1.1, - 1 ); + setPoint( "u2", - w * 0.7, h * 1.1, - 1 ); + setPoint( "u3", 0, h * 2, - 1 ); + + // cross + + setPoint( "cf1", - w, 0, 1 ); + setPoint( "cf2", w, 0, 1 ); + setPoint( "cf3", 0, - h, 1 ); + setPoint( "cf4", 0, h, 1 ); + + setPoint( "cn1", - w, 0, - 1 ); + setPoint( "cn2", w, 0, - 1 ); + setPoint( "cn3", 0, - h, - 1 ); + setPoint( "cn4", 0, h, - 1 ); + + geometry.verticesNeedUpdate = true; + + }; + + }(); + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + // a helper to show the world-axis-aligned bounding box for an object + + function BoundingBoxHelper( object, hex ) { + + var color = ( hex !== undefined ) ? hex : 0x888888; + + this.object = object; + + this.box = new Box3(); + + Mesh.call( this, new BoxGeometry( 1, 1, 1 ), new MeshBasicMaterial( { color: color, wireframe: true } ) ); + + } + + BoundingBoxHelper.prototype = Object.create( Mesh.prototype ); + BoundingBoxHelper.prototype.constructor = BoundingBoxHelper; + + BoundingBoxHelper.prototype.update = function () { + + this.box.setFromObject( this.object ); + + this.box.getSize( this.scale ); + + this.box.getCenter( this.position ); + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BoxHelper( object, color ) { + + if ( color === undefined ) color = 0xffff00; + + var 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 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + if ( object !== undefined ) { + + this.update( object ); + + } + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( (object && object.isBox3) ) { + + box.copy( object ); + + } else { + + box.setFromObject( object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + var coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxisHelper( size ) { + + size = size || 1; + + var vertices = new Float32Array( [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ] ); + + var colors = new Float32Array( [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ] ); + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxisHelper.prototype = Object.create( LineSegments.prototype ); + AxisHelper.prototype.constructor = AxisHelper; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + var CatmullRomCurve3 = ( function() { + + var + tmp = new Vector3(), + px = new CubicPoly(), + py = new CubicPoly(), + pz = new CubicPoly(); + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() {} + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + CubicPoly.prototype.init = function( x0, x1, t0, t1 ) { + + this.c0 = x0; + this.c1 = t0; + this.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + this.c3 = 2 * x0 - 2 * x1 + t0 + t1; + + }; + + CubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + // initCubicPoly + this.init( x1, x2, t1, t2 ); + + }; + + // standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4 + CubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) { + + this.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }; + + CubicPoly.prototype.calc = function( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3; + + }; + + // Subclass Three.js curve + return Curve.create( + + function ( p /* array of Vector3 */ ) { + + this.points = p || []; + this.closed = false; + + }, + + function ( t ) { + + var points = this.points, + point, intPoint, weight, l; + + l = points.length; + + if ( l < 2 ) console.log( 'duh, you need at least 2 points' ); + + point = ( l - ( this.closed ? 0 : 1 ) ) * t; + intPoint = Math.floor( point ); + weight = point - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.type === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.type === 'catmullrom' ) { + + var tension = this.tension !== undefined ? this.tension : 0.5; + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); + + } + + var v = new Vector3( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return v; + + } + + ); + + } )(); + + /************************************************************** + * Closed Spline 3D curve + **************************************************************/ + + + function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + + } + + ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + /************************************************************** + * Spline 3D curve + **************************************************************/ + + + var SplineCurve3 = Curve.create( + + function ( points /* array of Vector3 */ ) { + + console.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' ); + this.points = ( points === undefined ) ? [] : points; + + }, + + function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + var interpolate = CurveUtils.interpolate; + + return new Vector3( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ), + interpolate( point0.z, point1.z, point2.z, point3.z, weight ) + ); + + } + + ); + + /************************************************************** + * Cubic Bezier 3D curve + **************************************************************/ + + var CubicBezierCurve3 = Curve.create( + + function ( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + }, + + function ( t ) { + + var b3 = ShapeUtils.b3; + + return new Vector3( + b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ), + b3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z ) + ); + + } + + ); + + /************************************************************** + * Quadratic Bezier 3D curve + **************************************************************/ + + var QuadraticBezierCurve3 = Curve.create( + + function ( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + }, + + function ( t ) { + + var b2 = ShapeUtils.b2; + + return new Vector3( + b2( t, this.v0.x, this.v1.x, this.v2.x ), + b2( t, this.v0.y, this.v1.y, this.v2.y ), + b2( t, this.v0.z, this.v1.z, this.v2.z ) + ); + + } + + ); + + /************************************************************** + * Line3D + **************************************************************/ + + var LineCurve3 = Curve.create( + + function ( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + + }, + + function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var vector = new Vector3(); + + vector.subVectors( this.v2, this.v1 ); // diff + vector.multiplyScalar( t ); + vector.add( this.v1 ); + + return vector; + + } + + ); + + /************************************************************** + * Arc curve + **************************************************************/ + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + var SceneUtils = { + + createMultiMaterialObject: function ( geometry, materials ) { + + var group = new Group(); + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + group.add( new Mesh( geometry, materials[ i ] ) ); + + } + + return group; + + }, + + detach: function ( child, parent, scene ) { + + child.applyMatrix( parent.matrixWorld ); + parent.remove( child ); + scene.add( child ); + + }, + + attach: function ( child, scene, parent ) { + + var matrixWorldInverse = new Matrix4(); + matrixWorldInverse.getInverse( parent.matrixWorld ); + child.applyMatrix( matrixWorldInverse ); + + scene.remove( child ); + parent.add( child ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Face4 ( a, b, c, d, normal, color, materialIndex ) { + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + } + + var LineStrip = 0; + + var LinePieces = 1; + + function PointCloud ( geometry, material ) { + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + } + + function ParticleSystem ( geometry, material ) { + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + } + + function PointCloudMaterial ( parameters ) { + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + } + + function ParticleBasicMaterial ( parameters ) { + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + } + + function ParticleSystemMaterial ( parameters ) { + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + } + + function Vertex ( x, y, z ) { + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + } + + // + + function EdgesHelper( object, hex ) { + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + } + + function WireframeHelper( object, hex ) { + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + } + + // + + Object.assign( Box2.prototype, { + center: function ( optionalTarget ) { + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + }, + empty: function () { + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + }, + isIntersectionBox: function ( box ) { + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + }, + size: function ( optionalTarget ) { + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + } + } ); + + Object.assign( Box3.prototype, { + center: function ( optionalTarget ) { + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + }, + empty: function () { + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + }, + isIntersectionBox: function ( box ) { + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + }, + isIntersectionSphere: function ( sphere ) { + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + }, + size: function ( optionalTarget ) { + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + } + } ); + + Object.assign( Line3.prototype, { + center: function ( optionalTarget ) { + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + } + } ); + + Object.assign( Matrix3.prototype, { + multiplyVector3: function ( vector ) { + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + }, + multiplyVector3Array: function ( a ) { + console.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + } + } ); + + Object.assign( Matrix4.prototype, { + extractPosition: function ( m ) { + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + }, + setRotationFromQuaternion: function ( q ) { + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + }, + multiplyVector3: function ( vector ) { + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' ); + return vector.applyProjection( this ); + }, + multiplyVector4: function ( vector ) { + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + }, + multiplyVector3Array: function ( a ) { + console.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + }, + rotateAxis: function ( v ) { + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + }, + crossVector: function ( vector ) { + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + }, + translate: function ( v ) { + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + }, + rotateX: function ( angle ) { + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + }, + rotateY: function ( angle ) { + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + }, + rotateZ: function ( angle ) { + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + }, + rotateByAxis: function ( axis, angle ) { + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + } + } ); + + Object.assign( Plane.prototype, { + isIntersectionLine: function ( line ) { + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + } + } ); + + Object.assign( Quaternion.prototype, { + multiplyVector3: function ( vector ) { + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + } + } ); + + Object.assign( Ray.prototype, { + isIntersectionBox: function ( box ) { + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + }, + isIntersectionPlane: function ( plane ) { + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + }, + isIntersectionSphere: function ( sphere ) { + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + } + } ); + + Object.assign( Shape.prototype, { + extrude: function ( options ) { + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + }, + makeGeometry: function ( options ) { + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + } + } ); + + Object.assign( Vector3.prototype, { + setEulerFromRotationMatrix: function () { + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + }, + setEulerFromQuaternion: function () { + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + }, + getPositionFromMatrix: function ( m ) { + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + }, + getScaleFromMatrix: function ( m ) { + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + }, + getColumnFromMatrix: function ( index, matrix ) { + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + } + } ); + + // + + Object.assign( Object3D.prototype, { + getChildByName: function ( name ) { + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + }, + renderDepth: function ( value ) { + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + }, + translate: function ( distance, axis ) { + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + } + } ); + + Object.defineProperties( Object3D.prototype, { + eulerOrder: { + get: function () { + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + }, + set: function ( value ) { + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + } + }, + useQuaternion: { + get: function () { + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + }, + set: function ( value ) { + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + } + } + } ); + + Object.defineProperties( LOD.prototype, { + objects: { + get: function () { + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + } + } + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function ( value ) { + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + } + }, + shadowCameraFov: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + } + }, + shadowCameraLeft: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + } + }, + shadowCameraRight: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + } + }, + shadowCameraTop: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + } + }, + shadowCameraBottom: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + } + }, + shadowCameraNear: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + } + }, + shadowCameraFar: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + } + }, + shadowCameraVisible: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + } + }, + shadowBias: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + } + }, + shadowDarkness: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + } + }, + shadowMapWidth: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + } + }, + shadowMapHeight: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + length: { + get: function () { + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' ); + return this.array.length; + } + } + } ); + + Object.assign( BufferGeometry.prototype, { + addIndex: function ( index ) { + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + }, + addDrawCall: function ( start, count, indexOffset ) { + if ( indexOffset !== undefined ) { + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + }, + clearDrawCalls: function () { + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + }, + computeTangents: function () { + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + }, + computeOffsets: function () { + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + } + } ); + + Object.defineProperties( BufferGeometry.prototype, { + drawcalls: { + get: function () { + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + } + }, + offsets: { + get: function () { + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + } + } + } ); + + // + + Object.defineProperties( Material.prototype, { + wrapAround: { + get: function () { + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + }, + set: function ( value ) { + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + } + }, + wrapRGB: { + get: function () { + console.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' ); + return new Color(); + } + } + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + metal: { + get: function () { + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + }, + set: function ( value ) { + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + } + } + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + derivatives: { + get: function () { + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + }, + set: function ( value ) { + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + } + } + } ); + + // + + EventDispatcher.prototype = Object.assign( Object.create( { + + // Note: Extra base ensures these properties are not 'assign'ed. + + constructor: EventDispatcher, + + apply: function ( target ) { + + console.warn( "THREE.EventDispatcher: .apply is deprecated, " + + "just inherit or Object.assign the prototype to mix-in." ); + + Object.assign( target, this ); + + } + + } ), EventDispatcher.prototype ); + + // + + Object.defineProperties( Uniform.prototype, { + dynamic: { + set: function ( value ) { + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + } + }, + onUpdate: { + value: function () { + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + } + } + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + supportsFloatTextures: function () { + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + }, + supportsHalfFloatTextures: function () { + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + }, + supportsStandardDerivatives: function () { + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + }, + supportsCompressedTextureS3TC: function () { + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + }, + supportsCompressedTexturePVRTC: function () { + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + }, + supportsBlendMinMax: function () { + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + }, + supportsVertexTextures: function () { + return this.capabilities.vertexTextures; + }, + supportsInstancedArrays: function () { + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + }, + enableScissorTest: function ( boolean ) { + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + }, + initMaterial: function () { + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + }, + addPrePlugin: function () { + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + }, + addPostPlugin: function () { + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + }, + updateShadowMap: function () { + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + } + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + shadowMapEnabled: { + get: function () { + return this.shadowMap.enabled; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + } + }, + shadowMapType: { + get: function () { + return this.shadowMap.type; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + } + }, + shadowMapCullFace: { + get: function () { + return this.shadowMap.cullFace; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); + this.shadowMap.cullFace = value; + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + cullFace: { + get: function () { + return this.renderReverseSided ? CullFaceFront : CullFaceBack; + }, + set: function ( cullFace ) { + var value = ( cullFace !== CullFaceBack ); + console.warn( "WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + value + "." ); + this.renderReverseSided = value; + } + } + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + wrapS: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + } + }, + wrapT: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + } + }, + magFilter: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + } + }, + minFilter: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + } + }, + anisotropy: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + } + }, + offset: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + } + }, + repeat: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + } + }, + format: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + } + }, + type: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + } + }, + generateMipmaps: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + } + } + } ); + + // + + Object.assign( Audio.prototype, { + load: function ( file ) { + console.warn( 'THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + scope.setBuffer( buffer ); + } ); + return this; + } + } ); + + Object.assign( AudioAnalyser.prototype, { + getData: function ( file ) { + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + } + } ); + + // + + var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + + }; + + var ImageUtils = { + + crossOrigin: undefined, + + loadTexture: function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadTextureCube: function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadCompressedTexture: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + + }, + + loadCompressedTextureCube: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + + } + + }; + + // + + function Projector () { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function ( vector, camera ) { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + + } + + // + + function CanvasRenderer () { + + console.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' ); + + this.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + this.clear = function () {}; + this.render = function () {}; + this.setClearColor = function () {}; + this.setSize = function () {}; + + } + + exports.WebGLRenderTargetCube = WebGLRenderTargetCube; + exports.WebGLRenderTarget = WebGLRenderTarget; + exports.WebGLRenderer = WebGLRenderer; + exports.ShaderLib = ShaderLib; + exports.UniformsLib = UniformsLib; + exports.UniformsUtils = UniformsUtils; + exports.ShaderChunk = ShaderChunk; + exports.FogExp2 = FogExp2; + exports.Fog = Fog; + exports.Scene = Scene; + exports.LensFlare = LensFlare; + exports.Sprite = Sprite; + exports.LOD = LOD; + exports.SkinnedMesh = SkinnedMesh; + exports.Skeleton = Skeleton; + exports.Bone = Bone; + exports.Mesh = Mesh; + exports.LineSegments = LineSegments; + exports.Line = Line; + exports.Points = Points; + exports.Group = Group; + exports.VideoTexture = VideoTexture; + exports.DataTexture = DataTexture; + exports.CompressedTexture = CompressedTexture; + exports.CubeTexture = CubeTexture; + exports.CanvasTexture = CanvasTexture; + exports.DepthTexture = DepthTexture; + exports.TextureIdCount = TextureIdCount; + exports.Texture = Texture; + exports.MaterialIdCount = MaterialIdCount; + exports.CompressedTextureLoader = CompressedTextureLoader; + exports.BinaryTextureLoader = BinaryTextureLoader; + exports.DataTextureLoader = DataTextureLoader; + exports.CubeTextureLoader = CubeTextureLoader; + exports.TextureLoader = TextureLoader; + exports.ObjectLoader = ObjectLoader; + exports.MaterialLoader = MaterialLoader; + exports.BufferGeometryLoader = BufferGeometryLoader; + exports.DefaultLoadingManager = DefaultLoadingManager; + exports.LoadingManager = LoadingManager; + exports.JSONLoader = JSONLoader; + exports.ImageLoader = ImageLoader; + exports.FontLoader = FontLoader; + exports.XHRLoader = XHRLoader; + exports.Loader = Loader; + exports.Cache = Cache; + exports.AudioLoader = AudioLoader; + exports.SpotLightShadow = SpotLightShadow; + exports.SpotLight = SpotLight; + exports.PointLight = PointLight; + exports.HemisphereLight = HemisphereLight; + exports.DirectionalLightShadow = DirectionalLightShadow; + exports.DirectionalLight = DirectionalLight; + exports.AmbientLight = AmbientLight; + exports.LightShadow = LightShadow; + exports.Light = Light; + exports.StereoCamera = StereoCamera; + exports.PerspectiveCamera = PerspectiveCamera; + exports.OrthographicCamera = OrthographicCamera; + exports.CubeCamera = CubeCamera; + exports.Camera = Camera; + exports.AudioListener = AudioListener; + exports.PositionalAudio = PositionalAudio; + exports.getAudioContext = getAudioContext; + exports.AudioAnalyser = AudioAnalyser; + exports.Audio = Audio; + exports.VectorKeyframeTrack = VectorKeyframeTrack; + exports.StringKeyframeTrack = StringKeyframeTrack; + exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack; + exports.NumberKeyframeTrack = NumberKeyframeTrack; + exports.ColorKeyframeTrack = ColorKeyframeTrack; + exports.BooleanKeyframeTrack = BooleanKeyframeTrack; + exports.PropertyMixer = PropertyMixer; + exports.PropertyBinding = PropertyBinding; + exports.KeyframeTrack = KeyframeTrack; + exports.AnimationUtils = AnimationUtils; + exports.AnimationObjectGroup = AnimationObjectGroup; + exports.AnimationMixer = AnimationMixer; + exports.AnimationClip = AnimationClip; + exports.Uniform = Uniform; + exports.InstancedBufferGeometry = InstancedBufferGeometry; + exports.BufferGeometry = BufferGeometry; + exports.GeometryIdCount = GeometryIdCount; + exports.Geometry = Geometry; + exports.InterleavedBufferAttribute = InterleavedBufferAttribute; + exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer; + exports.InterleavedBuffer = InterleavedBuffer; + exports.InstancedBufferAttribute = InstancedBufferAttribute; + exports.DynamicBufferAttribute = DynamicBufferAttribute; + exports.Float64Attribute = Float64Attribute; + exports.Float32Attribute = Float32Attribute; + exports.Uint32Attribute = Uint32Attribute; + exports.Int32Attribute = Int32Attribute; + exports.Uint16Attribute = Uint16Attribute; + exports.Int16Attribute = Int16Attribute; + exports.Uint8ClampedAttribute = Uint8ClampedAttribute; + exports.Uint8Attribute = Uint8Attribute; + exports.Int8Attribute = Int8Attribute; + exports.BufferAttribute = BufferAttribute; + exports.Face3 = Face3; + exports.Object3DIdCount = Object3DIdCount; + exports.Object3D = Object3D; + exports.Raycaster = Raycaster; + exports.Layers = Layers; + exports.EventDispatcher = EventDispatcher; + exports.Clock = Clock; + exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant; + exports.LinearInterpolant = LinearInterpolant; + exports.DiscreteInterpolant = DiscreteInterpolant; + exports.CubicInterpolant = CubicInterpolant; + exports.Interpolant = Interpolant; + exports.Triangle = Triangle; + exports.Spline = Spline; + exports.Math = _Math; + exports.Spherical = Spherical; + exports.Plane = Plane; + exports.Frustum = Frustum; + exports.Sphere = Sphere; + exports.Ray = Ray; + exports.Matrix4 = Matrix4; + exports.Matrix3 = Matrix3; + exports.Box3 = Box3; + exports.Box2 = Box2; + exports.Line3 = Line3; + exports.Euler = Euler; + exports.Vector4 = Vector4; + exports.Vector3 = Vector3; + exports.Vector2 = Vector2; + exports.Quaternion = Quaternion; + exports.ColorKeywords = ColorKeywords; + exports.Color = Color; + exports.MorphBlendMesh = MorphBlendMesh; + exports.ImmediateRenderObject = ImmediateRenderObject; + exports.VertexNormalsHelper = VertexNormalsHelper; + exports.SpotLightHelper = SpotLightHelper; + exports.SkeletonHelper = SkeletonHelper; + exports.PointLightHelper = PointLightHelper; + exports.HemisphereLightHelper = HemisphereLightHelper; + exports.GridHelper = GridHelper; + exports.FaceNormalsHelper = FaceNormalsHelper; + exports.DirectionalLightHelper = DirectionalLightHelper; + exports.CameraHelper = CameraHelper; + exports.BoundingBoxHelper = BoundingBoxHelper; + exports.BoxHelper = BoxHelper; + exports.ArrowHelper = ArrowHelper; + exports.AxisHelper = AxisHelper; + exports.ClosedSplineCurve3 = ClosedSplineCurve3; + exports.CatmullRomCurve3 = CatmullRomCurve3; + exports.SplineCurve3 = SplineCurve3; + exports.CubicBezierCurve3 = CubicBezierCurve3; + exports.QuadraticBezierCurve3 = QuadraticBezierCurve3; + exports.LineCurve3 = LineCurve3; + exports.ArcCurve = ArcCurve; + exports.EllipseCurve = EllipseCurve; + exports.SplineCurve = SplineCurve; + exports.CubicBezierCurve = CubicBezierCurve; + exports.QuadraticBezierCurve = QuadraticBezierCurve; + exports.LineCurve = LineCurve; + exports.Shape = Shape; + exports.ShapePath = ShapePath; + exports.Path = Path; + exports.Font = Font; + exports.CurvePath = CurvePath; + exports.Curve = Curve; + exports.ShapeUtils = ShapeUtils; + exports.SceneUtils = SceneUtils; + exports.CurveUtils = CurveUtils; + exports.WireframeGeometry = WireframeGeometry; + exports.ParametricGeometry = ParametricGeometry; + exports.ParametricBufferGeometry = ParametricBufferGeometry; + exports.TetrahedronGeometry = TetrahedronGeometry; + exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry; + exports.OctahedronGeometry = OctahedronGeometry; + exports.OctahedronBufferGeometry = OctahedronBufferGeometry; + exports.IcosahedronGeometry = IcosahedronGeometry; + exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry; + exports.DodecahedronGeometry = DodecahedronGeometry; + exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry; + exports.PolyhedronGeometry = PolyhedronGeometry; + exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry; + exports.TubeGeometry = TubeGeometry; + exports.TubeBufferGeometry = TubeBufferGeometry; + exports.TorusKnotGeometry = TorusKnotGeometry; + exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry; + exports.TorusGeometry = TorusGeometry; + exports.TorusBufferGeometry = TorusBufferGeometry; + exports.TextGeometry = TextGeometry; + exports.SphereBufferGeometry = SphereBufferGeometry; + exports.SphereGeometry = SphereGeometry; + exports.RingGeometry = RingGeometry; + exports.RingBufferGeometry = RingBufferGeometry; + exports.PlaneBufferGeometry = PlaneBufferGeometry; + exports.PlaneGeometry = PlaneGeometry; + exports.LatheGeometry = LatheGeometry; + exports.LatheBufferGeometry = LatheBufferGeometry; + exports.ShapeGeometry = ShapeGeometry; + exports.ExtrudeGeometry = ExtrudeGeometry; + exports.EdgesGeometry = EdgesGeometry; + exports.ConeGeometry = ConeGeometry; + exports.ConeBufferGeometry = ConeBufferGeometry; + exports.CylinderGeometry = CylinderGeometry; + exports.CylinderBufferGeometry = CylinderBufferGeometry; + exports.CircleBufferGeometry = CircleBufferGeometry; + exports.CircleGeometry = CircleGeometry; + exports.BoxBufferGeometry = BoxBufferGeometry; + exports.BoxGeometry = BoxGeometry; + exports.ShadowMaterial = ShadowMaterial; + exports.SpriteMaterial = SpriteMaterial; + exports.RawShaderMaterial = RawShaderMaterial; + exports.ShaderMaterial = ShaderMaterial; + exports.PointsMaterial = PointsMaterial; + exports.MultiMaterial = MultiMaterial; + exports.MeshPhysicalMaterial = MeshPhysicalMaterial; + exports.MeshStandardMaterial = MeshStandardMaterial; + exports.MeshPhongMaterial = MeshPhongMaterial; + exports.MeshNormalMaterial = MeshNormalMaterial; + exports.MeshLambertMaterial = MeshLambertMaterial; + exports.MeshDepthMaterial = MeshDepthMaterial; + exports.MeshBasicMaterial = MeshBasicMaterial; + exports.LineDashedMaterial = LineDashedMaterial; + exports.LineBasicMaterial = LineBasicMaterial; + exports.Material = Material; + exports.REVISION = REVISION; + exports.MOUSE = MOUSE; + exports.CullFaceNone = CullFaceNone; + exports.CullFaceBack = CullFaceBack; + exports.CullFaceFront = CullFaceFront; + exports.CullFaceFrontBack = CullFaceFrontBack; + exports.FrontFaceDirectionCW = FrontFaceDirectionCW; + exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW; + exports.BasicShadowMap = BasicShadowMap; + exports.PCFShadowMap = PCFShadowMap; + exports.PCFSoftShadowMap = PCFSoftShadowMap; + exports.FrontSide = FrontSide; + exports.BackSide = BackSide; + exports.DoubleSide = DoubleSide; + exports.FlatShading = FlatShading; + exports.SmoothShading = SmoothShading; + exports.NoColors = NoColors; + exports.FaceColors = FaceColors; + exports.VertexColors = VertexColors; + exports.NoBlending = NoBlending; + exports.NormalBlending = NormalBlending; + exports.AdditiveBlending = AdditiveBlending; + exports.SubtractiveBlending = SubtractiveBlending; + exports.MultiplyBlending = MultiplyBlending; + exports.CustomBlending = CustomBlending; + exports.BlendingMode = BlendingMode; + exports.AddEquation = AddEquation; + exports.SubtractEquation = SubtractEquation; + exports.ReverseSubtractEquation = ReverseSubtractEquation; + exports.MinEquation = MinEquation; + exports.MaxEquation = MaxEquation; + exports.ZeroFactor = ZeroFactor; + exports.OneFactor = OneFactor; + exports.SrcColorFactor = SrcColorFactor; + exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor; + exports.SrcAlphaFactor = SrcAlphaFactor; + exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor; + exports.DstAlphaFactor = DstAlphaFactor; + exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor; + exports.DstColorFactor = DstColorFactor; + exports.OneMinusDstColorFactor = OneMinusDstColorFactor; + exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor; + exports.NeverDepth = NeverDepth; + exports.AlwaysDepth = AlwaysDepth; + exports.LessDepth = LessDepth; + exports.LessEqualDepth = LessEqualDepth; + exports.EqualDepth = EqualDepth; + exports.GreaterEqualDepth = GreaterEqualDepth; + exports.GreaterDepth = GreaterDepth; + exports.NotEqualDepth = NotEqualDepth; + exports.MultiplyOperation = MultiplyOperation; + exports.MixOperation = MixOperation; + exports.AddOperation = AddOperation; + exports.NoToneMapping = NoToneMapping; + exports.LinearToneMapping = LinearToneMapping; + exports.ReinhardToneMapping = ReinhardToneMapping; + exports.Uncharted2ToneMapping = Uncharted2ToneMapping; + exports.CineonToneMapping = CineonToneMapping; + exports.UVMapping = UVMapping; + exports.CubeReflectionMapping = CubeReflectionMapping; + exports.CubeRefractionMapping = CubeRefractionMapping; + exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping; + exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping; + exports.SphericalReflectionMapping = SphericalReflectionMapping; + exports.CubeUVReflectionMapping = CubeUVReflectionMapping; + exports.CubeUVRefractionMapping = CubeUVRefractionMapping; + exports.TextureMapping = TextureMapping; + exports.RepeatWrapping = RepeatWrapping; + exports.ClampToEdgeWrapping = ClampToEdgeWrapping; + exports.MirroredRepeatWrapping = MirroredRepeatWrapping; + exports.TextureWrapping = TextureWrapping; + exports.NearestFilter = NearestFilter; + exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter; + exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter; + exports.LinearFilter = LinearFilter; + exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter; + exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter; + exports.TextureFilter = TextureFilter; + exports.UnsignedByteType = UnsignedByteType; + exports.ByteType = ByteType; + exports.ShortType = ShortType; + exports.UnsignedShortType = UnsignedShortType; + exports.IntType = IntType; + exports.UnsignedIntType = UnsignedIntType; + exports.FloatType = FloatType; + exports.HalfFloatType = HalfFloatType; + exports.UnsignedShort4444Type = UnsignedShort4444Type; + exports.UnsignedShort5551Type = UnsignedShort5551Type; + exports.UnsignedShort565Type = UnsignedShort565Type; + exports.UnsignedInt248Type = UnsignedInt248Type; + exports.AlphaFormat = AlphaFormat; + exports.RGBFormat = RGBFormat; + exports.RGBAFormat = RGBAFormat; + exports.LuminanceFormat = LuminanceFormat; + exports.LuminanceAlphaFormat = LuminanceAlphaFormat; + exports.RGBEFormat = RGBEFormat; + exports.DepthFormat = DepthFormat; + exports.DepthStencilFormat = DepthStencilFormat; + exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format; + exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format; + exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format; + exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format; + exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format; + exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format; + exports.RGB_ETC1_Format = RGB_ETC1_Format; + exports.LoopOnce = LoopOnce; + exports.LoopRepeat = LoopRepeat; + exports.LoopPingPong = LoopPingPong; + exports.InterpolateDiscrete = InterpolateDiscrete; + exports.InterpolateLinear = InterpolateLinear; + exports.InterpolateSmooth = InterpolateSmooth; + exports.ZeroCurvatureEnding = ZeroCurvatureEnding; + exports.ZeroSlopeEnding = ZeroSlopeEnding; + exports.WrapAroundEnding = WrapAroundEnding; + exports.TrianglesDrawMode = TrianglesDrawMode; + exports.TriangleStripDrawMode = TriangleStripDrawMode; + exports.TriangleFanDrawMode = TriangleFanDrawMode; + exports.LinearEncoding = LinearEncoding; + exports.sRGBEncoding = sRGBEncoding; + exports.GammaEncoding = GammaEncoding; + exports.RGBEEncoding = RGBEEncoding; + exports.LogLuvEncoding = LogLuvEncoding; + exports.RGBM7Encoding = RGBM7Encoding; + exports.RGBM16Encoding = RGBM16Encoding; + exports.RGBDEncoding = RGBDEncoding; + exports.BasicDepthPacking = BasicDepthPacking; + exports.RGBADepthPacking = RGBADepthPacking; + exports.CubeGeometry = BoxGeometry; + exports.Face4 = Face4; + exports.LineStrip = LineStrip; + exports.LinePieces = LinePieces; + exports.MeshFaceMaterial = MultiMaterial; + exports.PointCloud = PointCloud; + exports.Particle = Sprite; + exports.ParticleSystem = ParticleSystem; + exports.PointCloudMaterial = PointCloudMaterial; + exports.ParticleBasicMaterial = ParticleBasicMaterial; + exports.ParticleSystemMaterial = ParticleSystemMaterial; + exports.Vertex = Vertex; + exports.EdgesHelper = EdgesHelper; + exports.WireframeHelper = WireframeHelper; + exports.GeometryUtils = GeometryUtils; + exports.ImageUtils = ImageUtils; + exports.Projector = Projector; + exports.CanvasRenderer = CanvasRenderer; + + Object.defineProperty(exports, '__esModule', { value: true }); + + Object.defineProperty( exports, 'AudioContext', { + get: function () { + return exports.getAudioContext(); + } + }); + + }))); + + +/***/ }, +/* 7 */ +/***/ function(module, exports) { + + module.exports = function( THREE ) { + /** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ + + // This set of controls performs orbiting, dollying (zooming), and panning. + // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). + // + // Orbit - left mouse / touch: one finger move + // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish + // Pan - right mouse, or arrow keys / touch: three finter swipe + + function OrbitControls( object, domElement ) { + + this.object = object; + + this.domElement = ( domElement !== undefined ) ? domElement : document; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new THREE.Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = - Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function () { + + return spherical.phi; + + }; + + this.getAzimuthalAngle = function () { + + return spherical.theta; + + }; + + this.reset = function () { + + scope.target.copy( scope.target0 ); + scope.object.position.copy( scope.position0 ); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent( changeEvent ); + + scope.update(); + + state = STATE.NONE; + + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = function() { + + var offset = new THREE.Vector3(); + + // so camera.up is the orbit axis + var quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) ); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new THREE.Vector3(); + var lastQuaternion = new THREE.Quaternion(); + + return function update () { + + var position = scope.object.position; + + offset.copy( position ).sub( scope.target ); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion( quat ); + + // angle from z-axis around y-axis + spherical.setFromVector3( offset ); + + if ( scope.autoRotate && state === STATE.NONE ) { + + rotateLeft( getAutoRotationAngle() ); + + } + + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + + // restrict theta to be between desired limits + spherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) ); + + // restrict phi to be between desired limits + spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) ); + + spherical.makeSafe(); + + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) ); + + // move target to panned location + scope.target.add( panOffset ); + + offset.setFromSpherical( spherical ); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion( quatInverse ); + + position.copy( scope.target ).add( offset ); + + scope.object.lookAt( scope.target ); + + if ( scope.enableDamping === true ) { + + sphericalDelta.theta *= ( 1 - scope.dampingFactor ); + sphericalDelta.phi *= ( 1 - scope.dampingFactor ); + + } else { + + sphericalDelta.set( 0, 0, 0 ); + + } + + scale = 1; + panOffset.set( 0, 0, 0 ); + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( zoomChanged || + lastPosition.distanceToSquared( scope.object.position ) > EPS || + 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) { + + scope.dispatchEvent( changeEvent ); + + lastPosition.copy( scope.object.position ); + lastQuaternion.copy( scope.object.quaternion ); + zoomChanged = false; + + return true; + + } + + return false; + + }; + + }(); + + this.dispose = function() { + + scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false ); + scope.domElement.removeEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.removeEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.removeEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.removeEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.removeEventListener( 'touchmove', onTouchMove, false ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + window.removeEventListener( 'keydown', onKeyDown, false ); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + var STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var spherical = new THREE.Spherical(); + var sphericalDelta = new THREE.Spherical(); + + var scale = 1; + var panOffset = new THREE.Vector3(); + var zoomChanged = false; + + var rotateStart = new THREE.Vector2(); + var rotateEnd = new THREE.Vector2(); + var rotateDelta = new THREE.Vector2(); + + var panStart = new THREE.Vector2(); + var panEnd = new THREE.Vector2(); + var panDelta = new THREE.Vector2(); + + var dollyStart = new THREE.Vector2(); + var dollyEnd = new THREE.Vector2(); + var dollyDelta = new THREE.Vector2(); + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow( 0.95, scope.zoomSpeed ); + + } + + function rotateLeft( angle ) { + + sphericalDelta.theta -= angle; + + } + + function rotateUp( angle ) { + + sphericalDelta.phi -= angle; + + } + + var panLeft = function() { + + var v = new THREE.Vector3(); + + return function panLeft( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix + v.multiplyScalar( - distance ); + + panOffset.add( v ); + + }; + + }(); + + var panUp = function() { + + var v = new THREE.Vector3(); + + return function panUp( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix + v.multiplyScalar( distance ); + + panOffset.add( v ); + + }; + + }(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = function() { + + var offset = new THREE.Vector3(); + + return function pan ( deltaX, deltaY ) { + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + // perspective + var position = scope.object.position; + offset.copy( position ).sub( scope.target ); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); + + // we actually don't use screenWidth, since perspective camera is fixed to screen height + panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix ); + panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix ); + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + // orthographic + panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix ); + panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix ); + + } else { + + // camera neither orthographic nor perspective + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); + scope.enablePan = false; + + } + + }; + + }(); + + function dollyIn( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale /= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + function dollyOut( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale *= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate( event ) { + + //console.log( 'handleMouseDownRotate' ); + + rotateStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownDolly( event ) { + + //console.log( 'handleMouseDownDolly' ); + + dollyStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownPan( event ) { + + //console.log( 'handleMouseDownPan' ); + + panStart.set( event.clientX, event.clientY ); + + } + + function handleMouseMoveRotate( event ) { + + //console.log( 'handleMouseMoveRotate' ); + + rotateEnd.set( event.clientX, event.clientY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleMouseMoveDolly( event ) { + + //console.log( 'handleMouseMoveDolly' ); + + dollyEnd.set( event.clientX, event.clientY ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyIn( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyOut( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleMouseMovePan( event ) { + + //console.log( 'handleMouseMovePan' ); + + panEnd.set( event.clientX, event.clientY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleMouseUp( event ) { + + //console.log( 'handleMouseUp' ); + + } + + function handleMouseWheel( event ) { + + //console.log( 'handleMouseWheel' ); + + if ( event.deltaY < 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( event.deltaY > 0 ) { + + dollyIn( getZoomScale() ); + + } + + scope.update(); + + } + + function handleKeyDown( event ) { + + //console.log( 'handleKeyDown' ); + + switch ( event.keyCode ) { + + case scope.keys.UP: + pan( 0, scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.BOTTOM: + pan( 0, - scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.LEFT: + pan( scope.keyPanSpeed, 0 ); + scope.update(); + break; + + case scope.keys.RIGHT: + pan( - scope.keyPanSpeed, 0 ); + scope.update(); + break; + + } + + } + + function handleTouchStartRotate( event ) { + + //console.log( 'handleTouchStartRotate' ); + + rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchStartDolly( event ) { + + //console.log( 'handleTouchStartDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyStart.set( 0, distance ); + + } + + function handleTouchStartPan( event ) { + + //console.log( 'handleTouchStartPan' ); + + panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchMoveRotate( event ) { + + //console.log( 'handleTouchMoveRotate' ); + + rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleTouchMoveDolly( event ) { + + //console.log( 'handleTouchMoveDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyEnd.set( 0, distance ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyIn( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleTouchMovePan( event ) { + + //console.log( 'handleTouchMovePan' ); + + panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleTouchEnd( event ) { + + //console.log( 'handleTouchEnd' ); + + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( event.button === scope.mouseButtons.ORBIT ) { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } else if ( event.button === scope.mouseButtons.ZOOM ) { + + if ( scope.enableZoom === false ) return; + + handleMouseDownDolly( event ); + + state = STATE.DOLLY; + + } else if ( event.button === scope.mouseButtons.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } + + if ( state !== STATE.NONE ) { + + document.addEventListener( 'mousemove', onMouseMove, false ); + document.addEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( startEvent ); + + } + + } + + function onMouseMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( state === STATE.ROTATE ) { + + if ( scope.enableRotate === false ) return; + + handleMouseMoveRotate( event ); + + } else if ( state === STATE.DOLLY ) { + + if ( scope.enableZoom === false ) return; + + handleMouseMoveDolly( event ); + + } else if ( state === STATE.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseMovePan( event ); + + } + + } + + function onMouseUp( event ) { + + if ( scope.enabled === false ) return; + + handleMouseUp( event ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onMouseWheel( event ) { + + if ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return; + + event.preventDefault(); + event.stopPropagation(); + + handleMouseWheel( event ); + + scope.dispatchEvent( startEvent ); // not sure why these are here... + scope.dispatchEvent( endEvent ); + + } + + function onKeyDown( event ) { + + if ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return; + + handleKeyDown( event ); + + } + + function onTouchStart( event ) { + + if ( scope.enabled === false ) return; + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + + handleTouchStartRotate( event ); + + state = STATE.TOUCH_ROTATE; + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + + handleTouchStartDolly( event ); + + state = STATE.TOUCH_DOLLY; + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + + handleTouchStartPan( event ); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + scope.dispatchEvent( startEvent ); + + } + + } + + function onTouchMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + if ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?... + + handleTouchMoveRotate( event ); + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + if ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?... + + handleTouchMoveDolly( event ); + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + if ( state !== STATE.TOUCH_PAN ) return; // is this needed?... + + handleTouchMovePan( event ); + + break; + + default: + + state = STATE.NONE; + + } + + } + + function onTouchEnd( event ) { + + if ( scope.enabled === false ) return; + + handleTouchEnd( event ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onContextMenu( event ) { + + event.preventDefault(); + + } + + // + + scope.domElement.addEventListener( 'contextmenu', onContextMenu, false ); + + scope.domElement.addEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.addEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.addEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.addEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.addEventListener( 'touchmove', onTouchMove, false ); + + window.addEventListener( 'keydown', onKeyDown, false ); + + // force an update at start + + this.update(); + + }; + + OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype ); + OrbitControls.prototype.constructor = OrbitControls; + + Object.defineProperties( OrbitControls.prototype, { + + center: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .center has been renamed to .target' ); + return this.target; + + } + + }, + + // backward compatibility + + noZoom: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + return ! this.enableZoom; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + this.enableZoom = ! value; + + } + + }, + + noRotate: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + return ! this.enableRotate; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + this.enableRotate = ! value; + + } + + }, + + noPan: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + return ! this.enablePan; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + this.enablePan = ! value; + + } + + }, + + noKeys: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + return ! this.enableKeys; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + this.enableKeys = ! value; + + } + + }, + + staticMoving : { + + get: function () { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + return ! this.enableDamping; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + this.enableDamping = ! value; + + } + + }, + + dynamicDampingFactor : { + + get: function () { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + return this.dampingFactor; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + this.dampingFactor = value; + + } + + } + + } ); + + return OrbitControls; + }; + + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + + 'use strict'; + + module.exports = function (THREE) { + + /** + * @author mrdoob / http://mrdoob.com/ + */ + THREE.OBJLoader = function (manager) { + + this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager; + }; + + THREE.OBJLoader.prototype = { + + constructor: THREE.OBJLoader, + + load: function load(url, onLoad, onProgress, onError) { + + var scope = this; + + var loader = new THREE.XHRLoader(scope.manager); + loader.load(url, function (text) { + + onLoad(scope.parse(text)); + }, onProgress, onError); + }, + + parse: function parse(text) { + + console.time('OBJLoader'); + + var object, + objects = []; + var geometry, material; + + function parseVertexIndex(value) { + + var index = parseInt(value); + + return (index >= 0 ? index - 1 : index + vertices.length / 3) * 3; + } + + function parseNormalIndex(value) { + + var index = parseInt(value); + + return (index >= 0 ? index - 1 : index + normals.length / 3) * 3; + } + + function parseUVIndex(value) { + + var index = parseInt(value); + + return (index >= 0 ? index - 1 : index + uvs.length / 2) * 2; + } + + function addVertex(a, b, c) { + + geometry.vertices.push(vertices[a], vertices[a + 1], vertices[a + 2], vertices[b], vertices[b + 1], vertices[b + 2], vertices[c], vertices[c + 1], vertices[c + 2]); + } + + function addNormal(a, b, c) { + + geometry.normals.push(normals[a], normals[a + 1], normals[a + 2], normals[b], normals[b + 1], normals[b + 2], normals[c], normals[c + 1], normals[c + 2]); + } + + function addUV(a, b, c) { + + geometry.uvs.push(uvs[a], uvs[a + 1], uvs[b], uvs[b + 1], uvs[c], uvs[c + 1]); + } + + function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) { + + var ia = parseVertexIndex(a); + var ib = parseVertexIndex(b); + var ic = parseVertexIndex(c); + var id; + + if (d === undefined) { + + addVertex(ia, ib, ic); + } else { + + id = parseVertexIndex(d); + + addVertex(ia, ib, id); + addVertex(ib, ic, id); + } + + if (ua !== undefined) { + + ia = parseUVIndex(ua); + ib = parseUVIndex(ub); + ic = parseUVIndex(uc); + + if (d === undefined) { + + addUV(ia, ib, ic); + } else { + + id = parseUVIndex(ud); + + addUV(ia, ib, id); + addUV(ib, ic, id); + } + } + + if (na !== undefined) { + + ia = parseNormalIndex(na); + ib = parseNormalIndex(nb); + ic = parseNormalIndex(nc); + + if (d === undefined) { + + addNormal(ia, ib, ic); + } else { + + id = parseNormalIndex(nd); + + addNormal(ia, ib, id); + addNormal(ib, ic, id); + } + } + } + + // create mesh if no objects in text + + if (/^o /gm.test(text) === false) { + + geometry = { + vertices: [], + normals: [], + uvs: [] + }; + + material = { + name: '' + }; + + object = { + name: '', + geometry: geometry, + material: material + }; + + objects.push(object); + } + + var vertices = []; + var normals = []; + var uvs = []; + + // v float float float + + var vertex_pattern = /v( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; + + // vn float float float + + var normal_pattern = /vn( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; + + // vt float float + + var uv_pattern = /vt( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; + + // f vertex vertex vertex ... + + var face_pattern1 = /f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?/; + + // f vertex/uv vertex/uv vertex/uv ... + + var face_pattern2 = /f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?/; + + // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ... + + var face_pattern3 = /f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/; + + // f vertex//normal vertex//normal vertex//normal ... + + var face_pattern4 = /f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/; + + // + + var lines = text.split('\n'); + + for (var i = 0; i < lines.length; i++) { + + var line = lines[i]; + line = line.trim(); + + var result; + + if (line.length === 0 || line.charAt(0) === '#') { + + continue; + } else if ((result = vertex_pattern.exec(line)) !== null) { + + // ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"] + + vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3])); + } else if ((result = normal_pattern.exec(line)) !== null) { + + // ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"] + + normals.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3])); + } else if ((result = uv_pattern.exec(line)) !== null) { + + // ["vt 0.1 0.2", "0.1", "0.2"] + + uvs.push(parseFloat(result[1]), parseFloat(result[2])); + } else if ((result = face_pattern1.exec(line)) !== null) { + + // ["f 1 2 3", "1", "2", "3", undefined] + + addFace(result[1], result[2], result[3], result[4]); + } else if ((result = face_pattern2.exec(line)) !== null) { + + // ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined] + + addFace(result[2], result[5], result[8], result[11], result[3], result[6], result[9], result[12]); + } else if ((result = face_pattern3.exec(line)) !== null) { + + // ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined] + + addFace(result[2], result[6], result[10], result[14], result[3], result[7], result[11], result[15], result[4], result[8], result[12], result[16]); + } else if ((result = face_pattern4.exec(line)) !== null) { + + // ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined] + + addFace(result[2], result[5], result[8], result[11], undefined, undefined, undefined, undefined, result[3], result[6], result[9], result[12]); + } else if (/^o /.test(line)) { + + geometry = { + vertices: [], + normals: [], + uvs: [] + }; + + material = { + name: '' + }; + + object = { + name: line.substring(2).trim(), + geometry: geometry, + material: material + }; + + objects.push(object); + } else if (/^g /.test(line)) { + + // group + + } else if (/^usemtl /.test(line)) { + + // material + + material.name = line.substring(7).trim(); + } else if (/^mtllib /.test(line)) { + + // mtl file + + } else if (/^s /.test(line)) { + + // smooth shading + + } else { + + // console.log( "THREE.OBJLoader: Unhandled line " + line ); + + } + } + + var container = new THREE.Object3D(); + var l; + + for (i = 0, l = objects.length; i < l; i++) { + + object = objects[i]; + geometry = object.geometry; + + var buffergeometry = new THREE.BufferGeometry(); + + buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3)); + + if (geometry.normals.length > 0) { + + buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3)); + } + + if (geometry.uvs.length > 0) { + + buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2)); + } + + material = new THREE.MeshLambertMaterial({ + color: 0xff0000 + }); + material.name = object.material.name; + + var mesh = new THREE.Mesh(buffergeometry, material); + mesh.name = object.name; + + container.add(mesh); + } + + console.timeEnd('OBJLoader'); + + return container; + } + + }; + }; + +/***/ }, +/* 9 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + // A class that represents a symbol replacement rule to + // be used when expanding an L-system grammar. + function Rule(prob, str) { + this.probability = prob; // The probability that this Rule will be used when replacing a character in the grammar string + this.successorString = str; // The string that will replace the char that maps to this Rule + } + + // TODO: Implement a linked list class and its requisite functions + // as described in the homework writeup + function LinkedList() { + this.head = null; + this.tail = null; + this.dictionary = null; + + this.link = function (a, b) { + a.next = b; + b.prev = a; + }; + + this.expand = function (node, iteration) { + var rules = this.dictionary[node.symbol]; + + // Randomly chooses the rule to expand from + var rv = Math.random(); + var chosenRule; + var sum = 0.0; + if (typeof rules !== "undefined") { + for (var i = 0; i < rules.length; i++) { + if (rv <= sum + rules[i].probability) { + chosenRule = rules[i]; + break; + } else { + sum += rules[i].probability; + } + } + + // Replaces node with the new list + replaceNode(this, node, chosenRule.successorString, iteration); + } + }; + } + function Node(sym) { + this.next = null; + this.prev = null; + this.symbol = sym; + this.iteration = 1; + } + + // TODO: Turn the string into linked list + function stringToLinkedList(input_string) { + // ex. assuming input_string = "F+X" + // you should return a linked list where the head is + // at Node('F') and the tail is at Node('X') + var ll = new LinkedList(); + ll.head = new Node(input_string.charAt(0)); + var currNode = ll.head; + for (var i = 1; i < input_string.length; i++) { + var n = new Node(input_string.charAt(i)); + currNode.next = n; + n.prev = currNode; + currNode = currNode.next; + } + ll.tail = currNode; + return ll; + } + + // TODO: Return a string form of the LinkedList + function linkedListToString(linkedList) { + // ex. Node1("F")->Node2("X") should be "FX" + var result = ""; + var currNode = linkedList.head; + while (currNode != null) { + result += currNode.symbol; + currNode = currNode.next; + } + return result; + } + + // TODO: Given the node to be replaced, + // insert a sub-linked-list that represents replacementString + function replaceNode(linkedList, node, replacementString, iteration) { + // Creates a linkedlist from the rule + var expanded = stringToLinkedList(replacementString); + var currNode = expanded.head; + while (currNode != null) { + // Store iteration for each node after replacement + currNode.iteration = iteration; + currNode = currNode.next; + } + var next = node.next; + expanded.tail.next = next; + if (node.prev != null) { + node.prev.next = expanded.head; + } + } + + function Lsystem(axiom, grammar, iterations) { + // default LSystem + this.axiom = "123"; + this.grammar = {}; + this.grammar['1'] = [new Rule(0.33333, 'FFA[-2]3[+3]'), new Rule(0.33333, 'FFA[W2]3[Q3]'), new Rule(0.33333, 'FFA[R2]3[E3]')]; + this.grammar['2'] = [new Rule(0.33333, 'FAF+F-F-F[FF3][+3]-F-F3'), new Rule(0.33333, 'FAFQFWFWF[FF3][Q3]WFWF3'), new Rule(0.33333, 'FAFEFRFRF[FFF3][E3]RFRF3')]; + this.grammar['3'] = [new Rule(0.33333, 'FF-F+F+F[2][-2]+F+FA2'), new Rule(0.33333, 'FFWFQFQF[2][W2]QFQFA2'), new Rule(0.33333, 'FFRFEFEF[2][R2]EFEFA2')]; + this.iterations = 0; + + // Set up the axiom string + if (typeof axiom !== "undefined") { + this.axiom = axiom; + } + + // Set up the grammar as a dictionary that + // maps a single character (symbol) to a Rule. + if (typeof grammar !== "undefined") { + this.grammar = Object.assign({}, grammar); + } + + // Set up iterations (the number of times you + // should expand the axiom in DoIterations) + if (typeof iterations !== "undefined") { + this.iterations = iterations; + } + + // A function to alter the axiom string stored + // in the L-system + this.updateAxiom = function (axiom) { + // Setup axiom + if (typeof axiom !== "undefined") { + this.axiom = axiom; + } + }; + + // TODO + // This function returns a linked list that is the result + // of expanding the L-system's axiom n times. + // The implementation we have provided you just returns a linked + // list of the axiom. + this.doIterations = function (n) { + this.iterations = n; + var lSystemLL = stringToLinkedList(this.axiom); + lSystemLL.dictionary = this.grammar; + var currNode = lSystemLL.head; + + for (var i = 1; i <= this.iterations; i++) { + var currNode = lSystemLL.head; + while (currNode != null) { + var next = currNode.next; + lSystemLL.expand(currNode, i); + currNode = next; + } + } + console.log(lSystemLL); + return lSystemLL; + }; + } + + exports.default = { + LinkedList: LinkedList, + Lsystem: Lsystem, + stringToLinkedList: stringToLinkedList, + linkedListToString: linkedListToString + }; + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _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; }; }(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var THREE = __webpack_require__(6); + + var objLoader = new THREE.OBJLoader(); + var flowGeometry; + objLoader.load('lotus_OBJ_low.obj', function (obj) { + + // LOOK: This function runs after the obj has finished loading + flowGeometry = obj.children[0].geometry; + }); + + // A class used to encapsulate the state of a turtle at a given moment. + // The Turtle class contains one TurtleState member variable. + // You are free to add features to this state class, + // such as color or whimiscality + var TurtleState = function TurtleState(pos, dir) { + return { + pos: new THREE.Vector3(pos.x, pos.y, pos.z), + dir: new THREE.Vector3(dir.x, dir.y, dir.z) + }; + }; + + var Turtle = function () { + function Turtle(scene, grammar) { + _classCallCheck(this, Turtle); + + this.state = new TurtleState(new THREE.Vector3(0, -5, -10), new THREE.Vector3(0, 1, 0)); + this.scene = scene; + this.stack = []; + this.angle = 15; + this.iteration = 1; + // TODO: Start by adding rules for '[' and ']' then more! + // Make sure to implement the functions for the new rules inside Turtle + if (typeof grammar === "undefined") { + this.renderGrammar = { + '+': this.rotateTurtle.bind(this, 0, 0, 0, -1, 0, 0), + '-': this.rotateTurtle.bind(this, 0, 0, 0, 1, 0, 0), + 'F': this.makeCylinder.bind(this, 2, 0.1), + '[': this.saveState.bind(this), + ']': this.restoreState.bind(this), + 'Q': this.rotateTurtle.bind(this, 0, 0, 0, 0, -1, 0), + 'W': this.rotateTurtle.bind(this, 0, 0, 0, 0, 1, 0), + 'E': this.rotateTurtle.bind(this, 0, 0, 0, 0, 0, -1), + 'R': this.rotateTurtle.bind(this, 0, 0, 0, 0, 0, 1), + 'A': this.drawFlower.bind(this, 2, 0.1) + }; + } else { + this.renderGrammar = grammar; + } + } + + _createClass(Turtle, [{ + key: 'drawFlower', + value: function drawFlower(len, width) { + //var tmp_turtle = this; + if (this.iteration > 0) { + //this.scene.add(mesh); + // + //var quat = new THREE.Quaternion(); + //quat.setFromUnitVectors(new THREE.Vector3(0,1,0), this.state.dir); + //var mat4 = new THREE.Matrix4(); + //mat4.makeRotationFromQuaternion(quat); + //mesh.applyMatrix(mat4); + // + //var mat5 = new THREE.Matrix4(); + //var trans = this.state.pos.add(this.state.dir.multiplyScalar(0.5 * len)); + //mat5.makeTranslation(trans.x, trans.y, trans.z); + //mesh.applyMatrix(mat5); + + //this.moveForward(len/2); + } + } + }, { + key: 'saveState', + value: function saveState() { + var newPos = this.state.pos; + var newDir = this.state.dir; + var newState = new TurtleState(newPos, newDir); + this.stack.push(newState); + } + }, { + key: 'restoreState', + value: function restoreState() { + this.state = this.stack.pop(); + } + // Resets the turtle's position to the origin + // and its orientation to the Y axis + + }, { + key: 'clear', + value: function clear() { + this.state = new TurtleState(new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 1, 0)); + } + + // A function to help you debug your turtle functions + // by printing out the turtle's current state. + + }, { + key: 'printState', + value: function printState() { + console.log(this.state.pos); + console.log(this.state.dir); + } + + // Rotate the turtle's _dir_ vector by each of the + // Euler angles indicated by the input. + + }, { + key: 'rotateTurtle', + value: function rotateTurtle(x, y, z, signx, signy, signz) { + var e = new THREE.Euler(signx * this.angle * 3.14 / 180, signy * this.angle * 3.14 / 180, signz * this.angle * 3.14 / 180); + this.state.dir.applyEuler(e); + } + + // Translate the turtle along the input vector. + // Does NOT change the turtle's _dir_ vector + + }, { + key: 'moveTurtle', + value: function moveTurtle(x, y, z) { + var new_vec = THREE.Vector3(x, y, z); + this.state.pos.add(new_vec); + } + }, { + key: 'moveForward', + + + // Translate the turtle along its _dir_ vector by the distance indicated + value: function moveForward(dist) { + var newVec = this.state.dir.multiplyScalar(dist); + this.state.pos.add(newVec); + } + }, { + key: 'makeCylinder', + + + // Make a cylinder of given length and width starting at turtle pos + // Moves turtle pos ahead to end of the new cylinder + value: function makeCylinder(len, width) { + var geometry = new THREE.CylinderGeometry(1.5 / this.iteration, 1.5 / this.iteration, len); + var material = new THREE.MeshLambertMaterial({ color: 0xba8964, side: THREE.DoubleSide }); + var cylinder = new THREE.Mesh(geometry, material); + var materialBlue = new THREE.MeshLambertMaterial({ color: 0x00ccff, side: THREE.DoubleSide }); + var mesh = new THREE.Mesh(flowGeometry, materialBlue); + this.scene.add(cylinder); + if (Math.random() < 0.25 && this.iteration > 1) { + this.scene.add(mesh); + } + + //Orient the cylinder to the turtle's current direction + var quat = new THREE.Quaternion(); + quat.setFromUnitVectors(new THREE.Vector3(0, 1, 0), this.state.dir); + var mat4 = new THREE.Matrix4(); + mat4.makeRotationFromQuaternion(quat); + cylinder.applyMatrix(mat4); + mesh.applyMatrix(mat4); + + //Move the cylinder so its base rests at the turtle's current position + var mat5 = new THREE.Matrix4(); + var trans = this.state.pos.add(this.state.dir.multiplyScalar(0.5 * len)); + mat5.makeTranslation(trans.x, trans.y, trans.z); + cylinder.applyMatrix(mat5); + mesh.applyMatrix(mat5); + //Scoot the turtle forward by len units + this.moveForward(len / 2); + } + }, { + key: 'renderSymbol', + + + // Call the function to which the input symbol is bound. + // Look in the Turtle's constructor for examples of how to bind + // functions to grammar symbols. + value: function renderSymbol(symbolNode) { + var func = this.renderGrammar[symbolNode.symbol]; + this.iteration = symbolNode.iteration; + if (func) { + func(); + } + } + }, { + key: 'renderSymbols', + + + // Invoke renderSymbol for every node in a linked list of grammar symbols. + value: function renderSymbols(linkedList) { + var currentNode; + for (currentNode = linkedList.head; currentNode != null; currentNode = currentNode.next) { + this.renderSymbol(currentNode); + } + } + }]); + + return Turtle; + }(); + + exports.default = Turtle; + +/***/ } +/******/ ]); +//# sourceMappingURL=bundle.js.map \ No newline at end of file diff --git a/bundle.js.map b/bundle.js.map new file mode 100644 index 0000000..9342dd8 --- /dev/null +++ b/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap cbbbdcfbda7dc7182283","webpack:///./src/main.js","webpack:///./src/framework.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/three/build/three.js","webpack:///./~/three-orbit-controls/index.js","webpack:///./~/three-obj-loader/dist/index.js","webpack:///./src/lsystem.js","webpack:///./src/turtle.js"],"names":["THREE","require","turtle","onLoad","framework","scene","camera","renderer","gui","stats","directionalLight","DirectionalLight","color","setHSL","position","set","multiplyScalar","add","lookAt","Vector3","updateProjectionMatrix","lsystem","Lsystem","onChange","newVal","updateAxiom","doLsystem","iterations","step","clearScene","obj","i","children","length","remove","result","doIterations","clear","angle","console","log","renderSymbols","onUpdate","init","OrbitControls","OBJLoader","callback","update","setMode","domElement","style","left","top","document","body","appendChild","GUI","window","addEventListener","Scene","PerspectiveCamera","innerWidth","innerHeight","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","controls","enableDamping","enableZoom","target","rotateSpeed","zoomSpeed","panSpeed","aspect","tick","begin","render","end","requestAnimationFrame","Rule","prob","str","probability","successorString","LinkedList","head","tail","dictionary","link","a","b","next","prev","expand","node","iteration","rules","symbol","rv","Math","random","chosenRule","sum","replaceNode","Node","sym","stringToLinkedList","input_string","ll","charAt","currNode","n","linkedListToString","linkedList","replacementString","expanded","axiom","grammar","Object","assign","lSystemLL","objLoader","flowGeometry","load","geometry","TurtleState","pos","dir","x","y","z","Turtle","state","stack","renderGrammar","rotateTurtle","bind","makeCylinder","saveState","restoreState","drawFlower","len","width","newPos","newDir","newState","push","pop","signx","signy","signz","e","Euler","applyEuler","new_vec","dist","newVec","CylinderGeometry","material","MeshLambertMaterial","side","DoubleSide","cylinder","Mesh","materialBlue","mesh","quat","Quaternion","setFromUnitVectors","mat4","Matrix4","makeRotationFromQuaternion","applyMatrix","mat5","trans","makeTranslation","moveForward","symbolNode","func","currentNode","renderSymbol"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;ACpCA;;;;AACA;;;;AACA;;;;;;AAHA,KAAMA,QAAQ,mBAAAC,CAAQ,CAAR,CAAd,C,CAAgC;;;AAKhC,KAAIC,MAAJ;;AAEA;AACA,UAASC,MAAT,CAAgBC,SAAhB,EAA2B;;AAEzB,OAAIC,QAAQD,UAAUC,KAAtB;AACA,OAAIC,SAASF,UAAUE,MAAvB;AACA,OAAIC,WAAWH,UAAUG,QAAzB;AACA,OAAIC,MAAMJ,UAAUI,GAApB;AACA,OAAIC,QAAQL,UAAUK,KAAtB;;AAEA;AACA,OAAIC,mBAAmB,IAAIV,MAAMW,gBAAV,CAA4B,QAA5B,EAAsC,CAAtC,CAAvB;AACAD,oBAAiBE,KAAjB,CAAuBC,MAAvB,CAA8B,GAA9B,EAAmC,CAAnC,EAAsC,IAAtC;AACAH,oBAAiBI,QAAjB,CAA0BC,GAA1B,CAA8B,CAA9B,EAAiC,CAAjC,EAAoC,CAApC;AACAL,oBAAiBI,QAAjB,CAA0BE,cAA1B,CAAyC,EAAzC;;AAEAX,SAAMY,GAAN,CAAUP,gBAAV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACAJ,UAAOQ,QAAP,CAAgBC,GAAhB,CAAoB,CAApB,EAAuB,CAAvB,EAA0B,EAA1B;AACAT,UAAOY,MAAP,CAAc,IAAIlB,MAAMmB,OAAV,CAAkB,CAAlB,EAAoB,CAApB,EAAsB,CAAtB,CAAd;AACAb,UAAOc,sBAAP;;AAEA;AACA,OAAIC,UAAU,IAAI,kBAAKC,OAAT,EAAd;AACApB,YAAS,qBAAWG,KAAX,CAAT;;AAEAG,OAAIS,GAAJ,CAAQX,MAAR,EAAgB,KAAhB,EAAuB,CAAvB,EAA0B,GAA1B,EAA+BiB,QAA/B,CAAwC,UAASC,MAAT,EAAiB;AACvDlB,YAAOc,sBAAP;AACD,IAFD;;AAIAZ,OAAIS,GAAJ,CAAQI,OAAR,EAAiB,OAAjB,EAA0BE,QAA1B,CAAmC,UAASC,MAAT,EAAiB;AAClDH,aAAQI,WAAR,CAAoBD,MAApB;AACAE,eAAUL,OAAV,EAAmBA,QAAQM,UAA3B,EAAuCzB,MAAvC;AACD,IAHD;;AAKAM,OAAIS,GAAJ,CAAQI,OAAR,EAAiB,YAAjB,EAA+B,CAA/B,EAAkC,EAAlC,EAAsCO,IAAtC,CAA2C,CAA3C,EAA8CL,QAA9C,CAAuD,UAASC,MAAT,EAAiB;AACtEK,gBAAW3B,MAAX;AACAwB,eAAUL,OAAV,EAAmBG,MAAnB,EAA2BtB,MAA3B;AACD,IAHD;;AAKAM,OAAIS,GAAJ,CAAQf,MAAR,EAAgB,OAAhB,EAAyB,EAAzB,EAA6B,GAA7B,EAAkC0B,IAAlC,CAAuC,CAAvC,EAA0CL,QAA1C,CAAmD,UAASC,MAAT,EAAiB;AAClEK,gBAAW3B,MAAX;AACAwB,eAAUL,OAAV,EAAmBA,QAAQM,UAA3B,EAAuCzB,MAAvC;AACD,IAHD;AAID;;AAED;AACA,UAAS2B,UAAT,CAAoB3B,MAApB,EAA4B;AAC1B,OAAI4B,GAAJ;AACA,QAAK,IAAIC,IAAI7B,OAAOG,KAAP,CAAa2B,QAAb,CAAsBC,MAAtB,GAA+B,CAA5C,EAA+CF,IAAI,CAAnD,EAAsDA,GAAtD,EAA2D;AACvDD,WAAM5B,OAAOG,KAAP,CAAa2B,QAAb,CAAsBD,CAAtB,CAAN;AACA7B,YAAOG,KAAP,CAAa6B,MAAb,CAAoBJ,GAApB;AACH;AACF;;AAED,UAASJ,SAAT,CAAmBL,OAAnB,EAA4BM,UAA5B,EAAwCzB,MAAxC,EAAgD;AAC5C,OAAIiC,SAASd,QAAQe,YAAR,CAAqBT,UAArB,CAAb;AACAzB,UAAOmC,KAAP;AACA,OAAIC,QAAQpC,OAAOoC,KAAnB;AACApC,YAAS,qBAAWA,OAAOG,KAAlB,CAAT;AACAkC,WAAQC,GAAR,CAAYtC,MAAZ;AACAA,UAAOoC,KAAP,GAAeA,KAAf;AACApC,UAAOuC,aAAP,CAAqBN,MAArB;AACH;;AAED;AACA,UAASO,QAAT,CAAkBtC,SAAlB,EAA6B,CAC5B;;AAED;AACA,qBAAUuC,IAAV,CAAexC,MAAf,EAAuBuC,QAAvB,E;;;;;;;;;;;;ACrFA;;;;AACA;;;;;;AAJA,KAAM1C,QAAQ,mBAAAC,CAAQ,CAAR,CAAd;AACA,KAAM2C,gBAAgB,mBAAA3C,CAAQ,CAAR,EAAgCD,KAAhC,CAAtB;AACA,KAAM6C,YAAY,mBAAA5C,CAAQ,CAAR,EAA4BD,KAA5B,CAAlB;;;AAIA;AACA;AACA,UAAS2C,IAAT,CAAcG,QAAd,EAAwBC,MAAxB,EAAgC;AAC9B,OAAItC,QAAQ,uBAAZ;AACAA,SAAMuC,OAAN,CAAc,CAAd;AACAvC,SAAMwC,UAAN,CAAiBC,KAAjB,CAAuBpC,QAAvB,GAAkC,UAAlC;AACAL,SAAMwC,UAAN,CAAiBC,KAAjB,CAAuBC,IAAvB,GAA8B,KAA9B;AACA1C,SAAMwC,UAAN,CAAiBC,KAAjB,CAAuBE,GAAvB,GAA6B,KAA7B;AACAC,YAASC,IAAT,CAAcC,WAAd,CAA0B9C,MAAMwC,UAAhC;;AAEA,OAAIzC,MAAM,IAAI,iBAAIgD,GAAR,EAAV;;AAEA,OAAIpD,YAAY;AACdI,UAAKA,GADS;AAEdC,YAAOA;AAFO,IAAhB;;AAKA;AACAgD,UAAOC,gBAAP,CAAwB,MAAxB,EAAgC,YAAW;;AAEzC,SAAIrD,QAAQ,IAAIL,MAAM2D,KAAV,EAAZ;AACA,SAAIrD,SAAS,IAAIN,MAAM4D,iBAAV,CAA6B,EAA7B,EAAiCH,OAAOI,UAAP,GAAkBJ,OAAOK,WAA1D,EAAuE,GAAvE,EAA4E,IAA5E,CAAb;AACA,SAAIvD,WAAW,IAAIP,MAAM+D,aAAV,CAAyB,EAAEC,WAAW,IAAb,EAAzB,CAAf;AACAzD,cAAS0D,aAAT,CAAuBR,OAAOS,gBAA9B;AACA3D,cAAS4D,OAAT,CAAiBV,OAAOI,UAAxB,EAAoCJ,OAAOK,WAA3C;AACAvD,cAAS6D,aAAT,CAAuB,QAAvB,EAAiC,CAAjC;;AAEA,SAAIC,WAAW,IAAIzB,aAAJ,CAAkBtC,MAAlB,EAA0BC,SAAS0C,UAAnC,CAAf;AACAoB,cAASC,aAAT,GAAyB,IAAzB;AACAD,cAASE,UAAT,GAAsB,IAAtB;AACAF,cAASG,MAAT,CAAgBzD,GAAhB,CAAoB,CAApB,EAAuB,CAAvB,EAA0B,CAA1B;AACAsD,cAASI,WAAT,GAAuB,GAAvB;AACAJ,cAASK,SAAT,GAAqB,GAArB;AACAL,cAASM,QAAT,GAAoB,GAApB;;AAEAtB,cAASC,IAAT,CAAcC,WAAd,CAA0BhD,SAAS0C,UAAnC;;AAEA;AACAQ,YAAOC,gBAAP,CAAwB,QAAxB,EAAkC,YAAW;AAC3CpD,cAAOsE,MAAP,GAAgBnB,OAAOI,UAAP,GAAoBJ,OAAOK,WAA3C;AACAxD,cAAOc,sBAAP;AACAb,gBAAS4D,OAAT,CAAiBV,OAAOI,UAAxB,EAAoCJ,OAAOK,WAA3C;AACD,MAJD,EAIG,KAJH;;AAMA;AACA1D,eAAUC,KAAV,GAAkBA,KAAlB;AACAD,eAAUE,MAAV,GAAmBA,MAAnB;AACAF,eAAUG,QAAV,GAAqBA,QAArB;;AAEA;AACA,MAAC,SAASsE,IAAT,GAAgB;AACfpE,aAAMqE,KAAN;AACA/B,cAAO3C,SAAP,EAFe,CAEI;AACnBG,gBAASwE,MAAT,CAAgB1E,KAAhB,EAAuBC,MAAvB,EAHe,CAGiB;AAChCG,aAAMuE,GAAN;AACAC,6BAAsBJ,IAAtB,EALe,CAKc;AAC9B,MAND;;AAQA;AACA,YAAO/B,SAAS1C,SAAT,CAAP;AACD,IA1CD;AA2CD;;mBAEc;AACbuC,SAAMA;AADO,E;;;;;;ACtEf;AACA,sBAAqB,mGAAmG,aAAa,2CAA2C,mBAAmB,SAAS,KAAK,4BAA4B,YAAY,gBAAgB,oCAAoC,WAAW,qCAAqC,gBAAgB,uBAAuB,iBAAiB,oCAAoC,eAAe,4BAA4B,uCAAuC,cAAc,iBAAiB;AAC1iB,mBAAkB,iBAAiB,oCAAoC,gBAAgB,mCAAmC,WAAW,YAAY,uBAAuB,qBAAqB,qBAAqB,EAAE,qCAAqC,2BAA2B,YAAY,WAAW,uBAAuB,iBAAiB,oCAAoC,UAAU,qCAAqC,gBAAgB,sBAAsB,cAAc,iBAAiB;AAC3e,eAAc,4BAA4B,uCAAuC,cAAc,iBAAiB,kBAAkB,iBAAiB,iBAAiB,oCAAoC,eAAe,mCAAmC,WAAW,YAAY,uBAAuB,qBAAqB,qBAAqB,6DAA6D,YAAY,WAAW,wCAAwC,kBAAkB,IAAI,UAAU;AAC9e,SAAQ,uBAAuB,MAAM,wDAAwD,OAAO,oDAAoD,aAAa,gBAAgB,iBAAiB,MAAM,gBAAgB,gBAAgB,oCAAoC,iCAAiC,gDAAgD,IAAI;AACrW,iBAAgB,SAAS,mBAAmB,gBAAgB;;;;;;;ACL5D;AACA,8C;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,qEAAoE,iCAAiC;;AAErG;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA,WAAU,iDAAiD,gBAAgB,uBAAuB,2BAA2B,qBAAqB,qBAAqB,GAAG,gBAAgB,yBAAyB,2BAA2B,gBAAgB,wBAAwB,yBAAyB,+BAA+B,GAAG,sBAAsB,0BAA0B,uBAAuB,2BAA2B,4BAA4B,gBAAgB,iBAAiB,uBAAuB,qBAAqB,kBAAkB,iBAAiB,GAAG;;;AAGlkB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,4C;AACA,YAAW;AACX;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;;AAEf;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,6BAA4B;AAC5B,QAAO;;AAEP;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,8BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;;AAEA;;;AAGA,0BAAyB,oCAAoC;AAC7D;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAuB,oCAAoC;AAC3D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA,QAAO;;AAEP;;AAEA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA,EAAC;AACD;AACA,SAAQ,gBAAgB,SAAS,UAAU,WAAW,WAAW,OAAO,eAAe,MAAM,OAAO,QAAQ,SAAS,UAAU,mBAAmB,gBAAgB,SAAS,uCAAuC,kCAAkC,oCAAoC,+BAA+B,4BAA4B,gBAAgB,0CAA0C,UAAU,gBAAgB,6BAA6B,iCAAiC,qBAAqB,yDAAyD,UAAU,uBAAuB,uCAAuC,kCAAkC,oCAAoC,+BAA+B,SAAS,kBAAkB,iBAAiB,YAAY,eAAe,kBAAkB,sBAAsB,6BAA6B,sBAAsB,MAAM,YAAY,kBAAkB,kBAAkB,kBAAkB,gBAAgB,yBAAyB,aAAa,gBAAgB,eAAe,MAAM,aAAa,OAAO,wCAAwC,mCAAmC,qCAAqC,gCAAgC,oBAAoB,YAAY,YAAY,iBAAiB,gBAAgB,oBAAoB,cAAc,UAAU,oCAAoC,aAAa,eAAe,iBAAiB,mEAAmE,SAAS,gBAAgB,SAAS,QAAQ,WAAW,iBAAiB,YAAY,mBAAmB,eAAe,WAAW,WAAW,UAAU,gBAAgB,uBAAuB,OAAO,WAAW,UAAU,wBAAwB,SAAS,eAAe,YAAY,WAAW,YAAY,iCAAiC,UAAU,cAAc,YAAY,WAAW,UAAU,iBAAiB,eAAe,YAAY,eAAe,eAAe,YAAY,4BAA4B,eAAe,cAAc,eAAe,sGAAsG,eAAe,cAAc,aAAa,kBAAkB,iBAAiB,gBAAgB,WAAW,0CAA0C,cAAc,gBAAgB,UAAU,wBAAwB,qBAAqB,gBAAgB,aAAa,sBAAsB,YAAY,aAAa,eAAe,iBAAiB,oBAAoB,aAAa,WAAW,8BAA8B,eAAe,SAAS,YAAY,kCAAkC,qBAAqB,cAAc,cAAc,YAAY,kBAAkB,aAAa,kBAAkB,kBAAkB,aAAa,eAAe,iBAAiB,kBAAkB,sBAAsB,YAAY,gBAAgB,uBAAuB,eAAe,sBAAsB,aAAa,IAAI,WAAW,sCAAsC,0BAA0B,4BAA4B,UAAU,mBAAmB,mCAAmC,SAAS,aAAa,kCAAkC,kBAAkB,mBAAmB,oBAAoB,mBAAmB,gCAAgC,gBAAgB,iBAAiB,mBAAmB,SAAS,uBAAuB,gBAAgB,YAAY,wBAAwB,gBAAgB,eAAe,kBAAkB,cAAc,gBAAgB,wBAAwB,mBAAmB,WAAW,4BAA4B,4BAA4B,eAAe,8BAA8B,sCAAsC,mfAAmf,WAAW,UAAU,8BAA8B,yBAAyB,4BAA4B,cAAc,gBAAgB,aAAa,kBAAkB,mCAAmC,wGAAwG,eAAe,8CAA8C,qBAAqB,oCAAoC,qFAAqF,gBAAgB,8BAA8B,iBAAiB,8BAA8B,eAAe,8BAA8B,gCAAgC,cAAc,eAAe,8BAA8B,gCAAgC,cAAc,6CAA6C,gBAAgB,wBAAwB,mBAAmB,aAAa,8BAA8B,mBAAmB,8BAA8B,mBAAmB,WAAW,eAAe,mBAAmB,iBAAiB,kBAAkB,mBAAmB,qBAAqB,mBAAmB,gCAAgC,mBAAmB;AACxvK;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,YAAW;;AAEX,+DAA8D,uCAAuC;;AAErG;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA6B;AAC7B;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA,mB;;;;;;AC3kHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA;AACA;AACA,6CAA4C;AAC5C,EAAC,4BAA4B;;AAE7B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yBAAwB,0BAA0B;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA,iBAAgB,YAAY;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,0BAA0B;;AAEhE;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,4BAA2B;;;AAG3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC;;AAEvC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,6BAA4B,gBAAgB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,kBAAiB;;AAEjB;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,iBAAgB;;AAEhB;;AAEA;;AAEA;AACA;AACA,uDAAsD;;AAEtD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA,2BAA0B;AAC1B;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,oEAAmE;;AAEnE;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,eAAe,eAAe;AAC/C,kBAAiB,eAAe,eAAe;AAC/C,kBAAiB,eAAe,gBAAgB;AAChD,kBAAiB,eAAe,gBAAgB;;AAEhD;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA,mBAAkB,eAAe;AACjC,mBAAkB,eAAe;AACjC,mBAAkB,eAAe;;AAEjC;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,qBAAoB,kBAAkB,kBAAkB;AACxD,qBAAoB,kBAAkB,kBAAkB;AACxD,sBAAqB,mBAAmB,oBAAoB;AAC5D,uBAAsB,oBAAoB,oBAAoB;;AAE9D;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,iBAAgB,cAAc,cAAc;AAC5C,iBAAgB,cAAc,cAAc;AAC5C,iBAAgB,cAAc,eAAe;AAC7C,iBAAgB,cAAc,eAAe;;AAE7C;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iCAAgC,YAAY;;AAE5C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iCAAgC,YAAY;;AAE5C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,kBAAiB,mBAAmB;AACpC,kBAAiB,mBAAmB;AACpC,kBAAiB,mBAAmB;;AAEpC,kBAAiB,oBAAoB;AACrC,kBAAiB,oBAAoB;AACrC,mBAAkB,qBAAqB;;AAEvC;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;;AAE9B;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,0CAAyC;;AAEzC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gBAAe,aAAa,aAAa;AACzC,gBAAe,aAAa,aAAa;AACzC,gBAAe,aAAa,cAAc;AAC1C,gBAAe,aAAa,gBAAgB;;AAE5C;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,aAAa,aAAa;AAC7C,gBAAe,iBAAiB,aAAa;AAC7C,gBAAe,aAAa,oBAAoB;AAChD,gBAAe,aAAa,cAAc;;AAE1C;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,oBAAmB,QAAQ;;AAE3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,mBAAkB,QAAQ;;AAE1B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,gCAA+B,eAAe;;AAE9C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,mBAAkB,SAAS;AAC3B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gCAA+B,8BAA8B;AAC7D,gCAA+B,8BAA8B;;AAE7D;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,iCAAgC,+BAA+B;AAC/D,iCAAgC,+BAA+B;AAC/D,iCAAgC,+BAA+B;;AAE/D;;AAEA;;AAEA;;AAEA,mCAAkC;AAClC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC,mCAAkC;AAClC,mCAAkC;;AAElC,gDAA+C;AAC/C,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA,iCAAgC,+BAA+B;AAC/D,iCAAgC,+BAA+B;;AAE/D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,mBAAkB,SAAS;;AAE3B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,mBAAkB,SAAS;;AAE3B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC,oCAAmC;AACnC,oCAAmC;;AAEnC,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,kCAAiC;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,kCAAiC;;AAEjC;;AAEA;;AAEA;;AAEA,iCAAgC;;AAEhC;;AAEA;;AAEA;AACA;;AAEA;;AAEA,mCAAkC,SAAS;;AAE3C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,SAAQ,EAAE;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,SAAS;;AAE3B;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA,mCAAkC,SAAS;;AAE3C;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,SAAS;;AAE3C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,qBAAqB;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iGAAgG;;AAEhG,kFAAiF;;AAEjF,0FAAyF;;AAEzF,iIAAgI,uDAAuD,6HAA6H,yHAAyH;;AAE7a,yEAAwE,iCAAiC;;AAEzG,4DAA2D;;AAE3D,iEAAgE;;AAEhE,qGAAoG,iFAAiF,GAAG,+IAA+I,iCAAiC,kIAAkI,yGAAyG,yDAAyD,8FAA8F,eAAe,iBAAiB,GAAG,2DAA2D,wCAAwC,GAAG,uEAAuE,mEAAmE,6DAA6D,GAAG,yFAAyF,6BAA6B,iEAAiE,iEAAiE,6BAA6B,GAAG,mGAAmG,6BAA6B,iEAAiE,iEAAiE,yCAAyC,GAAG,6DAA6D,6BAA6B,qDAAqD,8CAA8C,GAAG,6JAA6J,oCAAoC,2EAA2E,8EAA8E,uEAAuE,8DAA8D,sEAAsE,+CAA+C,2DAA2D,oCAAoC,yBAAyB,GAAG,mIAAmI,uEAAuE,0DAA0D,oDAAoD,iCAAiC,sEAAsE,gDAAgD,uCAAuC,GAAG,kCAAkC,gBAAgB,GAAG,wEAAwE,+EAA+E,GAAG,oKAAoK,2EAA2E,8DAA8D,sEAAsE,+CAA+C,uCAAuC,+CAA+C,yBAAyB,GAAG,oEAAoE,yDAAyD,GAAG,qEAAqE,iDAAiD,GAAG;;AAEv+H,+EAA8E,4BAA4B,sBAAsB,+BAA+B,+BAA+B,0DAA0D,wEAAwE,wEAAwE,8BAA8B,KAAK,wEAAwE,sCAAsC,sCAAsC,0BAA0B,qCAAqC,qCAAqC,sCAAsC,kEAAkE,0DAA0D,KAAK;;AAE10B,iFAAgF,2BAA2B,SAAS,uCAAuC,+DAA+D,KAAK,mFAAmF,0CAA0C,yBAAyB,SAAS,yCAAyC,2EAA2E,OAAO,6BAA6B;;AAEthB,sJAAqJ,iEAAiE;;AAEtN,8IAA6I;;AAE7I,+IAA8I;;AAE9I,uEAAsE;;AAEtE,qEAAoE;;AAEpE,mEAAkE;;AAElE,iEAAgE;;AAEhE,wTAAuT,YAAY,EAAE,kCAAkC,cAAc,EAAE,kCAAkC,gBAAgB,cAAc,EAAE,wCAAwC,qCAAqC,EAAE,wCAAwC,8DAA8D,mEAAmE,8BAA8B,GAAG,wBAAwB,eAAe,mBAAmB,iBAAiB,IAAI,yBAAyB,uBAAuB,wBAAwB,yBAAyB,0BAA0B,IAAI,2BAA2B,kBAAkB,gBAAgB,iBAAiB,IAAI,0DAA0D,0DAA0D,GAAG,iEAAiE,0DAA0D,GAAG,kFAAkF,8DAA8D,4CAA4C,GAAG,iFAAiF,4DAA4D,GAAG,oHAAoH,gIAAgI,GAAG;;AAE7yD,gJAA+I,uCAAuC,kBAAkB,2CAA2C,mFAAmF,mDAAmD,KAAK,UAAU,mFAAmF,mDAAmD,KAAK,gBAAgB,GAAG,6LAA6L,yDAAyD,wCAAwC,wCAAwC,gDAAgD,gDAAgD,kDAAkD,yCAAyC,mCAAmC,kDAAkD,GAAG,iMAAiM,uEAAuE,2CAA2C,gEAAgE,qDAAqD,mDAAmD,+DAA+D,yEAAyE,gCAAgC,6CAA6C,WAAW,gBAAgB,+CAA+C,uCAAuC,oBAAoB,uDAAuD,sDAAsD,4DAA4D,KAAK,yBAAyB,sDAAsD,yDAAyD,4DAA4D,KAAK,yBAAyB,sDAAsD,6DAA6D,4DAA4D,KAAK,yBAAyB,sDAAsD,qDAAqD,8DAA8D,KAAK,yBAAyB,uDAAuD,wDAAwD,8DAA8D,KAAK,UAAU,uDAAuD,4DAA4D,8DAA8D,KAAK,qBAAqB,oDAAoD,uDAAuD,6CAA6C,oDAAoD,GAAG,gIAAgI,oDAAoD,mCAAmC,wBAAwB,kCAAkC,mEAAmE,wBAAwB,6BAA6B,gCAAgC,yCAAyC,2CAA2C,2DAA2D,iEAAiE,2DAA2D,iEAAiE,2CAA2C,iCAAiC,GAAG;;AAElnI,gFAA+E,+DAA+D;;AAE9I,qGAAoG,oCAAoC,mCAAmC;;AAE3K,oKAAmK;;AAEnK,2GAA0G,sEAAsE,+CAA+C;;AAE/N,2FAA0F;;AAE1F,iFAAgF;;AAEhF,yEAAwE,iBAAiB,GAAG,6DAA6D,kEAAkE,GAAG,6DAA6D,wEAAwE,GAAG,sCAAsC,sLAAsL,GAAG,sCAAsC,uKAAuK,GAAG,sCAAsC,oEAAoE,GAAG,sCAAsC,iEAAiE,sEAAsE,sEAAsE,GAAG,yDAAyD,uDAAuD,GAAG,yDAAyD,2DAA2D,wDAAwD,6CAA6C,mDAAmD,GAAG,yDAAyD,yEAAyE,GAAG,yDAAyD,6DAA6D,mDAAmD,oDAAoD,iEAAiE,GAAG,uGAAuG,yCAAyC,0CAA0C,uDAAuD,iBAAiB,4CAA4C,+CAA+C,0BAA0B,4DAA4D,mBAAmB,GAAG,mHAAmH,wCAAwC,yCAAyC,mBAAmB,2CAA2C,wCAAwC,wCAAwC,gDAAgD,uCAAuC,GAAG;;AAErxF,iMAAgM,yEAAyE,oGAAoG,6FAA6F,sDAAsD,gJAAgJ,4DAA4D,qEAAqE,uGAAuG,oDAAoD,+JAA+J,sEAAsE,2CAA2C,yDAAyD,6IAA6I,kIAAkI,8GAA8G;;AAElnD,6GAA4G,kCAAkC,wKAAwK,sEAAsE,wCAAwC,uCAAuC,yIAAyI,qCAAqC;;AAEznB,6JAA4J,qCAAqC,oCAAoC;;AAErO,+JAA8J,qFAAqF,oFAAoF,6FAA6F,sFAAsF;;AAE1f,uHAAsH,6DAA6D,iIAAiI,sEAAsE,8EAA8E;;AAExc,mEAAkE,kDAAkD,qCAAqC,2BAA2B;;AAEpL,6IAA4I;;AAE5I,kFAAiF,oCAAoC;;AAErH,0DAAyD,4BAA4B,qCAAqC,mDAAmD,kDAAkD,gCAAgC,4CAA4C,yCAAyC,0CAA0C,4BAA4B,kDAAkD,oCAAoC,cAAc,gCAAgC,8CAA8C,sBAAsB,SAAS,+EAA+E,4DAA4D,wDAAwD,kEAAkE,6FAA6F,iBAAiB,qDAAqD,qBAAqB,SAAS,6EAA6E,4DAA4D,wDAAwD,kEAAkE,6FAA6F,iBAAiB,oDAAoD,oBAAoB,SAAS,2FAA2F,4DAA4D,wDAAwD,kEAAkE,6FAA6F,iBAAiB,qDAAqD,qBAAqB,SAAS,qFAAqF,mHAAmH,iBAAiB;;AAE9pE,oDAAmD,qEAAqE,wCAAwC,4DAA4D,gCAAgC,GAAG,qDAAqD,qBAAqB,iBAAiB,iBAAiB,uBAAuB,yBAAyB,yBAAyB,MAAM,iEAAiE,+JAA+J,iDAAiD,yDAAyD,iCAAiC,KAAK,yDAAyD,oBAAoB,iBAAiB,qBAAqB,kBAAkB,iBAAiB,uBAAuB,yBAAyB,yBAAyB,MAAM,uDAAuD,6IAA6I,6DAA6D,mDAAmD,8CAA8C,qEAAqE,6CAA6C,8HAA8H,mCAAmC,OAAO,OAAO,wCAAwC,oCAAoC,OAAO,KAAK,uDAAuD,oBAAoB,qBAAqB,iBAAiB,qBAAqB,kBAAkB,oBAAoB,wBAAwB,iBAAiB,uBAAuB,yBAAyB,yBAAyB,MAAM,oDAAoD,2IAA2I,4DAA4D,mDAAmD,8CAA8C,yEAAyE,kHAAkH,4FAA4F,4CAA4C,yIAAyI,mCAAmC,OAAO,OAAO,wCAAwC,oCAAoC,OAAO,KAAK,6DAA6D,qBAAqB,oBAAoB,uBAAuB,MAAM,gEAAgE,iHAAiH,gEAAgE,kDAAkD,4FAA4F,gEAAgE,oCAAoC,KAAK,oKAAoK,8GAA8G,qHAAqH,uHAAuH,gGAAgG,+EAA+E,kIAAkI,0DAA0D,kDAAkD,gEAAgE,KAAK,kGAAkG,qDAAqD,+GAA+G,8DAA8D,KAAK,+IAA+I,2GAA2G,oGAAoG,+GAA+G,0FAA0F,0HAA0H,0HAA0H,mGAAmG,+EAA+E,uIAAuI,+GAA+G,gEAAgE,uEAAuE,yGAAyG,iHAAiH,0FAA0F,+EAA+E,iKAAiK,mIAAmI,4GAA4G,+EAA+E,2DAA2D,KAAK;;AAE/jO,2DAA0D,2CAA2C,oCAAoC,yCAAyC,+CAA+C;;AAEjO,+DAA8D,8CAA8C,qCAAqC,uBAAuB,wBAAwB,6BAA6B,4BAA4B,IAAI,kLAAkL,4EAA4E,gDAAgD,4DAA4D,yGAAyG,oLAAoL,GAAG,iLAAiL,iGAAiG,GAAG;;AAE5pC,4DAA2D,uEAAuE,mEAAmE,6HAA6H,0IAA0I,+CAA+C,uEAAuE;;AAElkB,gEAA+D,uBAAuB,6BAA6B,wBAAwB,0CAA0C,+BAA+B,cAAc,oKAAoK,6IAA6I,GAAG,8KAA8K,4EAA4E,gDAAgD,4DAA4D,uIAAuI,wCAAwC,oLAAoL,wHAAwH,2MAA2M,aAAa,6KAA6K,iGAAiG,GAAG,6MAA6M,6FAA6F,0BAA0B,yGAAyG,wCAAwC,mLAAmL,mNAAmN,aAAa,ugBAAugB,kHAAkH,GAAG;;AAEpyG,qDAAoD,sCAAsC,2BAA2B,gDAAgD,4BAA4B,gFAAgF,oBAAoB,sBAAsB,SAAS,oCAAoC,yEAAyE,4PAA4P,+EAA+E,KAAK,qFAAqF,oBAAoB,qBAAqB,SAAS,kCAAkC,uEAAuE,iPAAiP,+EAA+E,KAAK,kGAAkG,oBAAoB,oBAAoB,SAAS,gDAAgD,qFAAqF,2RAA2R,+EAA+E,KAAK,gHAAgH,2GAA2G,wEAAwE,mDAAmD,+DAA+D,qBAAqB,SAAS,sFAAsF,OAAO,oKAAoK,mFAAmF,mLAAmL,uJAAuJ,oDAAoD,2GAA2G;;AAE7qG,uJAAsJ;;AAEtJ,yFAAwF,6DAA6D;;AAErJ,oHAAmH,0CAA0C;;AAE7J,gIAA+H,qEAAqE,qEAAqE;;AAEzQ,gFAA+E,gDAAgD,+BAA+B;;AAE9J,mEAAkE;;AAElE,sKAAqK,iDAAiD;;AAEtN,gFAA+E,0BAA0B;;AAEzG,iEAAgE,kFAAkF,wCAAwC;;AAE1L,8FAA6F;;AAE7F,8HAA6H,2EAA2E,2EAA2E,2EAA2E;;AAE9V,iIAAgI,sDAAsD;;AAEtL,+HAA8H,4EAA4E,4EAA4E,4EAA4E,wGAAwG,4EAA4E,4EAA4E,4EAA4E;;AAE9qB,uGAAsG,kCAAkC;;AAExI,4IAA2I,iGAAiG,iDAAiD,2DAA2D,uFAAuF,mGAAmG;;AAElhB,qFAAoF,6BAA6B,4DAA4D,oCAAoC,oCAAoC,gCAAgC,gCAAgC,oDAAoD,qDAAqD,sCAAsC,8DAA8D,sCAAsC,iCAAiC,qCAAqC,KAAK;;AAEnnB,+DAA8D,2CAA2C,GAAG,+CAA+C,+BAA+B,GAAG,wCAAwC,0CAA0C,0EAA0E,uEAAuE,sCAAsC,4CAA4C,iDAAiD,iCAAiC,yBAAyB,GAAG,8CAA8C,mCAAmC,GAAG,mGAAmG,6CAA6C,GAAG,yGAAyG,+CAA+C,GAAG,kGAAkG,iEAAiE,GAAG,qGAAqG,gEAAgE,GAAG;;AAEhzC,uGAAsG;;AAEtG,2FAA0F,wEAAwE,sDAAsD;;AAExN,iEAAgE,kFAAkF,wCAAwC;;AAE1L,8FAA6F;;AAE7F,8IAA6I,6DAA6D,8FAA8F,uDAAuD,iGAAiG,yDAAyD,kFAAkF,2EAA2E,KAAK,sFAAsF,2CAA2C,0CAA0C,wDAAwD,yFAAyF,yFAAyF,yFAAyF,yFAAyF,wCAAwC,mCAAmC,mCAAmC,iCAAiC,eAAe,KAAK,wHAAwH,uCAAuC,kCAAkC,4HAA4H,2CAA2C,sEAAsE,+CAA+C,0BAA0B,4FAA4F,iDAAiD,iDAAiD,iDAAiD,iDAAiD,w0BAAw0B,mGAAmG,iDAAiD,iDAAiD,iDAAiD,iDAAiD,0+BAA0+B,uFAAuF,mBAAmB,iBAAiB,KAAK,+CAA+C,2BAA2B,qEAAqE,0BAA0B,oDAAoD,yBAAyB,4CAA4C,2CAA2C,kCAAkC,uDAAuD,OAAO,kCAAkC,kCAAkC,6CAA6C,OAAO,kCAAkC,kCAAkC,2CAA2C,qCAAqC,OAAO,gEAAgE,KAAK,6HAA6H,0EAA0E,6CAA6C,+CAA+C,qEAAqE,+IAA+I,4zBAA4zB,2FAA2F,iBAAiB;;AAEzhN,0IAAyI,6DAA6D,4FAA4F,uDAAuD,+FAA+F,yDAAyD;;AAEjf,4FAA2F,oBAAoB,SAAS,kFAAkF,KAAK,yDAAyD,qBAAqB,SAAS,oEAAoE,KAAK,0DAA0D,sBAAsB,SAAS,sEAAsE,KAAK;;AAEnhB,yDAAwD,uBAAuB,wFAAwF,oBAAoB,oBAAoB,SAAS,gDAAgD,yNAAyN,KAAK,6DAA6D,oBAAoB,qBAAqB,SAAS,kCAAkC,+KAA+K,KAAK,gEAAgE,oBAAoB,sBAAsB,SAAS,oCAAoC,0LAA0L,KAAK,sCAAsC,GAAG;;AAE1qC,6FAA4F,iDAAiD,iDAAiD,iDAAiD;;AAE/O,6EAA4E,mCAAmC,2DAA2D,mCAAmC,oCAAoC,8CAA8C,0BAA0B,sDAAsD,yDAAyD,mDAAmD,oDAAoD,6BAA6B,wEAAwE,wEAAwE,wEAAwE,wEAAwE,2CAA2C,oBAAoB,OAAO,sDAAsD,8CAA8C,2CAA2C,oBAAoB,OAAO;;AAE5jC,wGAAuG,+BAA+B,oDAAoD,oDAAoD,oDAAoD,oDAAoD,2CAA2C;;AAEjY,gFAA+E,0CAA0C,0CAA0C,0CAA0C,0CAA0C,8DAA8D,sEAAsE;;AAE3X,qDAAoD,+EAA+E,uCAAuC,kCAAkC;;AAE5M,2FAA0F;;AAE1F,gHAA+G;;AAE/G,+GAA8G,sCAAsC,wCAAwC,uCAAuC,GAAG,0CAA0C,iCAAiC,uDAAuD,GAAG,8MAA8M,iCAAiC,qGAAqG,GAAG,iDAAiD,iCAAiC,8CAA8C,4GAA4G,GAAG;;AAEj7B,gRAA+Q;;AAE/Q,8QAA6Q,8BAA8B;;AAE3S,qSAAoS;;AAEpS,oGAAmG;;AAEnG,mGAAkG,sBAAsB;;AAExH,sFAAqF;;AAErF,wNAAuN,2EAA2E;;AAElS,6CAA4C,sBAAsB,wBAAwB,8BAA8B,kCAAkC,6FAA6F,8BAA8B,GAAG;;AAExR,+CAA8C,kCAAkC,iEAAiE,2DAA2D;;AAE5M,uEAAsE,4OAA4O,2EAA2E,4DAA4D,mOAAmO,sFAAsF,aAAa;;AAE/vB,wQAAuQ,2RAA2R;;AAEliB,iDAAgD,8BAA8B,iGAAiG,kIAAkI,GAAG;;AAEpT,uDAAsD,+IAA+I,2PAA2P,GAAG;;AAEnc,mDAAkD,sBAAsB,8BAA8B,kCAAkC,iDAAiD,kBAAkB,8DAA8D,yEAAyE,oDAAoD,GAAG;;AAEzY,mDAAkD,kCAAkC,iEAAiE,2DAA2D;;AAEhN,8CAA6C,wBAAwB,yBAAyB,0BAA0B,8BAA8B,gLAAgL,8FAA8F,cAAc,KAAK,qCAAqC,iDAAiD,qGAAqG,yDAAyD,6IAA6I;;AAExzB,6CAA4C,+BAA+B,8BAA8B,4IAA4I,oEAAoE,8DAA8D,gDAAgD,yEAAyE;;AAEhf,6CAA4C,wBAAwB,8CAA8C,2ZAA2Z,wFAAwF,iOAAiO,+CAA+C,gDAAgD,sDAAsD,kDAAkD,qFAAqF,iHAAiH,6IAA6I;;AAEh2C,6TAA4T,wgBAAwgB;;AAEp0B,+CAA8C,wBAAwB,wBAAwB,2BAA2B,iDAAiD,2mBAA2mB,wFAAwF,yGAAyG,0CAA0C,sTAAsT,+GAA+G,0GAA0G,0DAA0D,yGAAyG,4IAA4I,iHAAiH,6IAA6I;;AAE5jE,oEAAmE,iDAAiD,2XAA2X,4iBAA4iB;;AAE3hC,4DAA2D,wBAAwB,wBAAwB,0BAA0B,wBAAwB,2qBAA2qB,wFAAwF,yGAAyG,0CAA0C,0iBAA0iB,uFAAuF,6IAA6I;;AAEj0D,kEAAiE,8CAA8C,yXAAyX,iTAAiT,+QAA+Q,4FAA4F;;AAEpoC,kEAAiE,wBAAwB,0BAA0B,0BAA0B,wBAAwB,8CAA8C,qCAAqC,wCAAwC,6BAA6B,8CAA8C,swBAAswB,wFAAwF,yGAAyG,0CAA0C,qnBAAqnB,yDAAyD,6IAA6I;;AAEvpE,wEAAuE,8CAA8C,gYAAgY,iTAAiT,+QAA+Q,gEAAgE;;AAErnC,2CAA0C,uBAAuB,sIAAsI,sGAAsG,sCAAsC;;AAEnV,0CAAyC,kJAAkJ,iDAAiD,kKAAkK;;AAE9Y,0CAAyC,wBAAwB,+QAA+Q,4EAA4E,iDAAiD,0KAA0K,yDAAyD,6IAA6I;;AAE7zB,wCAAuC,sBAAsB,8KAA8K,wKAAwK,mCAAmC,gJAAgJ;;AAEtkB,2CAA0C,yKAAyK,+EAA+E,GAAG;;AAErS,oEAAmE,wHAAwH;;AAE3L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,iCAAgC;;AAEhC;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,0DAAyD;AACzD,0CAAyC;AACzC,0CAAyC;;AAEzC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,eAAc,YAAY;;AAE1B;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,uBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,cAAa,+BAA+B;AAC5C,cAAa,aAAa;;AAE1B,UAAS,cAAc;AACvB,mBAAkB,mCAAmC;;AAErD,kBAAiB,cAAc;AAC/B,eAAc,cAAc;;AAE5B,aAAY,cAAc;AAC1B,iBAAgB,aAAa;AAC7B,mBAAkB,aAAa;AAC/B,sBAAqB;;AAErB,IAAG;;AAEH;;AAEA,YAAW,cAAc;AACzB,qBAAoB;;AAEpB,IAAG;;AAEH;;AAEA,eAAc,cAAc;AAC5B,wBAAuB;;AAEvB,IAAG;;AAEH;;AAEA,kBAAiB;;AAEjB,IAAG;;AAEH;;AAEA,cAAa,cAAc;AAC3B,gBAAe;;AAEf,IAAG;;AAEH;;AAEA,gBAAe,cAAc;AAC7B,kBAAiB;;AAEjB,IAAG;;AAEH;;AAEA,sBAAqB,cAAc;AACnC,wBAAuB,WAAW;AAClC,uBAAsB;;AAEtB,IAAG;;AAEH;;AAEA,mBAAkB;;AAElB,IAAG;;AAEH;;AAEA,mBAAkB;;AAElB,IAAG;;AAEH;;AAEA,iBAAgB,iBAAiB;AACjC,cAAa,WAAW;AACxB,aAAY,cAAc;AAC1B,eAAc;;AAEd,IAAG;;AAEH;;AAEA,wBAAuB,YAAY;;AAEnC,wBAAuB;AACvB,kBAAiB;AACjB,cAAa;;AAEb,eAAc;AACd,mBAAkB;AAClB,qBAAoB;AACpB;AACA,KAAI,EAAE;;AAEN,2BAA0B,YAAY;AACtC,8BAA6B,YAAY;;AAEzC,iBAAgB;AAChB,cAAa;AACb,iBAAgB;AAChB,kBAAiB;AACjB,iBAAgB;AAChB,gBAAe;AACf,oBAAmB;AACnB,cAAa;;AAEb,eAAc;AACd,mBAAkB;AAClB,qBAAoB;AACpB;AACA,KAAI,EAAE;;AAEN,oBAAmB,YAAY;AAC/B,uBAAsB,YAAY;;AAElC,kBAAiB;AACjB,cAAa;AACb,iBAAgB;AAChB,cAAa;AACb,iBAAgB;;AAEhB,eAAc;AACd,mBAAkB;AAClB,qBAAoB;AACpB;AACA,KAAI,EAAE;;AAEN,qBAAoB,YAAY;AAChC,wBAAuB,YAAY;;AAEnC,uBAAsB;AACtB,kBAAiB;AACjB,iBAAgB;AAChB;AACA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA,cAAa,+BAA+B;AAC5C,cAAa,aAAa;AAC1B,WAAU,aAAa;AACvB,YAAW,aAAa;AACxB,UAAS,cAAc;AACvB,mBAAkB;;AAElB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAiB;AACjB;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAiB,+BAA+B;AAChD,kBAAiB,+BAA+B;AAChD,kBAAiB;AACjB;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAiB,+BAA+B;AAChD,kBAAiB,aAAa;AAC9B,kBAAiB,WAAW;AAC5B,yBAAwB,WAAW;AACnC;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA,kBAAiB,WAAW;AAC5B,kBAAiB,WAAW;AAC5B,kBAAiB;AACjB;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,gBAAe;;AAEf,KAAI;;AAEJ;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA,aAAY,cAAc;AAC1B,aAAY,aAAa;AACzB,eAAc;AACd,KAAI;;AAEJ;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA,iBAAgB,cAAc;AAC9B,aAAY;AACZ,KAAI;;AAEJ;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,gBAAe;;AAEf,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,iBAAgB,WAAW;AAC3B,0BAAyB;AACzB;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mCAAkC;;AAElC,mCAAkC;AAClC,0BAAyB;AACzB,8BAA6B;;AAE7B,sCAAqC;;AAErC,+BAA8B;AAC9B,yBAAwB;;AAExB,wBAAuB;AACvB,iCAAgC;;AAEhC,oBAAmB;;AAEnB,iBAAgB;;AAEhB,4BAA2B;;AAE3B,gCAA+B;;AAE/B,uEAAsE;AACtE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;;AAElE,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;;AAEhD,6EAA4E;AAC5E,6EAA4E;;AAE5E,SAAQ;;AAER,4FAA2F;;AAE3F,QAAO;;AAEP;;AAEA;;AAEA,mCAAkC;;AAElC,6BAA4B;AAC5B,6BAA4B;AAC5B,0BAAyB;;AAEzB,wBAAuB;AACvB,iCAAgC;;AAEhC,oBAAmB;;AAEnB;;AAEA,gCAA+B;;AAE/B,mDAAkD;;AAElD;;AAEA,SAAQ,8BAA8B;;AAEtC,8CAA6C;;AAE7C;;AAEA,SAAQ,OAAO;;AAEf,8CAA6C;AAC7C,4CAA2C;AAC3C,gCAA+B;AAC/B,mCAAkC;;AAElC,SAAQ;;AAER,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;;AAGA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;AACA;;AAEA,oDAAmD,QAAQ;;AAE3D;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,kEAAiE;;AAEjE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;;AAGA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sDAAqD;;AAErD,mCAAkC;AAClC,oCAAmC;AACnC,6BAA4B;AAC5B,yBAAwB;AACxB,4BAA2B;AAC3B,2BAA0B;;AAE1B,8BAA6B;AAC7B,wBAAuB;;AAEvB,uBAAsB;;AAEtB,mBAAkB;;AAElB,qCAAoC;;AAEpC,+CAA8C;;AAE9C,4BAA2B;AAC3B,qGAAoG;AACpG,qGAAoG;;AAEpG,0BAAyB;;AAEzB,oEAAmE;AACnE,2CAA0C;AAC1C,wDAAuD;;AAEvD,mCAAkC;;AAElC,OAAM;;AAEN;;AAEA;;AAEA,sDAAqD;;AAErD,yBAAwB;AACxB,4BAA2B;AAC3B,4BAA2B;;AAE3B,0BAAyB;AACzB,4BAA2B;AAC3B,+BAA8B;AAC9B,4BAA2B;AAC3B,2BAA0B;AAC1B,8BAA6B;;AAE7B,uBAAsB;;AAEtB,mBAAkB;;AAElB,4CAA2C;;AAE3C,4CAA2C;;AAE3C,uEAAsE;;AAEtE,2BAA0B;;AAE1B,sDAAqD;AACrD,8BAA6B;;AAE7B,6BAA4B;;AAE5B,0DAAyD;;AAEzD,SAAQ,OAAO;;AAEf,qCAAoC;AACpC,8EAA6E;AAC7E,wDAAuD;;AAEvD,SAAQ;;AAER,wFAAuF;;AAEvF,QAAO;;AAEP,OAAM;;AAEN;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gCAA+B;AAC/B,gCAA+B;;AAE/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,yBAAwB;;AAExB;AACA;AACA;;AAEA;AACA;;AAEA,qBAAoB;;AAEpB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA,kBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,2CAA0C;;AAE1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,qBAAoB,SAAS;AAC7B;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,iBAAiB;;AAEzC,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA;;AAEA;;AAEA;AACA,8BAA6B,kBAAkB;;AAE/C;AACA;AACA;AACA;AACA,gBAAe,oBAAoB;AACnC,iBAAgB,gBAAgB,aAAa,iBAAiB,YAAY,EAAE;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,qCAAoC,6EAA6E,GAAG;AACpH,uCAAsC,8CAA8C,GAAG;;AAEvF;;AAEA;AACA;;AAEA,oBAAmB;AACnB,uBAAsB;AACtB,yBAAwB;;AAExB,yBAAwB;AACxB,6BAA4B;AAC5B,6BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,8CAA6C,QAAQ;;AAErD;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;;AAEA;;AAEA,iDAAgD,QAAQ;;AAExD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;;AAEjF;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,eAAe;AAChC,kBAAiB,eAAe;AAChC,kBAAiB,eAAe;;AAEhC;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iCAAgC,YAAY;;AAE5C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iCAAgC,YAAY;;AAE5C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;;AAE9B;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,iBAAgB,iBAAiB;AACjC,iBAAgB,iBAAiB;AACjC,iBAAgB,iBAAiB;;AAEjC;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,mBAAkB,OAAO;;AAEzB;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA,+CAA8C;;AAE9C;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;AAGH;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,mBAAkB,iCAAiC;;AAEnD;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA,kBAAiB;;AAEjB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,wBAAuB,kBAAkB;;AAEzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,4CAA2C,QAAQ;;AAEnD;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,SAAQ;;AAER;;AAEA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;;AAIH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,sC;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,qBAAoB,sBAAsB;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,4BAA2B,gBAAgB;;AAE3C;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,qBAAoB,sBAAsB;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,4BAA2B,kBAAkB;;AAE7C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH,0BAAyB;;AAEzB;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB;AACnB,mBAAkB;AAClB,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,gDAA+C;AAC/C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,0BAA0B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,4BAA4B;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA,8BAA6B,kBAAkB;;AAE/C;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA,qBAAoB,qBAAqB;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,sDAAqD,QAAQ;;AAE7D;;AAEA;;AAEA,qDAAoD,QAAQ;;AAE5D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,uBAAsB;;AAEtB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;;AAEA;;AAEA,4CAA2C,QAAQ;;AAEnD;AACA;;AAEA,qDAAoD,QAAQ;;AAE5D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA0B,sBAAsB;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sBAAqB,mBAAmB;;AAExC;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;;AAEA;;AAEA;;AAEA,MAAK;;AAEL,sBAAqB,oBAAoB;;AAEzC;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ,qBAAoB,0BAA0B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4CAA2C,QAAQ;;AAEnD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,iDAAgD,QAAQ;;AAExD;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,0CAAyC,QAAQ;;AAEjD;AACA,wBAAuB;;AAEvB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA,oCAAmC,QAAQ;;AAE3C;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,oDAAmD,QAAQ;;AAE3D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mDAAkD,QAAQ;;AAE1D;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA,yBAAwB;AACxB;;AAEA;AACA,4BAA2B;AAC3B;AACA;AACA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;;AAGA;AACA;AACA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,qBAAoB,OAAO;;AAE3B;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,6CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA,iDAAgD,QAAQ;;AAExD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,oBAAmB,YAAY;;AAE/B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,oBAAmB,YAAY;;AAE/B;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,0BAA0B;;AAE7C;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAmB,uBAAuB;;AAE1C;;AAEA;AACA,2BAA0B;AAC1B;AACA;AACA;AACA;AACA;;AAEA;;AAEA,yCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,kDAAiD;AACjD;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA,sDAAqD,QAAQ;;AAE7D;;AAEA;;AAEA;;AAEA;;AAEA,gDAA+C,QAAQ;;AAEvD;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA,GAAE;;AAEF;AACA,8BAA6B,kBAAkB;;AAE/C;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,oBAAmB,kBAAkB;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,wBAAwB;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,wBAAwB;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,oBAAmB,kBAAkB;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,wBAAwB;;AAE5C;;AAEA;;AAEA;;AAEA,qBAAoB,wBAAwB;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,qBAAoB;;AAEpB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0CAAyC,QAAQ;;AAEjD;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,6CAA4C,QAAQ;;AAEpD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,iDAAgD,4BAA4B;;AAE5E;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA,sBAAqB,cAAc;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iBAAgB,eAAe;;AAE/B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,+EAA8E,kCAAkC;;AAEhH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,OAAO;;AAEjD;AACA;AACA;;AAEA;;AAEA;;AAEA,sDAAqD;AACrD;;AAEA;;AAEA;;AAEA,OAAM;;;AAGN,6CAA4C,OAAO;;AAEnD;AACA;AACA;;AAEA;;AAEA;;AAEA,gCAA+B;AAC/B;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kDAAiD,QAAQ;;AAEzD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;;AAEnG;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;AACA,uBAAsB;AACtB,uBAAsB;AACtB,uBAAsB;;AAEtB,qBAAoB;;AAEpB;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,aAAa;;AAEjC;;AAEA,sBAAqB,aAAa;;AAElC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B,kBAAiB,YAAY;;AAE7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB,aAAa;;AAEhC;;AAEA,qBAAoB,aAAa;;AAEjC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,YAAY;;AAE/B,qBAAoB,YAAY;;AAEhC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,uBAAsB;AACtB,uBAAsB;;AAEtB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+DAA8D;;AAE9D;AACA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,kEAAiE;;AAEjE;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+DAA8D;;AAE9D;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kEAAiE;;AAEjE;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,kBAAkB;;AAEpC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oDAAmD,+DAA+D,EAAE;;AAEpH;;AAEA;;AAEA;AACA,oDAAmD,0DAA0D,EAAE;;AAE/G;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,oDAAmD,oDAAoD,EAAE;;AAEzG;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,OAAO;;AAEzB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,YAAY,aAAa,eAAe,GAAG;;AAEnF;;AAEA;;AAEA,oCAAmC,qBAAqB;;AAExD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,mDAAkD;AAClD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B;AAC9B,mCAAkC;AAClC,oCAAmC;AACnC,8BAA6B;AAC7B,gCAA+B;AAC/B,kCAAiC;;AAEjC,8BAA6B;AAC7B,4BAA2B;AAC3B,wBAAuB;;AAEvB;;AAEA,4BAA2B;;AAE3B;;AAEA;;AAEA,mCAAkC;AAClC,mCAAkC;AAClC,mCAAkC;AAClC,mCAAkC;;AAElC;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA,gCAA+B;AAC/B,iCAAgC;;AAEhC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mDAAkD;AAClD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,8BAA6B;AAC7B,kCAAiC;;AAEjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,KAAI;;AAEJ;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;;AAGH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;AACA;;AAEA,gCAA+B;;AAE/B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,mDAAkD,OAAO;;AAEzD;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,OAAO;;AAE3B;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;;AAIA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;;AAEA;;AAEA;;AAEA,SAAQ;;AAER;;AAEA;;AAEA,QAAO;;AAEP;;AAEA,6CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA,WAAU;;AAEV;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,mCAAkC;AAClC;;AAEA;AACA;AACA;;AAEA,oBAAmB,WAAW;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kDAAiD,SAAS;;AAE1D;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,sBAAqB,oBAAoB;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB;AACpB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,8BAA8B;;AAEjD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,eAAc;;AAEd;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA,8BAA6B;;AAE7B;;AAEA,qBAAoB,eAAe;;AAEnC;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,yBAAwB;;AAExB;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,0BAAyB;AACzB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4BAA2B,kDAAkD;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,YAAW,QAAQ;;AAEnB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,4CAA2C,OAAO;;AAElD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uDAAsD,OAAO;;AAE7D;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kDAAiD,OAAO;;AAExD;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA;;AAEA,wEAAuE,QAAQ;;AAE/E;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;;AAGA,KAAI;;AAEJ;;AAEA,kDAAiD;;AAEjD;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA,QAAO;;AAEP;;AAEA,QAAO;;AAEP;;AAEA,QAAO;;AAEP;;AAEA,QAAO;;AAEP;;AAEA,QAAO;;AAEP;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,SAAQ;;AAER;;AAEA;;AAEA;AACA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,SAAQ;;AAER;;AAEA;;AAEA;AACA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4CAA2C,OAAO;;AAElD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,SAAQ;;AAER;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,OAAO;;AAEjD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,2BAA2B;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,2BAA2B;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;AACA;AACA;;AAEA,6BAA4B;AAC5B,2BAA0B;;AAE1B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oEAAmE;;AAEnE;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,+CAA8C;AAC9C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,oCAAmC,QAAQ;;AAE3C;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,0BAAyB;;AAEzB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,kDAAiD,OAAO;;AAExD;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gBAAe,QAAQ;;AAEvB;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,mBAAmB;;AAEtC;;AAEA;;AAEA;;AAEA;;AAEA,0BAAyB,qCAAqC;;AAE9D;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;AACA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA,aAAY,OAAO;;AAEnB;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA,iBAAgB;;AAEhB;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA,kDAAiD;AACjD;AACA;;AAEA;AACA;;AAEA,+FAA8F;AAC9F;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,6CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,4CAA2C,QAAQ;;AAEnD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,4CAA2C,QAAQ;;AAEnD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,4CAA2C,QAAQ;;AAEnD;;AAEA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,6CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qDAAoD,QAAQ;;AAE5D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,qDAAoD,QAAQ;;AAE5D;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,qBAAoB,sCAAsC;;AAE1D;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN,4BAA2B;;AAE3B;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,qBAAoB,sBAAsB;;AAE1C;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN,6BAA4B;;AAE5B;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,+EAA8E,kCAAkC;;AAEhH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,+CAA8C,OAAO;;AAErD;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,kDAAiD;;AAEjD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAQ;;AAER;;AAEA,OAAM;;AAEN,qDAAoD,OAAO;;AAE3D;AACA;;AAEA;;AAEA;;AAEA,kDAAiD;;AAEjD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAQ;;AAER;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA,sBAAqB,oBAAoB;;AAEzC;;AAEA;;AAEA,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,4EAA2E,kCAAkC;;AAE7G;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,4CAA2C,QAAQ;;AAEnD;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN,iDAAgD,OAAO;;AAEvD;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,2CAA0C,OAAO;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,iBAAgB;AAChB;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iBAAgB;;AAEhB;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;;AAEA,qBAAoB,OAAO;;AAE3B;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,OAAO;;AAExC,qBAAoB,OAAO;;AAE3B;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;AACA;;AAEA,8CAA6C,QAAQ;;AAErD,uBAAsB,OAAO;;AAE7B;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,OAAO;;AAEzC,sBAAqB,OAAO;;AAE5B;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;;AAEA,kCAAiC,OAAO;;AAExC,sBAAqB,OAAO;;AAE5B;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,eAAc,aAAa;;AAE3B;;AAEA,gBAAe,aAAa;;AAE5B;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,eAAc,YAAY;;AAE1B,gBAAe,YAAY;;AAE3B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,oBAAmB,oBAAoB;;AAEvC;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iBAAgB,WAAW;;AAE3B;;AAEA;AACA;;AAEA;;AAEA,iBAAgB,WAAW;;AAE3B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,WAAW;;AAE1B,iBAAgB,0BAA0B;;AAE1C;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,yBAAyB;;AAE5C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,yBAAyB;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,qBAAqB;;AAExC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA0B,yBAAyB;;AAEnD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC,gBAAe,qBAAqB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B,OAAO;;AAErC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,kBAAiB;AACjB,kBAAiB;AACjB,kBAAiB;;AAEjB,iBAAgB,OAAO;;AAEvB;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB;AACnB,oBAAmB;AACnB,oBAAmB;;AAEnB;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,OAAO;;AAExB,MAAK;;AAEL,kBAAiB,OAAO;;AAExB;;AAEA;;AAEA;;AAEA,wBAAuB;;AAEvB,sBAAqB,QAAQ;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,YAAW,yBAAyB;AACpC,gBAAe,uBAAuB;AACtC,gBAAe,uBAAuB;;AAEtC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA,8BAA6B,QAAQ;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe;AACf,+CAA8C;;AAE9C,MAAK;;AAEL;AACA;AACA;;AAEA;AACA,4DAA2D;AAC3D,4DAA2D;AAC3D;AACA;;AAEA;AACA,sDAAqD;AACrD,4BAA2B;;AAE3B;AACA;AACA;;AAEA,wFAAuF;AACvF;;AAEA;AACA;AACA;;AAEA,wFAAuF;AACvF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;;AAEA,OAAM;;AAEN;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,kCAAiC,aAAa;AAC9C;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA,kCAAiC;AACjC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,qBAAoB,qBAAqB;;AAEzC,0BAAyB;AACzB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;;AAEhD;AACA,sBAAqB,uBAAuB;;AAE5C,2BAA0B;AAC1B;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,uCAAsC,2BAA2B;;AAEjE;AACA;;AAEA;AACA,uBAAsB,uBAAuB;;AAE7C;;AAEA;AACA;AACA;;AAEA;AACA,yBAAwB,kBAAkB;;AAE1C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,oCAAmC;;AAEnC,oCAAmC;;AAEnC;AACA,mCAAkC;;AAElC;;AAEA;;AAEA,kBAAiB;;AAEjB;;;AAGA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uEAAsE;AACtE;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA,iBAAgB,OAAO;;AAEvB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,QAAQ;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0FAAyF;AACzF,4FAA2F;AAC3F;;AAEA,uFAAsF;;AAEtF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,yBAAwB;;AAExB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB;AACnB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB;;AAEnB;;;AAGA;;AAEA;;AAEA,0BAAyB;;AAEzB,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,4CAA2C;;AAE3C;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,8BAA6B;AAC7B;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,+DAA8D,QAAQ;;AAEtE;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA,0DAAyD,QAAQ;;AAEjE;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA,eAAc,mBAAmB;;AAEjC,8BAA6B,OAAO;;AAEpC;AACA;AACA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA,oCAAmC,QAAQ;;AAE3C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,eAAc,YAAY;;AAE1B,gBAAe,UAAU;;AAEzB;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,iBAAgB,oBAAoB;AACpC,+BAA8B,QAAQ;;AAEtC;AACA;AACA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;AACA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA,oCAAmC,QAAQ;;AAE3C;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,mBAAkB;AAClB;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,iBAAgB,QAAQ;;AAExB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,mBAAkB,qBAAqB;;AAEvC;;AAEA;;AAEA,oBAAmB,oBAAoB;;AAEvC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,oBAAoB;;AAEtC,oBAAmB,mBAAmB;;AAEtC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,kBAAkB;;AAEhC,gBAAe,oBAAoB;;AAEnC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,eAAc,iBAAiB;;AAE/B;;AAEA,gBAAe,mBAAmB;;AAElC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;AACA;;AAEA,gBAAe,4BAA4B;;AAE3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,cAAc;;AAE5B,gBAAe,2BAA2B;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAqB,mBAAmB;;AAExC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,OAAO;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iCAAgC,OAAO;;AAEvC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;;AAEA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,qCAAoC,OAAO;;AAE3C;;AAEA,oBAAmB,OAAO;;AAE1B;AACA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB;;AAEpB,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,qBAAqB;;AAErC;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,oBAAoB;;AAEnC,iBAAgB,oBAAoB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,oBAAoB;;AAEnC;AACA;;AAEA;;AAEA;AACA,qCAAoC;AACpC,yCAAwC;AACxC,qCAAoC;;AAEpC,MAAK;;AAEL;AACA,yCAAwC;AACxC,qCAAoC;AACpC,qCAAoC;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAkC,eAAe;;AAEjD;;AAEA;AACA;;AAEA,yBAAwB;;AAExB;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,eAAe;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA,qCAAoC;AACpC;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,wBAAuB,iBAAiB;;AAExC;;AAEA;;AAEA;;AAEA,6CAA4C,oBAAoB;;AAEhE;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,sCAAqC,QAAQ;;AAE7C;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uBAAsB,WAAW;;AAEjC,uBAAsB;;AAEtB,wBAAuB,0BAA0B;;AAEjD;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;;AAGJ;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,oBAAmB,iBAAiB;;AAEpC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;;;AAIA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,oDAAmD;;AAEnD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,oDAAmD;;AAEnD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;;AAEA,8BAA6B;;AAE7B;;AAEA,+CAA8C;;AAE9C,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,oBAAmB,SAAS;;AAE5B;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA,mCAAkC,uBAAuB;;AAEzD;;AAEA,qBAAoB,cAAc;;AAElC;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oCAAmC;;AAEnC;AACA,sCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;AACA,0CAAyC;;AAEzC;;AAEA;;AAEA,MAAK;;AAEL,KAAI;AACJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL,KAAI;AACJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oCAAmC,EAAE;;AAErC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,sCAAqC;;AAErC;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe;AACf;;AAEA;;AAEA;;AAEA,oCAAmC,EAAE;;AAErC;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sCAAqC;;AAErC;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA,uBAAsB;;AAEtB;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,oBAAmB,cAAc;;AAEjC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAmB,cAAc;;AAEjC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,oBAAmB,cAAc;;AAEjC;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,OAAM;;AAEN,kCAAiC;;AAEjC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,sCAAqC,SAAS;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,sCAAqC,SAAS;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,aAAa;;AAE/B;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,SAAS;;AAEjD;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,mBAAkB,eAAe;;AAEjC;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,uBAAsB,cAAc;;AAEpC;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uBAAsB,cAAc;;AAEpC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yFAAwF,cAAc;;AAEtG;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,oCAAmC,gBAAgB;;AAEnD;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;AACA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oCAAmC;;AAEnC;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uCAAsC,SAAS;;AAE/C;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,oBAAmB,wBAAwB;;AAE3C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,oBAAmB,wBAAwB;;AAE3C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,2CAA0C,SAAS;;AAEnD;;AAEA;;AAEA;;AAEA,IAAG;;;AAGH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,2CAA0C,SAAS;;AAEnD;;AAEA;;AAEA;;AAEA,IAAG;;;AAGH;;AAEA;AACA;;AAEA,oBAAmB,qBAAqB;;AAExC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,oBAAmB,sBAAsB;;AAEzC;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,8CAA6C,QAAQ;;AAErD;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAmB,4BAA4B;;AAE/C;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sBAAqB,0BAA0B;;AAE/C;;AAEA,wBAAuB,0CAA0C;;AAEjE;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oDAAmD;;AAEnD;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;AACL;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gDAA+C,OAAO;;AAEtD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC,SAAS;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,sBAAsB;;AAEzC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,qBAAqB;;AAEtC;;AAEA;;AAEA,kBAAiB,eAAe;;AAEhC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,eAAe;;AAElC;;AAEA;AACA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA,oBAAmB,OAAO;;AAE1B;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,eAAe;;AAElC;;AAEA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA,oBAAmB,OAAO;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mDAAkD,OAAO;;AAEzD;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mDAAkD,OAAO;;AAEzD;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oDAAmD,OAAO;;AAE1D;AACA;AACA;;AAEA;AACA;;AAEA,gDAA+C,QAAQ;;AAEvD;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,qBAAoB,uBAAuB;;AAE3C;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,aAAY;;AAEZ,KAAI;;AAEJ;;AAEA,aAAY;;AAEZ;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,iBAAiB;;AAEpC;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC,OAAO;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,SAAQ;;AAER;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,qEAAoE;;AAEpE;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sBAAqB,mBAAmB;;AAExC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,gBAAgB;;AAEnC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,gBAAgB;;AAEnC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,gBAAe,gBAAgB;;AAE/B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,iBAAgB,KAAK,wBAAwB;;AAE7C,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,wBAAuB;;AAEvB;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gDAA+C;;AAE/C;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,eAAe;;AAE9B;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;;AAGA;;AAEA,gBAAe,eAAe;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yFAAwF;;AAExF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,iBAAgB,eAAe;;AAE/B;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,0BAAyB;;AAEzB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,4CAA2C,OAAO;;AAElD;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,oBAAmB,gBAAgB;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,0CAAyC,mBAAmB;;AAE5D;AACA;AACA;AACA;AACA;;AAEA;;AAEA,qBAAoB,gBAAgB;;AAEpC;;AAEA,mDAAkD;;AAElD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,gCAA+B;AAC/B,oCAAmC;AACnC,kCAAiC;AACjC,gCAA+B;;AAE/B;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,kCAAiC;;AAEjC,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,OAAO;;AAEjD;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,4CAA2C,OAAO;;AAElD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAqC,aAAa;;AAElD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA;;AAEA;;AAEA,mDAAkD;AAClD,oBAAmB;;AAEnB,QAAO;;AAEP;AACA,6CAA4C;AAC5C;AACA,0BAAyB;;AAEzB;;AAEA,OAAM;;AAEN;AACA,gDAA+C;AAC/C;AACA;AACA,oFAAmF;AACnF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yCAAwC,OAAO;;AAE/C;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,8BAA6B;AAC7B;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL,sCAAqC,gCAAgC;;AAErE;;AAEA;;AAEA;;AAEA;AACA;;;AAGA;;AAEA;AACA;;AAEA,iDAAgD,aAAa;;AAE7D;;AAEA;;AAEA,iDAAgD,aAAa;;AAE7D;;AAEA,yBAAwB,mBAAmB;;AAE3C;AACA;;AAEA,2BAA0B,0BAA0B;;AAEpD;;AAEA,+CAA8C,sCAAsC;AACpF;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;AACA;;AAEA,2CAA0C,QAAQ;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,kBAAkB;;AAEtC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,2BAA0B,iBAAiB;;AAE3C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,2BAA0B,iBAAiB;;AAE3C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,aAAY;;AAEZ;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL,KAAI;;AAEJ;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAiB;;AAEjB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;;AAGH;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;AAGH,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,iBAAiB;;AAEpC;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,mDAAkD;;AAElD;AACA;;AAEA,qDAAoD;;AAEpD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,cAAc;;AAElC;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,8CAA6C,SAAS;;AAEtD;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA,kDAAiD,SAAS;;AAE1D;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA,IAAG;;;AAGH;;AAEA;;AAEA;;AAEA,qBAAoB,cAAc;;AAElC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,cAAc;;AAEjC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,uBAAsB,yBAAyB;;AAE/C;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,mDAAkD;;AAElD;AACA;;AAEA,KAAI,gEAAgE;;AAEpE;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sBAAqB,4CAA4C;;AAEjE;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,6CAA4C;;AAE5C;AACA,uCAAsC;AACtC,uCAAsC;;AAEtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,wCAAuC,SAAS;;AAEhD;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,SAAS;;AAE/C;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,uCAAsC,SAAS;;AAE/C;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,uCAAsC,SAAS;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe;;AAEf;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA,0BAAyB,SAAS;;AAElC;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA,0BAAyB,SAAS;;AAElC;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA,0BAAyB,SAAS;;AAElC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,oBAAmB,qBAAqB;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,4BAA2B;AAC3B;;AAEA;AACA,iCAAgC;;AAEhC,yCAAwC,SAAS;;AAEjD;;AAEA;;AAEA,oBAAmB;AACnB,0BAAyB,gBAAgB;AACzC,uBAAsB;AACtB,oCAAmC;;AAEnC;;AAEA;;AAEA;AACA,kBAAiB,8BAA8B,EAAE;AACjD,kBAAiB,2CAA2C;AAC5D,KAAI;;AAEJ,6BAA4B,+BAA+B;;AAE3D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAAyC,SAAS;;AAElD;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qCAAoC,SAAS;;AAE7C;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,qCAAoC,SAAS;;AAE7C;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA,MAAK;;AAEL,KAAI;;AAEJ;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA,0CAAyC,SAAS;;AAElD;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,qCAAoC,SAAS;;AAE7C;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAAyC,SAAS;;AAElD;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,sCAAqC,SAAS;;AAE9C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,sCAAqC,SAAS;;AAE9C;;AAEA;AACA;;AAEA;;AAEA,OAAM;;AAEN,MAAK;;AAEL,KAAI;;AAEJ;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,yBAAwB,SAAS;;AAEjC;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mBAAkB,eAAe;;AAEjC;AACA;AACA;;AAEA;;AAEA;;AAEA,qCAAoC;;AAEpC;AACA;;AAEA,2BAA0B;AAC1B,iCAAgC;;AAEhC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,+BAA8B;;AAE9B,uBAAsB;AACtB,uBAAsB;;AAEtB,mCAAkC;;AAElC,iCAAgC;AAChC,+BAA8B;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,kBAAiB;AACjB,yBAAwB;AACxB,2BAA0B;;AAE1B;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,aAAY;;AAEZ;;AAEA;;AAEA,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,8CAA6C,SAAS;;AAEtD;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,QAAO;;AAEP;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;;AAEA;AACA;AACA;AACA,OAAM;;AAEN;;AAEA,KAAI,OAAO;;AAEX;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,oDAAmD;AACnD;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,OAAM;AACN;;AAEA;AACA;;AAEA;AACA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,qBAAoB;AACpB,gCAA+B;;AAE/B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB,gBAAgB;;AAEnC;;AAEA;;AAEA,oBAAmB,iBAAiB;;AAEpC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB,gBAAgB;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,oBAAmB,iBAAiB;;AAEpC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,iDAAgD,SAAS;;AAEzD;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,oBAAmB,eAAe;;AAElC;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,0CAAyC,SAAS;;AAElD;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA,0CAAyC,SAAS;;AAElD;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,uBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA,wBAAuB;AACvB;;AAEA,qCAAoC;;;AAGpC,mCAAkC;AAClC;;AAEA;;AAEA;;AAEA;AACA,mBAAkB,8BAA8B,EAAE;AAClD,mBAAkB,8BAA8B;AAChD,MAAK;AACL;AACA,mBAAkB,+BAA+B,EAAE;AACnD,mBAAkB,+BAA+B;AACjD,MAAK;AACL;AACA,mBAAkB,0CAA0C,EAAE;AAC9D,mBAAkB,0CAA0C;AAC5D;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA,yCAAwC,SAAS;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;;AAGH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,sCAAqC,OAAO;;AAE5C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAsB;;AAEtB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,qCAAoC,OAAO;;AAE3C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,YAAW;AACX,YAAW;AACX,WAAU;AACV,aAAY,eAAe;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ,gIAA+H;AAC/H;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,mBAAmB;AACvC;AACA;;AAEA;;AAEA;;AAEA,oBAAmB,cAAc;;AAEjC,yBAAwB;;AAExB;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,OAAO;;AAEtB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,cAAc;;AAE7B;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,gBAAe,wBAAwB;;AAEvC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,kBAAkB;;AAElC;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,8CAA6C;AAC7C,oDAAmD;;AAEnD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ,+CAA8C;AAC9C,yEAAwE;;AAExE;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sDAAqD,QAAQ;;AAE7D;AACA;;AAEA;;AAEA;;AAEA,yDAAwD;;AAExD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oDAAmD,QAAQ;;AAE3D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,8DAA6D,iCAAiC;;AAE9F;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA,sDAAqD,QAAQ;;AAE7D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kCAAiC,OAAO;;AAExC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,0CAAyC,aAAa;;AAEtD;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,uBAAuB;;AAEzC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,0CAAyC,qFAAqF;;AAE9H;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,4BAA4B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,uBAAuB;;AAEzC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,0CAAyC,8BAA8B;AACvE;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,wDAAuD,gFAAgF;;AAEvI;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,2BAA0B,QAAQ;;AAElC;;AAEA;;AAEA,0CAAyC,4CAA4C;;AAErF;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sCAAqC,gBAAgB;;AAErD;AACA;;AAEA;;AAEA,+BAA8B;AAC9B,+BAA8B;AAC9B,+BAA8B;AAC9B,+BAA8B;;AAE9B;;AAEA;AACA;AACA;;AAEA,0CAAyC,6BAA6B;;AAEtE;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,8DAA6D,iCAAiC;;AAE9F;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC,OAAO;;AAE5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAAyC,aAAa;;AAEtD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,0CAAyC,4CAA4C;;AAErF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wEAAuE,gCAAgC;;AAEvG;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,8DAA6D,eAAe;;AAE5E;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wBAAuB,qBAAqB;AAC5C,wBAAuB,qBAAqB;AAC5C,wBAAuB,qBAAqB;AAC5C,wBAAuB,qBAAqB;AAC5C,wBAAuB,qBAAqB;AAC5C,wBAAuB,qBAAqB;AAC5C,wBAAuB,qBAAqB;AAC5C,wBAAuB,qBAAqB;;AAE5C;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,+DAA8D,eAAe;AAC7E;AACA;;AAEA,+DAA8D,eAAe;AAC7E;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0CAAyC,6BAA6B;;AAEtE;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,wBAAuB;;AAEvB;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0CAAyC;AACzC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,0FAAyF,4CAA4C;AACrI;;AAEA;AACA;AACA,8FAA6F,4CAA4C;AACzI;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAA+C,cAAc;;AAE7D;AACA;AACA;AACA;AACA,GAAE;;AAEF,EAAC;;;;;;;ACxzyCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;AACzB,gCAA+B;;AAE/B;AACA;AACA,qCAAoC;AACpC,mCAAkC;;AAElC;AACA;AACA;AACA;;AAEA,uDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;;AAEzB;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;;AAEA;AACA,gBAAe;;AAEf;AACA,wBAAuB;;AAEvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,4BAA2B,kBAAkB,GAAG;;AAEhD;;AAEA;AACA;AACA;;AAEA;;AAEA,sBAAqB;AACrB,qBAAoB;AACpB,mBAAkB;;AAElB,gBAAe;;AAEf;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,8CAA6C;AAC7C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,8CAA6C;AAC7C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH,sCAAqC;AACrC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sCAAqC;AACrC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;AACA,gDAA+C;;AAE/C;;AAEA;;AAEA;;AAEA;AACA,8CAA6C;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;;;;;;;AC3/BA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,QAAO;AACP,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,YAAW;;AAEX;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,YAAW;;AAEX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sBAAqB,kBAAkB;;AAEvC;AACA;;AAEA;;AAEA;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,UAAS;;AAET;;AAEA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;;AAET;;AAEA,UAAS;;AAET;;AAEA;AACA,YAAW;;AAEX;;AAEA,YAAW;;AAEX;;AAEA,cAAa;;AAEb;;AAEA;AACA;;AAEA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,G;;;;;;;;;;;ACxTA;AACA;AACA,UAASuC,IAAT,CAAcC,IAAd,EAAoBC,GAApB,EAAyB;AACxB,OAAKC,WAAL,GAAmBF,IAAnB,CADwB,CACC;AACzB,OAAKG,eAAL,GAAuBF,GAAvB,CAFwB,CAEI;AAC5B;;AAED;AACA;AACA,UAASG,UAAT,GAAsB;AACrB,OAAKC,IAAL,GAAY,IAAZ;AACA,OAAKC,IAAL,GAAY,IAAZ;AACA,OAAKC,UAAL,GAAkB,IAAlB;;AAEA,OAAKC,IAAL,GAAY,UAASC,CAAT,EAAYC,CAAZ,EAAe;AAC1BD,KAAEE,IAAF,GAASD,CAAT;AACAA,KAAEE,IAAF,GAASH,CAAT;AACA,GAHD;;AAKA,OAAKI,MAAL,GAAc,UAASC,IAAT,EAAeC,SAAf,EAA0B;AACvC,OAAIC,QAAQ,KAAKT,UAAL,CAAgBO,KAAKG,MAArB,CAAZ;;AAEA;AACA,OAAIC,KAAKC,KAAKC,MAAL,EAAT;AACA,OAAIC,UAAJ;AACA,OAAIC,MAAM,GAAV;AACA,OAAI,OAAON,KAAP,KAAiB,WAArB,EAAkC;AACjC,SAAK,IAAIpE,IAAI,CAAb,EAAgBA,IAAIoE,MAAMlE,MAA1B,EAAkCF,GAAlC,EAAuC;AACtC,SAAIsE,MAAMI,MAAMN,MAAMpE,CAAN,EAASsD,WAAzB,EAAsC;AACrCmB,mBAAaL,MAAMpE,CAAN,CAAb;AACA;AACA,MAHD,MAIK;AACJ0E,aAAON,MAAMpE,CAAN,EAASsD,WAAhB;AACA;AACD;;AAED;AACAqB,gBAAY,IAAZ,EAAkBT,IAAlB,EAAwBO,WAAWlB,eAAnC,EAAoDY,SAApD;AACA;AACD,GArBD;AAsBA;AACD,UAASS,IAAT,CAAcC,GAAd,EAAmB;AAClB,OAAKd,IAAL,GAAY,IAAZ;AACA,OAAKC,IAAL,GAAY,IAAZ;AACA,OAAKK,MAAL,GAAcQ,GAAd;AACA,OAAKV,SAAL,GAAiB,CAAjB;AACA;;AAGD;AACA,UAASW,kBAAT,CAA4BC,YAA5B,EAA0C;AACzC;AACA;AACA;AACA,MAAIC,KAAK,IAAIxB,UAAJ,EAAT;AACAwB,KAAGvB,IAAH,GAAU,IAAImB,IAAJ,CAASG,aAAaE,MAAb,CAAoB,CAApB,CAAT,CAAV;AACA,MAAIC,WAAWF,GAAGvB,IAAlB;AACA,OAAK,IAAIzD,IAAI,CAAb,EAAgBA,IAAI+E,aAAa7E,MAAjC,EAAyCF,GAAzC,EAA8C;AAC7C,OAAImF,IAAI,IAAIP,IAAJ,CAASG,aAAaE,MAAb,CAAoBjF,CAApB,CAAT,CAAR;AACAkF,YAASnB,IAAT,GAAgBoB,CAAhB;AACAA,KAAEnB,IAAF,GAASkB,QAAT;AACAA,cAAWA,SAASnB,IAApB;AACA;AACDiB,KAAGtB,IAAH,GAAUwB,QAAV;AACA,SAAOF,EAAP;AACA;;AAED;AACA,UAASI,kBAAT,CAA4BC,UAA5B,EAAwC;AACvC;AACA,MAAIjF,SAAS,EAAb;AACA,MAAI8E,WAAWG,WAAW5B,IAA1B;AACA,SAAOyB,YAAY,IAAnB,EAAyB;AACxB9E,aAAU8E,SAASb,MAAnB;AACAa,cAAWA,SAASnB,IAApB;AACA;AACD,SAAO3D,MAAP;AACA;;AAED;AACA;AACA,UAASuE,WAAT,CAAqBU,UAArB,EAAiCnB,IAAjC,EAAuCoB,iBAAvC,EAA0DnB,SAA1D,EAAqE;AACpE;AACA,MAAIoB,WAAWT,mBAAmBQ,iBAAnB,CAAf;AACA,MAAIJ,WAAWK,SAAS9B,IAAxB;AACA,SAAOyB,YAAY,IAAnB,EAAyB;AACxB;AACAA,YAASf,SAAT,GAAqBA,SAArB;AACAe,cAAWA,SAASnB,IAApB;AACA;AACA,MAAIA,OAAOG,KAAKH,IAAhB;AACDwB,WAAS7B,IAAT,CAAcK,IAAd,GAAqBA,IAArB;AACA,MAAIG,KAAKF,IAAL,IAAa,IAAjB,EAAuB;AACtBE,QAAKF,IAAL,CAAUD,IAAV,GAAiBwB,SAAS9B,IAA1B;AACA;AACD;;AAED,UAASlE,OAAT,CAAiBiG,KAAjB,EAAwBC,OAAxB,EAAiC7F,UAAjC,EAA6C;AAC5C;AACA,OAAK4F,KAAL,GAAa,KAAb;AACA,OAAKC,OAAL,GAAe,EAAf;AACA,OAAKA,OAAL,CAAa,GAAb,IAAoB,CACnB,IAAItC,IAAJ,CAAS,OAAT,EAAkB,cAAlB,CADmB,EAEnB,IAAIA,IAAJ,CAAS,OAAT,EAAkB,cAAlB,CAFmB,EAGnB,IAAIA,IAAJ,CAAS,OAAT,EAAkB,cAAlB,CAHmB,CAApB;AAKA,OAAKsC,OAAL,CAAa,GAAb,IAAoB,CACnB,IAAItC,IAAJ,CAAS,OAAT,EAAkB,yBAAlB,CADmB,EAEnB,IAAIA,IAAJ,CAAS,OAAT,EAAkB,yBAAlB,CAFmB,EAGnB,IAAIA,IAAJ,CAAS,OAAT,EAAkB,0BAAlB,CAHmB,CAApB;AAKA,OAAKsC,OAAL,CAAa,GAAb,IAAoB,CACnB,IAAItC,IAAJ,CAAS,OAAT,EAAkB,uBAAlB,CADmB,EAEnB,IAAIA,IAAJ,CAAS,OAAT,EAAkB,uBAAlB,CAFmB,EAGnB,IAAIA,IAAJ,CAAS,OAAT,EAAkB,uBAAlB,CAHmB,CAApB;AAKA,OAAKvD,UAAL,GAAkB,CAAlB;;AAEA;AACA,MAAI,OAAO4F,KAAP,KAAiB,WAArB,EAAkC;AACjC,QAAKA,KAAL,GAAaA,KAAb;AACA;;AAED;AACA;AACA,MAAI,OAAOC,OAAP,KAAmB,WAAvB,EAAoC;AACnC,QAAKA,OAAL,GAAeC,OAAOC,MAAP,CAAc,EAAd,EAAkBF,OAAlB,CAAf;AACA;;AAED;AACA;AACA,MAAI,OAAO7F,UAAP,KAAsB,WAA1B,EAAuC;AACtC,QAAKA,UAAL,GAAkBA,UAAlB;AACA;;AAED;AACA;AACA,OAAKF,WAAL,GAAmB,UAAS8F,KAAT,EAAgB;AAClC;AACA,OAAI,OAAOA,KAAP,KAAiB,WAArB,EAAkC;AACjC,SAAKA,KAAL,GAAaA,KAAb;AACA;AACD,GALD;;AAOA;AACA;AACA;AACA;AACA;AACA,OAAKnF,YAAL,GAAoB,UAAS8E,CAAT,EAAY;AAC/B,QAAKvF,UAAL,GAAkBuF,CAAlB;AACA,OAAIS,YAAYd,mBAAmB,KAAKU,KAAxB,CAAhB;AACAI,aAAUjC,UAAV,GAAuB,KAAK8B,OAA5B;AACA,OAAIP,WAAWU,UAAUnC,IAAzB;;AAEA,QAAK,IAAIzD,IAAI,CAAb,EAAgBA,KAAK,KAAKJ,UAA1B,EAAsCI,GAAtC,EAA2C;AAC1C,QAAIkF,WAAWU,UAAUnC,IAAzB;AACA,WAAOyB,YAAY,IAAnB,EAAyB;AACxB,SAAInB,OAAOmB,SAASnB,IAApB;AACA6B,eAAU3B,MAAV,CAAiBiB,QAAjB,EAA2BlF,CAA3B;AACAkF,gBAAWnB,IAAX;AACA;AAED;AACDvD,WAAQC,GAAR,CAAYmF,SAAZ;AACA,UAAOA,SAAP;AACA,GAjBD;AAkBA;;mBAEc;AACdpC,cAAYA,UADE;AAEdjE,WAAUA,OAFI;AAGduF,sBAAqBA,kBAHP;AAIdM,sBAAqBA;AAJP,E;;;;;;;;;;;;;;;;AC1Kf,KAAMnH,QAAQ,mBAAAC,CAAQ,CAAR,CAAd;;AAEA,KAAI2H,YAAY,IAAI5H,MAAM6C,SAAV,EAAhB;AACA,KAAIgF,YAAJ;AACAD,WAAUE,IAAV,CAAe,mBAAf,EAAoC,UAAShG,GAAT,EAAc;;AAE9C;AACA+F,oBAAe/F,IAAIE,QAAJ,CAAa,CAAb,EAAgB+F,QAA/B;AACH,EAJD;;AAMA;AACA;AACA;AACA;AACA,KAAIC,cAAc,SAAdA,WAAc,CAASC,GAAT,EAAcC,GAAd,EAAmB;AACjC,YAAO;AACHD,cAAK,IAAIjI,MAAMmB,OAAV,CAAkB8G,IAAIE,CAAtB,EAAyBF,IAAIG,CAA7B,EAAgCH,IAAII,CAApC,CADF;AAEHH,cAAK,IAAIlI,MAAMmB,OAAV,CAAkB+G,IAAIC,CAAtB,EAAyBD,IAAIE,CAA7B,EAAgCF,IAAIG,CAApC;AAFF,MAAP;AAIH,EALD;;KAOqBC,M;AACjB,qBAAYjI,KAAZ,EAAmBmH,OAAnB,EAA4B;AAAA;;AACxB,cAAKe,KAAL,GAAa,IAAIP,WAAJ,CAAgB,IAAIhI,MAAMmB,OAAV,CAAkB,CAAlB,EAAoB,CAAC,CAArB,EAAuB,CAAC,EAAxB,CAAhB,EAA6C,IAAInB,MAAMmB,OAAV,CAAkB,CAAlB,EAAoB,CAApB,EAAsB,CAAtB,CAA7C,CAAb;AACA,cAAKd,KAAL,GAAaA,KAAb;AACA,cAAKmI,KAAL,GAAa,EAAb;AACA,cAAKlG,KAAL,GAAa,EAAb;AACA,cAAK4D,SAAL,GAAiB,CAAjB;AACA;AACA;AACA,aAAI,OAAOsB,OAAP,KAAmB,WAAvB,EAAoC;AAChC,kBAAKiB,aAAL,GAAqB;AACjB,sBAAM,KAAKC,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAC,CAAvC,EAA0C,CAA1C,EAA6C,CAA7C,CADW;AAEjB,sBAAM,KAAKD,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAtC,EAAyC,CAAzC,EAA4C,CAA5C,CAFW;AAGjB,sBAAM,KAAKC,YAAL,CAAkBD,IAAlB,CAAuB,IAAvB,EAA6B,CAA7B,EAAgC,GAAhC,CAHW;AAIjB,sBAAM,KAAKE,SAAL,CAAeF,IAAf,CAAoB,IAApB,CAJW;AAKjB,sBAAM,KAAKG,YAAL,CAAkBH,IAAlB,CAAuB,IAAvB,CALW;AAMjB,sBAAM,KAAKD,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAtC,EAAyC,CAAC,CAA1C,EAA6C,CAA7C,CANW;AAOjB,sBAAM,KAAKD,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAtC,EAAyC,CAAzC,EAA4C,CAA5C,CAPW;AAQjB,sBAAM,KAAKD,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAtC,EAAyC,CAAzC,EAA4C,CAAC,CAA7C,CARW;AASjB,sBAAM,KAAKD,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,EAA6B,CAA7B,EAAgC,CAAhC,EAAmC,CAAnC,EAAsC,CAAtC,EAAyC,CAAzC,EAA4C,CAA5C,CATW;AAUjB,sBAAM,KAAKI,UAAL,CAAgBJ,IAAhB,CAAqB,IAArB,EAA2B,CAA3B,EAA8B,GAA9B;AAVW,cAArB;AAYH,UAbD,MAaO;AACH,kBAAKF,aAAL,GAAqBjB,OAArB;AACH;AACJ;;;;oCACUwB,G,EAAKC,K,EAAO;AACnB;AACA,iBAAI,KAAK/C,SAAL,GAAiB,CAArB,EAAwB;AACpB;AACZ;AACY;AACA;AACA;AACA;AACA;AACZ;AACY;AACA;AACA;AACA;;AAEA;AACH;AACJ;;;qCACW;AACR,iBAAIgD,SAAS,KAAKX,KAAL,CAAWN,GAAxB;AACA,iBAAIkB,SAAS,KAAKZ,KAAL,CAAWL,GAAxB;AACA,iBAAIkB,WAAW,IAAIpB,WAAJ,CAAgBkB,MAAhB,EAAwBC,MAAxB,CAAf;AACA,kBAAKX,KAAL,CAAWa,IAAX,CAAgBD,QAAhB;AACH;;;wCACc;AACX,kBAAKb,KAAL,GAAa,KAAKC,KAAL,CAAWc,GAAX,EAAb;AACH;AACD;AACA;;;;iCACQ;AACJ,kBAAKf,KAAL,GAAa,IAAIP,WAAJ,CAAgB,IAAIhI,MAAMmB,OAAV,CAAkB,CAAlB,EAAoB,CAApB,EAAsB,CAAtB,CAAhB,EAA0C,IAAInB,MAAMmB,OAAV,CAAkB,CAAlB,EAAoB,CAApB,EAAsB,CAAtB,CAA1C,CAAb;AACH;;AAED;AACA;;;;sCACa;AACToB,qBAAQC,GAAR,CAAY,KAAK+F,KAAL,CAAWN,GAAvB;AACA1F,qBAAQC,GAAR,CAAY,KAAK+F,KAAL,CAAWL,GAAvB;AACH;;AAED;AACA;;;;sCACaC,C,EAAGC,C,EAAGC,C,EAAGkB,K,EAAOC,K,EAAOC,K,EAAQ;AACxC,iBAAIC,IAAI,IAAI1J,MAAM2J,KAAV,CACAJ,QAAM,KAAKjH,KAAX,GAAmB,IAAnB,GAAwB,GADxB,EAEZkH,QAAM,KAAKlH,KAAX,GAAmB,IAAnB,GAAwB,GAFZ,EAGZmH,QAAM,KAAKnH,KAAX,GAAmB,IAAnB,GAAwB,GAHZ,CAAR;AAIA,kBAAKiG,KAAL,CAAWL,GAAX,CAAe0B,UAAf,CAA0BF,CAA1B;AACH;;AAED;AACA;;;;oCACWvB,C,EAAGC,C,EAAGC,C,EAAG;AACnB,iBAAIwB,UAAU7J,MAAMmB,OAAN,CAAcgH,CAAd,EAAiBC,CAAjB,EAAoBC,CAApB,CAAd;AACA,kBAAKE,KAAL,CAAWN,GAAX,CAAehH,GAAf,CAAmB4I,OAAnB;AACA;;;;;AAED;qCACYC,I,EAAM;AACd,iBAAIC,SAAS,KAAKxB,KAAL,CAAWL,GAAX,CAAelH,cAAf,CAA8B8I,IAA9B,CAAb;AACA,kBAAKvB,KAAL,CAAWN,GAAX,CAAehH,GAAf,CAAmB8I,MAAnB;AACH;;;;;AAED;AACA;sCACaf,G,EAAKC,K,EAAO;AACrB,iBAAIlB,WAAW,IAAI/H,MAAMgK,gBAAV,CAA2B,MAAI,KAAK9D,SAApC,EAA+C,MAAI,KAAKA,SAAxD,EAAmE8C,GAAnE,CAAf;AACA,iBAAIiB,WAAW,IAAIjK,MAAMkK,mBAAV,CAA+B,EAACtJ,OAAO,QAAR,EAAkBuJ,MAAMnK,MAAMoK,UAA9B,EAA/B,CAAf;AACA,iBAAIC,WAAW,IAAIrK,MAAMsK,IAAV,CAAgBvC,QAAhB,EAA0BkC,QAA1B,CAAf;AACA,iBAAIM,eAAe,IAAIvK,MAAMkK,mBAAV,CAA8B,EAAEtJ,OAAO,QAAT,EAAmBuJ,MAAMnK,MAAMoK,UAA/B,EAA9B,CAAnB;AACA,iBAAII,OAAO,IAAIxK,MAAMsK,IAAV,CAAezC,YAAf,EAA6B0C,YAA7B,CAAX;AACA,kBAAKlK,KAAL,CAAWY,GAAX,CAAgBoJ,QAAhB;AACA,iBAAI/D,KAAKC,MAAL,KAAgB,IAAhB,IAAwB,KAAKL,SAAL,GAAiB,CAA7C,EAAgD;AAC7C,sBAAK7F,KAAL,CAAWY,GAAX,CAAeuJ,IAAf;AACF;;AAED;AACA,iBAAIC,OAAO,IAAIzK,MAAM0K,UAAV,EAAX;AACAD,kBAAKE,kBAAL,CAAwB,IAAI3K,MAAMmB,OAAV,CAAkB,CAAlB,EAAoB,CAApB,EAAsB,CAAtB,CAAxB,EAAkD,KAAKoH,KAAL,CAAWL,GAA7D;AACA,iBAAI0C,OAAO,IAAI5K,MAAM6K,OAAV,EAAX;AACAD,kBAAKE,0BAAL,CAAgCL,IAAhC;AACAJ,sBAASU,WAAT,CAAqBH,IAArB;AACAJ,kBAAKO,WAAL,CAAiBH,IAAjB;;AAEA;AACA,iBAAII,OAAO,IAAIhL,MAAM6K,OAAV,EAAX;AACA,iBAAII,QAAQ,KAAK1C,KAAL,CAAWN,GAAX,CAAehH,GAAf,CAAmB,KAAKsH,KAAL,CAAWL,GAAX,CAAelH,cAAf,CAA8B,MAAMgI,GAApC,CAAnB,CAAZ;AACAgC,kBAAKE,eAAL,CAAqBD,MAAM9C,CAA3B,EAA8B8C,MAAM7C,CAApC,EAAuC6C,MAAM5C,CAA7C;AACAgC,sBAASU,WAAT,CAAqBC,IAArB;AACAR,kBAAKO,WAAL,CAAiBC,IAAjB;AACA;AACA,kBAAKG,WAAL,CAAiBnC,MAAI,CAArB;AACH;;;;;AAED;AACA;AACA;sCACaoC,U,EAAY;AACrB,iBAAIC,OAAO,KAAK5C,aAAL,CAAmB2C,WAAWhF,MAA9B,CAAX;AACA,kBAAKF,SAAL,GAAiBkF,WAAWlF,SAA5B;AACA,iBAAImF,IAAJ,EAAU;AACNA;AACH;AACJ;;;;;AAED;uCACcjE,U,EAAY;AACtB,iBAAIkE,WAAJ;AACA,kBAAIA,cAAclE,WAAW5B,IAA7B,EAAmC8F,eAAe,IAAlD,EAAwDA,cAAcA,YAAYxF,IAAlF,EAAwF;AACpF,sBAAKyF,YAAL,CAAkBD,WAAlB;AACH;AACJ;;;;;;mBA1IgBhD,M","file":"./bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap cbbbdcfbda7dc7182283","\nconst THREE = require('three'); // older modules are imported like this. You shouldn't have to worry about this much\nimport Framework from './framework'\nimport lsys from './lsystem.js'\nimport Turtle from './turtle.js'\n\nvar turtle;\n\n// called after the scene loads\nfunction onLoad(framework) {\n \n var scene = framework.scene;\n var camera = framework.camera;\n var renderer = framework.renderer;\n var gui = framework.gui;\n var stats = framework.stats;\n\n // initialize a simple box and material\n var directionalLight = new THREE.DirectionalLight( 0xffffff, 1 );\n directionalLight.color.setHSL(0.1, 1, 0.95);\n directionalLight.position.set(1, 3, 2);\n directionalLight.position.multiplyScalar(10);\n\n scene.add(directionalLight);\n\n //var loader = new THREE.CubeTextureLoader();\n //var urlPrefix = '';\n //\n //var skymap = new THREE.CubeTextureLoader().load([\n // urlPrefix + 'px.jpg', urlPrefix + 'nx.jpg',\n // urlPrefix + 'py.jpg', urlPrefix + 'ny.jpg',\n // urlPrefix + 'pz.jpg', urlPrefix + 'nz.jpg'\n //] );\n //\n //scene.background = skymap;\n\n // set camera position\n camera.position.set(1, 1, 20);\n camera.lookAt(new THREE.Vector3(0,0,0));\n camera.updateProjectionMatrix();\n\n // initialize LSystem and a Turtle to draw\n var lsystem = new lsys.Lsystem();\n turtle = new Turtle(scene);\n\n gui.add(camera, 'fov', 0, 180).onChange(function(newVal) {\n camera.updateProjectionMatrix();\n });\n\n gui.add(lsystem, 'axiom').onChange(function(newVal) {\n lsystem.updateAxiom(newVal);\n doLsystem(lsystem, lsystem.iterations, turtle);\n });\n\n gui.add(lsystem, 'iterations', 0, 12).step(1).onChange(function(newVal) {\n clearScene(turtle);\n doLsystem(lsystem, newVal, turtle);\n });\n\n gui.add(turtle, 'angle', 15, 120).step(1).onChange(function(newVal) {\n clearScene(turtle);\n doLsystem(lsystem, lsystem.iterations, turtle);\n });\n}\n\n// clears the scene by removing all geometries added by turtle.js\nfunction clearScene(turtle) {\n var obj;\n for( var i = turtle.scene.children.length - 1; i > 3; i--) {\n obj = turtle.scene.children[i];\n turtle.scene.remove(obj);\n }\n}\n\nfunction doLsystem(lsystem, iterations, turtle) {\n var result = lsystem.doIterations(iterations);\n turtle.clear();\n var angle = turtle.angle;\n turtle = new Turtle(turtle.scene);\n console.log(turtle);\n turtle.angle = angle;\n turtle.renderSymbols(result);\n}\n\n// called on frame updates\nfunction onUpdate(framework) {\n}\n\n// when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate\nFramework.init(onLoad, onUpdate);\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","\nconst THREE = require('three');\nconst OrbitControls = require('three-orbit-controls')(THREE)\nconst OBJLoader = require('three-obj-loader')(THREE)\nimport Stats from 'stats-js'\nimport DAT from 'dat-gui'\n\n// when the scene is done initializing, the function passed as `callback` will be executed\n// then, every frame, the function passed as `update` will be executed\nfunction init(callback, update) {\n var stats = new Stats();\n stats.setMode(1);\n stats.domElement.style.position = 'absolute';\n stats.domElement.style.left = '0px';\n stats.domElement.style.top = '0px';\n document.body.appendChild(stats.domElement);\n\n var gui = new DAT.GUI();\n\n var framework = {\n gui: gui,\n stats: stats\n };\n\n // run this function after the window loads\n window.addEventListener('load', function() {\n\n var scene = new THREE.Scene();\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\n var renderer = new THREE.WebGLRenderer( { antialias: true} );\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(window.innerWidth, window.innerHeight);\n renderer.setClearColor(0xfcd1fa, 1);\n\n var controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.enableZoom = true;\n controls.target.set(0, 0, 0);\n controls.rotateSpeed = 0.3;\n controls.zoomSpeed = 1.0;\n controls.panSpeed = 2.0;\n\n document.body.appendChild(renderer.domElement);\n\n // resize the canvas when the window changes\n window.addEventListener('resize', function() {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n }, false);\n\n // assign THREE.js objects to the object we will return\n framework.scene = scene;\n framework.camera = camera;\n framework.renderer = renderer;\n\n // begin the animation loop\n (function tick() {\n stats.begin();\n update(framework); // perform any requested updates\n renderer.render(scene, camera); // render the scene\n stats.end();\n requestAnimationFrame(tick); // register to call this again when the browser renders a new frame\n })();\n\n // we will pass the scene, gui, renderer, camera, etc... to the callback function\n return callback(framework);\n });\n}\n\nexport default {\n init: init\n}\n\n\n// WEBPACK FOOTER //\n// ./src/framework.js","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 2\n// module chunks = 0","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 3\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 4\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 5\n// module chunks = 0","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*(\\S*)\\s*\\(/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tObject.assign( EventDispatcher.prototype, {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tvar REVISION = '82';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar BlendingMode = {\n\t\tNoBlending: NoBlending,\n\t\tNormalBlending: NormalBlending,\n\t\tAdditiveBlending: AdditiveBlending,\n\t\tSubtractiveBlending: SubtractiveBlending,\n\t\tMultiplyBlending: MultiplyBlending,\n\t\tCustomBlending: CustomBlending\n\t};\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar TextureMapping = {\n\t\tUVMapping: UVMapping,\n\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t};\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar TextureWrapping = {\n\t\tRepeatWrapping: RepeatWrapping,\n\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t};\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar TextureFilter = {\n\t\tNearestFilter: NearestFilter,\n\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\tLinearFilter: LinearFilter,\n\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t};\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\trandom16: function () {\n\n\t\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\t\treturn Math.random();\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\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\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: TextureIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.sourceFile = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\tvar count = 0;\n\tfunction TextureIdCount() { return count++; }\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\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\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\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 = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/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\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\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\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\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\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\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\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\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\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\t\t\tthis.w = attribute.array[ index + 3 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, {\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\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\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\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\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\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\n\t\t\t} else if ( order === 'YXZ' ) {\n\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\n\t\t\t} else if ( order === 'ZXY' ) {\n\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\n\t\t\t} else if ( order === 'ZYX' ) {\n\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\n\t\t\t} else if ( order === 'YZX' ) {\n\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\n\t\t\t} else if ( order === 'XZY' ) {\n\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\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\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\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\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\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\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\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\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\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\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\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\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\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\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\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\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\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\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\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar 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\n\t\t\t\tx1 = 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\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\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\n\t\t\t\t}\n\n\t\t\t}\n\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\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyProjection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 projection matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\t\t\tvar d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide\n\n\t\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d;\n\t\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d;\n\t\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar 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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\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\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\n\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\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\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\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\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\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\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\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\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\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\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\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\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\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\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\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\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\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\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\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\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\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\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\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\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\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix4( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\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\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\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\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\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\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakePerspective: function ( fov, aspect, near, far ) {\n\n\t\t\tvar ymax = near * Math.tan( _Math.DEG2RAD * fov * 0.5 );\n\t\t\tvar ymin = - ymax;\n\t\t\tvar xmin = ymin * aspect;\n\t\t\tvar xmax = ymax * aspect;\n\n\t\t\treturn this.makeFrustum( xmin, xmax, ymin, ymax, near, far );\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\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\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\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\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\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\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\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar 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\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t};\n\n\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\\n\\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\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 G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\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}\\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;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\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}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\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\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\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}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\";\n\n\tvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + 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 = dFdx( surf_pos );\\n\\t\\tvec3 vSigmaY = dFdy( surf_pos );\\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\\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\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n return value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n return 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 return 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}\\nvec4 RGBEToLinear( in vec4 value ) {\\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n float maxComponent = max( max( value.r, value.g ), value.b );\\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n M = ceil( M * 255.0 ) / 255.0;\\n return vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float D = max( maxRange / maxRGB, 1.0 );\\n D = min( floor( D ) / 255.0, 1.0 );\\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n vec4 vResult;\\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n vResult.w = fract(Le);\\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n return vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n float Le = value.z * 255.0 + value.w;\\n vec3 Xp_Y_XYZp;\\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n return vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntenstiy;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\\n\\t#else\\n\\t\\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\\t#endif\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lights_pars = \"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\\n\\t\\t\\tdirectLight.color = pointLight.color;\\n\\t\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\t#include \\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\t#include \\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat 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\";\n\n\tvar lights_template = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t \\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\\t#endif\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\t\\t\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar logdepthbuf_pars_fragment = \"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\";\n\n\tvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\";\n\n\tvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\\t#endif\\n#endif\\n\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\";\n\n\tvar morphtarget_pars_vertex = \"#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_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar normal_fragment = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal ) * flipNormal;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\n\n\tvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n return normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n return 1.0 - 2.0 * rgb.xyz;\\n}\\nconst 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\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n return ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n return linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar project_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 mvPosition = modelViewMatrix * skinned;\\n#else\\n\\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\\n\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\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\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\";\n\n\tvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\n\tvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureWidth;\\n\\t\\tuniform int boneTextureHeight;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureWidth ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureWidth ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureWidth );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureHeight );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\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#endif\\n\";\n\n\tvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\";\n\n\tvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n return toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\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\n\tvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\n\tvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform vec4 offsetRepeat;\\n#endif\\n\";\n\n\tvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n\\t#ifdef USE_SKINNING\\n\\t\\tvec4 worldPosition = modelMatrix * skinned;\\n\\t#else\\n\\t\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n\\t#endif\\n#endif\\n\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\";\n\n\tvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar distanceRGBA_frag = \"uniform vec3 lightPos;\\nvarying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\\n}\\n\";\n\n\tvar distanceRGBA_vert = \"varying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition;\\n}\\n\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight;\\n\\treflectedLight.directDiffuse = vec3( 0.0 );\\n\\treflectedLight.directSpecular = vec3( 0.0 );\\n\\treflectedLight.indirectDiffuse = diffuseColor.rgb;\\n\\treflectedLight.indirectSpecular = vec3( 0.0 );\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nuniform float envMapIntensity;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar normal_frag = \"uniform float opacity;\\nvarying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\\n\\t#include \\n}\\n\";\n\n\tvar normal_vert = \"varying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvNormal = normalize( normalMatrix * normal );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( (value && value.isColor) ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular : { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity : { value: 1 }, // temporary\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\n\t\t\t\t{\n\t\t\t\t\tscale : { value: 1 },\n\t\t\t\t\tdashSize : { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: {\n\n\t\t\t\topacity : { value: 1.0 }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\n\t\t\t\tlightPos: { value: new Vector3() }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\tShaderLib.standard.uniforms,\n\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\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\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t point.y < this.min.y || point.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyProjection( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( (fog && fog.isFog) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( (fog && fog.isFogExp2) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: MaterialIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( (currentValue && currentValue.isColor) ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( (currentValue && currentValue.isVector3) && (newValue && newValue.isVector3) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( (this.color && this.color.isColor) ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( (this.emissive && this.emissive.isColor) ) data.emissive = this.emissive.getHex();\n\t\t\tif ( (this.specular && this.specular.isColor) ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\n\t\t\tif ( (this.map && this.map.isTexture) ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( (this.alphaMap && this.alphaMap.isTexture) ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.lightMap && this.lightMap.isTexture) ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.bumpMap && this.bumpMap.isTexture) ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( (this.normalMap && this.normalMap.isTexture) ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( (this.displacementMap && this.displacementMap.isTexture) ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( (this.roughnessMap && this.roughnessMap.isTexture) ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.metalnessMap && this.metalnessMap.isTexture) ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.emissiveMap && this.emissiveMap.isTexture) ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.specularMap && this.specularMap.isTexture) ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.envMap && this.envMap.isTexture) ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\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\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\tvar count$1 = 0;\n\tfunction MaterialIdCount() { return count$1++; }\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\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\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\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\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\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tthis.makeEmpty();\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tvar array, offset, stride;\n\n\t\t\t\t\t\t\t\tif ( (attribute && attribute.isInterleavedBufferAttribute) ) {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.data.array;\n\t\t\t\t\t\t\t\t\toffset = attribute.offset;\n\t\t\t\t\t\t\t\t\tstride = attribute.data.stride;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.array;\n\t\t\t\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t\t\t\t\tstride = 3;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tfor ( var i = offset, il = array.length; i < il; i += stride ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromArray( array, i );\n\t\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\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\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\t\t point.y < this.min.y || point.y > this.max.y ||\n\t\t\t\t\t point.z < this.min.z || point.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&\n\t\t\t\t ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\t\t box.max.z < this.min.z || box.min.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box = new Box3();\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t] );\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix3( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( (matrix && matrix.isMatrix4) ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\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\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\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\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\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\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\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\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\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\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 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\tvar cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.clearColor( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( (light && light.isPointLight) ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( (shadow && shadow.isSpotLightShadow) ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( (material && material.isMultiMaterial) ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\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\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\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\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\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\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\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\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\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\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: Object3DIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation.onChange( onRotationChange );\n\t\tquaternion.onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.userData = {};\n\n\t\tthis.onBeforeRender = function(){}; \n\t\tthis.onAfterRender = function(){};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype, {\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( (object && object.isObject3D) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\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\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\tvar count$2 = 0;\n\tfunction Object3DIdCount() { return count$2++; }\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\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\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar 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\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int16Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint16Array( array ), itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int32Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float64Array( array ), itemSize );\n\n\t}\n\n\t// Deprecated\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [ [] ];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype, {\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( (geometry && geometry.isGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = 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\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( (mesh && mesh.isMesh) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\tvar dupIndex = - 1;\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tdupIndex = n;\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [ [] ];\n\t\t\tthis.colors = [];\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( var i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( var i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( var k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tvar count$3 = 0;\n\tfunction GeometryIdCount() { return count$3++; }\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'DirectGeometry';\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tcomputeBoundingBox: Geometry.prototype.computeBoundingBox,\n\t\tcomputeBoundingSphere: Geometry.prototype.computeBoundingSphere,\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t}\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tthis.index = index;\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( (attribute && attribute.isBufferAttribute) === false && (attribute && attribute.isInterleavedBufferAttribute) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToVector3Array( position.array );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToVector3Array( normal.array );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isPoints) || (object && object.isLine) ) {\n\n\t\t\t\tvar positions = new Float32Attribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32Attribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32Attribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( (object && object.isMesh) ) {\n\n\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isMesh) ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32Attribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32Attribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32Attribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar positions = this.attributes.position.array;\n\n\t\t\tif ( positions !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromArray( positions );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar positions = this.attributes.position;\n\n\t\t\t\tif ( positions ) {\n\n\t\t\t\t\tvar array = positions.array;\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromArray( array );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\t\t\t\tvector.fromArray( array, i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC,\n\n\t\t\t\tpA = new Vector3(),\n\t\t\t\tpB = new Vector3(),\n\t\t\t\tpC = new Vector3(),\n\n\t\t\t\tcb = new Vector3(),\n\t\t\t\tab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( (geometry && geometry.isBufferGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) {\n\n\t\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\t\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\t\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar uvs, intersection;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( attributes.uv !== undefined ) {\n\n\t\t\t\t\t\tuvs = attributes.uv.array;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = indices[ i ];\n\t\t\t\t\t\t\tb = indices[ i + 1 ];\n\t\t\t\t\t\t\tc = indices[ i + 2 ];\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length; i < l; i += 9 ) {\n\n\t\t\t\t\t\t\ta = i / 3;\n\t\t\t\t\t\t\tb = a + 1;\n\t\t\t\t\t\t\tc = a + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = (material && material.isMultiMaterial);\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tvar scope = this;\n\n\t\t// segments\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = calculateVertexCount( widthSegments, heightSegments, depthSegments );\n\t\tvar indexCount = calculateIndexCount( widthSegments, heightSegments, depthSegments );\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\t\tvar numberOfVertices = 0;\n\n\t\t// group variables\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\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\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount( w, h, d ) {\n\n\t\t\tvar vertices = 0;\n\n\t\t\t// calculate the amount of vertices for each side (plane)\n\t\t\tvertices += (w + 1) * (h + 1) * 2; // xy\n\t\t\tvertices += (w + 1) * (d + 1) * 2; // xz\n\t\t\tvertices += (d + 1) * (h + 1) * 2; // zy\n\n\t\t\treturn vertices;\n\n\t\t}\n\n\t\tfunction calculateIndexCount( w, h, d ) {\n\n\t\t\tvar index = 0;\n\n\t\t\t// calculate the amount of squares for each side\n\t\t\tindex += w * h * 2; // xy\n\t\t\tindex += w * d * 2; // xz\n\t\t\tindex += d * h * 2; // zy\n\n\t\t\treturn index * 6; // two triangles per square => six vertices per square\n\n\t\t}\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth\t= width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tvertices[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tnormals[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tnormals[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tnormals[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// uvs\n\t\t\t\t\tuvs[ uvBufferOffset ] = ix / gridX;\n\t\t\t\t\tuvs[ uvBufferOffset + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\t\tuvBufferOffset += 2;\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\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 ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\t// indices\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tindexBufferOffset += 6;\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\n\n\t\tvar offset = 0;\n\t\tvar offset2 = 0;\n\n\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices[ offset ] = x;\n\t\t\t\tvertices[ offset + 1 ] = - y;\n\n\t\t\t\tnormals[ offset + 2 ] = 1;\n\n\t\t\t\tuvs[ offset2 ] = ix / gridX;\n\t\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\toffset += 3;\n\t\t\t\toffset2 += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\toffset = 0;\n\n\t\tvar indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 );\n\n\t\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices[ offset ] = a;\n\t\t\t\tindices[ offset + 1 ] = b;\n\t\t\t\tindices[ offset + 2 ] = d;\n\n\t\t\t\tindices[ offset + 3 ] = b;\n\t\t\t\tindices[ offset + 4 ] = c;\n\t\t\t\tindices[ offset + 5 ] = d;\n\n\t\t\t\toffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makeFrustum(\n\t\t\t\t\tleft, left + width, top - height, top, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = ( near !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\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\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( (position && position.isInterleavedBufferAttribute) ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '',\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( (map && map.isTexture) ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( (map && map.isWebGLRenderTarget) ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\t\t\tvar position = attributes.position;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar edges = {};\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar TypeArray = position.count > 65535 ? Uint32Array : Uint16Array;\n\t\t\tvar attribute = new BufferAttribute( new TypeArray( indices ), 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) return true;\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) return true;\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = (texture && texture.isCompressedTexture);\n\t\t\t\t\tvar isDataTexture = (texture.image[ 0 ] && texture.image[ 0 ].isDataTexture);\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( (texture && texture.isDepthTexture) ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( (texture && texture.isDataTexture) ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( (texture && texture.isCompressedTexture) ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\" );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( (renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture) ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a ) {\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar 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 ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tclearColor( 0, 0, 0, 1 );\n\t\t\tclearDepth( 1 );\n\t\t\tclearStencil( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tgl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction clearColor( r, g, b, a ) {\n\n\t\t\tcolorBuffer.setClear( r, g, b, a );\n\n\t\t}\n\n\t\tfunction clearDepth( depth ) {\n\n\t\t\tdepthBuffer.setClear( depth );\n\n\t\t}\n\n\t\tfunction clearStencil( stencil ) {\n\n\t\t\tstencilBuffer.setClear( stencil );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tclearColor: clearColor,\n\t\t\tclearDepth: clearDepth,\n\t\t\tclearStencil: clearStencil,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t// internal state cache\n\n\t\t_currentProgram = null,\n\t\t_currentRenderTarget = null,\n\t\t_currentFramebuffer = null,\n\t\t_currentMaterialId = - 1,\n\t\t_currentGeometryProgram = '',\n\t\t_currentCamera = null,\n\n\t\t_currentScissor = new Vector4(),\n\t\t_currentScissorTest = null,\n\n\t\t_currentViewport = new Vector4(),\n\n\t\t//\n\n\t\t_usedTextureUnits = 0,\n\n\t\t//\n\n\t\t_clearColor = new Color( 0x000000 ),\n\t\t_clearAlpha = 0,\n\n\t\t_width = _canvas.width,\n\t\t_height = _canvas.height,\n\n\t\t_pixelRatio = 1,\n\n\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t_scissorTest = false,\n\n\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t// frustum\n\n\t\t_frustum = new Frustum(),\n\n\t\t// clipping\n\n\t\t_clipping = new WebGLClipping(),\n\t\t_clippingEnabled = false,\n\t\t_localClippingEnabled = false,\n\n\t\t_sphere = new Sphere(),\n\n\t\t// camera matrices cache\n\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_vector3 = new Vector3(),\n\n\t\t// light arrays cache\n\n\t\t_lights = {\n\n\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\tshadows: []\n\n\t\t},\n\n\t\t// info\n\n\t\t_infoRender = {\n\n\t\t\tcalls: 0,\n\t\t\tvertices: 0,\n\t\t\tfaces: 0,\n\t\t\tpoints: 0\n\n\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\t\tvar backgroundCamera2 = new PerspectiveCamera();\n\t\tvar backgroundPlaneMesh = new Mesh(\n\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t);\n\t\tvar backgroundBoxShader = ShaderLib[ 'cube' ];\n\t\tvar backgroundBoxMesh = new Mesh(\n\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\tnew ShaderMaterial( {\n\t\t\t\tuniforms: backgroundBoxShader.uniforms,\n\t\t\t\tvertexShader: backgroundBoxShader.vertexShader,\n\t\t\t\tfragmentShader: backgroundBoxShader.fragmentShader,\n\t\t\t\tside: BackSide,\n\t\t\t\tdepthTest: false,\n\t\t\t\tdepthWrite: false,\n\t\t\t\tfog: false\n\t\t\t} )\n\t\t);\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction glClearColor( r, g, b, a ) {\n\n\t\t\tif ( _premultipliedAlpha === true ) {\n\n\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t}\n\n\t\t\tstate.clearColor( r, g, b, a );\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t ! material.isMeshStandardMaterial &&\n\t\t\t\t material.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar type = _gl.FLOAT;\n\t\t\t\t\t\tvar array = geometryAttribute.array;\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\n\t\t\t\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.FLOAT;\n\n\t\t\t\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.BYTE;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_BYTE;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\t\t\t\t\t\tvar buffer = objects.getAttributeBuffer( geometryAttribute );\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * geometryAttribute.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tglClearColor( background.r, background.g, background.b, 1 );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tbackgroundCamera2.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundCamera2.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundCamera2.matrixWorldInverse.getInverse( backgroundCamera2.matrixWorld );\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundCamera2.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera2, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\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: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t ! material.isRawShaderMaterial ||\n\t\t\t material.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = _lights.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\t_clipping.setState(\n\t\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes || \n\t \t\t\t\t materialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isShaderMaterial ||\n\t\t\t\t material.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t\t}\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\tr = 0, g = 0, b = 0,\n\t\t\tcolor,\n\t\t\tintensity,\n\t\t\tdistance,\n\t\t\tshadowMap,\n\n\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\t p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone( skin ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t\tthis.skin = skin;\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.skin = source.skin;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone( this );\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( (this.geometry && this.geometry.isGeometry) ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (this.geometry && this.geometry.isBufferGeometry) ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' )\n\n\t\t}\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.type = type !== undefined ? type : UnsignedShortType;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar numEdges = 0;\n\n\t\t\t// allocate maximal size\n\t\t\tvar edges = new Uint32Array( 6 * faces.length );\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\tnumEdges ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\tvar vertex = vertices[ edges [ 2 * i + j ] ];\n\n\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\tcoords[ index + 0 ] = vertex.x;\n\t\t\t\t\tcoords[ index + 1 ] = vertex.y;\n\t\t\t\t\tcoords[ index + 2 ] = vertex.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// Indexed BufferGeometry\n\n\t\t\t\tvar indices = geometry.index.array;\n\t\t\t\tvar vertices = geometry.attributes.position;\n\t\t\t\tvar groups = geometry.groups;\n\t\t\t\tvar numEdges = 0;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.length );\n\n\t\t\t\t}\n\n\t\t\t\t// allocate maximal size\n\t\t\t\tvar edges = new Uint32Array( 2 * indices.length );\n\n\t\t\t\tfor ( var o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tvar group = groups[ o ];\n\n\t\t\t\t\tvar start = group.start;\n\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices[ i + j ];\n\t\t\t\t\t\t\tedge[ 1 ] = indices[ i + ( j + 1 ) % 3 ];\n\t\t\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\t\t\tnumEdges ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\t\tvar index2 = edges[ 2 * i + j ];\n\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices.getX( index2 );\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices.getY( index2 );\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices.getZ( index2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tvar vertices = geometry.attributes.position.array;\n\t\t\t\tvar numEdges = vertices.length / 3;\n\t\t\t\tvar numTris = numEdges / 3;\n\n\t\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numTris; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tvar index = 18 * i + 6 * j;\n\n\t\t\t\t\t\tvar index1 = 9 * i + 3 * j;\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices[ index1 ];\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices[ index1 + 1 ];\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices[ index1 + 2 ];\n\n\t\t\t\t\t\tvar index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tcoords[ index + 3 ] = vertices[ index2 ];\n\t\t\t\t\t\tcoords[ index + 4 ] = vertices[ index2 + 1 ];\n\t\t\t\t\t\tcoords[ index + 5 ] = vertices[ index2 + 2 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// generate vertices and uvs\n\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j, p;\n\t\tvar u, v;\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tv = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tu = j / slices;\n\n\t\t\t\tp = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tvar indices = [];\n\t\tvar a, b, c, d;\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\ta = i * sliceCount + j;\n\t\t\t\tb = i * sliceCount + j + 1;\n\t\t\t\tc = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\td = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar 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\tappplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.addAttribute( 'position', Float32Attribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\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\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0 ; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( i = 0; i < cols ; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\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\n\t\t\t\t\t} else {\n\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\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction appplyRadius( radius ) {\n\n\t\t\tvar 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 ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\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\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\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\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar 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\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\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tvar 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\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\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 ).divideScalar( 3 );\n\n\t\t\t\tvar 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\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\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\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius,detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, 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\t r, - 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\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t *\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar 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\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar i, j, index = 0, indexOffset = 0;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\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\tvar 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\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\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar 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\t// vertex\n\t\t\t\tvertices.setXYZ( index, 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\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\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\n\t\t\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar 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\n\t\t}\n\n\t}\n\n\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\n\t\t// helper variables\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\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\tvertices[ vertexBufferOffset ] = vertex.x;\n\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vertex.y;\n\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vertex.z;\n\n\t\t\t\t// this vector is used to calculate the normal\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\n\t\t\t\t// normal\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals[ vertexBufferOffset ] = normal.x;\n\t\t\t\tnormals[ vertexBufferOffset + 1 ] = normal.y;\n\t\t\t\tnormals[ vertexBufferOffset + 2 ] = normal.z;\n\n\t\t\t\t// uv\n\t\t\t\tuvs[ uvBufferOffset ] = i / tubularSegments;\n\t\t\t\tuvs[ uvBufferOffset + 1 ] = j / radialSegments;\n\n\t\t\t\t// update offsets\n\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\tuvBufferOffset += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t// face two\n\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t// update offset\n\t\t\t\tindexBufferOffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\t\t// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t},\n\n\t\t// Bezier Curves formulas obtained from\n\t\t// http://en.wikipedia.org/wiki/B%C3%A9zier_curve\n\n\t\t// Quad Bezier Functions\n\n\t\tb2: ( function () {\n\n\t\t\tfunction b2p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p1( t, p ) {\n\n\t\t\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p2( t, p ) {\n\n\t\t\t\treturn t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b2( t, p0, p1, p2 ) {\n\n\t\t\t\treturn b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\t// Cubic Bezier Functions\n\n\t\tb3: ( function () {\n\n\t\t\tfunction b3p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p1( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * k * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p2( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * t * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p3( t, p ) {\n\n\t\t\t\treturn t * t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b3( t, p0, p1, p2, p3 ) {\n\n\t\t\t\treturn b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined)\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( (font && font.isFont) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * based on THREE.SphereGeometry\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) );\n\n\t\tvar positions = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\tvar index = 0, vertices = [], normal = new Vector3();\n\n\t\tfor ( var y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = y / heightSegments;\n\n\t\t\tfor ( var x = 0; x <= widthSegments; x ++ ) {\n\n\t\t\t\tvar u = x / widthSegments;\n\n\t\t\t\tvar px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvar py = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvar pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tnormal.set( px, py, pz ).normalize();\n\n\t\t\t\tpositions.setXYZ( index, px, py, pz );\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\tverticesRow.push( index );\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tvertices.push( verticesRow );\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var y = 0; y < heightSegments; y ++ ) {\n\n\t\t\tfor ( var x = 0; x < widthSegments; x ++ ) {\n\n\t\t\t\tvar v1 = vertices[ y ][ x + 1 ];\n\t\t\t\tvar v2 = vertices[ y ][ x ];\n\t\t\t\tvar v3 = vertices[ y + 1 ][ x ];\n\t\t\t\tvar v4 = vertices[ y + 1 ][ x + 1 ];\n\n\t\t\t\tif ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 );\n\t\t\t\tif ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new ( positions.count > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', positions );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( thetaSegments + 1 ) * ( phiSegments + 1 );\n\t\tvar indexCount = thetaSegments * phiSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// some helper variables\n\t\tvar index = 0, indexOffset = 0, segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\t// values are generate from the inside of the ring to the outside\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, 0, 1 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex++;\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t // points - to create a closed torus, one must use a set of points\n\t // like so: [ a, b, c, d, a ], see first is the same as last.\n\t // segments - the number of circumference segments to create\n\t // phiStart - the starting radian\n\t // phiLength - the radian (0 to 2PI) range of the lathed section\n\t // 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( segments + 1 ) * points.length;\n\t\tvar indexCount = segments * points.length * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar index = 0, indexOffset = 0, base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t} // next row\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t *\n\t * Creates a one-sided polygonal geometry from a path shape. Similar to\n\t * ExtrudeGeometry.\n\t *\n\t * parameters = {\n\t *\n\t *\tcurveSegments: , // number of points on the curves. NOT USED AT THE MOMENT.\n\t *\n\t *\tmaterial: // material index for front and back faces\n\t *\tuvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ShapeGeometry( shapes, options ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( Array.isArray( shapes ) === false ) shapes = [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * Add an array of shapes to THREE.ShapeGeometry.\n\t */\n\tShapeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tthis.addShape( shapes[ i ], options );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.\n\t */\n\tShapeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tif ( options === undefined ) options = {};\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar material = options.material;\n\t\tvar uvgen = options.UVGenerator === undefined ? ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;\n\n\t\t//\n\n\t\tvar i, l, hole;\n\n\t\tvar shapesOffset = this.vertices.length;\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe...\n\n\t\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\t\thole = holes[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( hole ) ) {\n\n\t\t\t\t\tholes[ i ] = hole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false;\n\n\t\t}\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t// Vertices\n\n\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\thole = holes[ i ];\n\t\t\tvertices = vertices.concat( hole );\n\n\t\t}\n\n\t\t//\n\n\t\tvar vert, vlen = vertices.length;\n\t\tvar face, flen = faces.length;\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = vertices[ i ];\n\n\t\t\tthis.vertices.push( new Vector3( vert.x, vert.y, 0 ) );\n\n\t\t}\n\n\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\tface = faces[ i ];\n\n\t\t\tvar a = face[ 0 ] + shapesOffset;\n\t\t\tvar b = face[ 1 ] + shapesOffset;\n\t\t\tvar c = face[ 2 ] + shapesOffset;\n\n\t\t\tthis.faces.push( new Face3( a, b, c, null, null, material ) );\n\t\t\tthis.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tvar geometry2;\n\n\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar vertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tvar key = edge.toString();\n\n\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\thash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\thash[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar coords = [];\n\n\t\tfor ( var key in hash ) {\n\n\t\t\tvar h = hash[ key ];\n\n\t\t\tif ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = vertices[ h.vert1 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t\tvertex = vertices[ h.vert2 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addAttribute( 'position', new BufferAttribute( new Float32Array( coords ), 3 ) );\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// used to calculate buffer length\n\n\t\tvar nbCap = 0;\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) nbCap ++;\n\t\t\tif ( radiusBottom > 0 ) nbCap ++;\n\n\t\t}\n\n\t\tvar vertexCount = calculateVertexCount();\n\t\tvar indexCount = calculateIndexCount();\n\n\t\t// buffers\n\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ), 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\n\t\tvar index = 0,\n\t\t indexOffset = 0,\n\t\t indexArray = [],\n\t\t halfHeight = height / 2;\n\n\t\t// group variables\n\t\tvar groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount() {\n\n\t\t\tvar count = ( radialSegments + 1 ) * ( heightSegments + 1 );\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += ( ( radialSegments + 1 ) * nbCap ) + ( radialSegments * nbCap );\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction calculateIndexCount() {\n\n\t\t\tvar count = radialSegments * heightSegments * 2 * 3;\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += radialSegments * nbCap * 3;\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar 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\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\t\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\t\t\t\t\tindexRow.push( index );\n\n\t\t\t\t\t// increase index\n\t\t\t\t\tindex ++;\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\t\t\t\t\tvar i1 = indexArray[ y ][ x ];\n\t\t\t\t\tvar i2 = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar i3 = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar i4 = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices.setX( indexOffset, i1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i3 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// update counters\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\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\n\t\t\t\t// vertex\n\t\t\t\tvertices.setXYZ( index, 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = 0.5;\n\t\t\t\tuv.y = 0.5;\n\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tcenterIndexEnd = 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\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\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.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t}\n\n\t\t\t\t// update counters\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tvar vertices = segments + 2;\n\n\t\tvar positions = new Float32Array( vertices * 3 );\n\t\tvar normals = new Float32Array( vertices * 3 );\n\t\tvar uvs = new Float32Array( vertices * 2 );\n\n\t\t// center data is already zero, but need to set a few extras\n\t\tnormals[ 2 ] = 1.0;\n\t\tuvs[ 0 ] = 0.5;\n\t\tuvs[ 1 ] = 0.5;\n\n\t\tfor ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\tpositions[ i ] = radius * Math.cos( segment );\n\t\t\tpositions[ i + 1 ] = radius * Math.sin( segment );\n\n\t\t\tnormals[ i + 2 ] = 1; // normal z\n\n\t\t\tuvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2;\n\t\t\tuvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( new Uint16Array( indices ), 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry,\n\t\tBoxGeometry: BoxGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib[ \"lights\" ],\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = materials instanceof Array ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 0.5;\n\t\tthis.metalness = 0.5;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t};\n\n\n\n\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction XHRLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( XHRLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[1];\n\t\t\t\tvar isBase64 = !!dataUriRegexResult[2];\n\t\t\t\tvar data = dataUriRegexResult[3];\n\n\t\t\t\tdata = window.decodeURIComponent(data);\n\n\t\t\t\tif( isBase64 ) {\n\t\t\t\t\tdata = window.atob(data);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { \"type\" : mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.XHRLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tvar DataTextureLoader = BinaryTextureLoader;\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( BinaryTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\t\t\timage.onload = function () {\n\n\t\t\t\timage.onload = null;\n\n\t\t\t\tURL.revokeObjectURL( image.src );\n\n\t\t\t\tif ( onLoad ) onLoad( image );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\t\t\timage.onerror = onError;\n\n\t\t\tif ( url.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\timage.src = url;\n\n\t\t\t} else {\n\n\t\t\t\tvar loader = new XHRLoader();\n\t\t\t\tloader.setPath( this.path );\n\t\t\t\tloader.setResponseType( 'blob' );\n\t\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\t\tloader.load( url, function ( blob ) {\n\n\t\t\t\t\timage.src = URL.createObjectURL( blob );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( light ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true,\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function() {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function() {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function( timeOffset ) {\n\n\t\t\tif( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function( timeScale ) {\n\n\t\t\tif( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\t\ttrim: function( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== -1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to , 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function() {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function() {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number',\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max(\n\t\t\t\t\t\tduration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0;\n\t\t\t\t\t\t\t\tm !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack(\n\t\t\t\t\t\t\t\t'.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader ( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tscope.parse( JSON.parse( text ), onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\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 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\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 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\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 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\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 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\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 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\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 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\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 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\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 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\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 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\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 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\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 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.SplineCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\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\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\t// TODO: Transformation for Curves?\n\n\t/**************************************************************\n\t *\t3D Curves\n\t **************************************************************/\n\n\t// A Factory method for creating new curve subclasses\n\n\tCurve.create = function ( constructor, getPointFunc ) {\n\n\t\tconstructor.prototype = Object.create( Curve.prototype );\n\t\tconstructor.prototype.constructor = constructor;\n\t\tconstructor.prototype.getPoint = getPointFunc;\n\n\t\treturn constructor;\n\n\t};\n\n\t/**************************************************************\n\t *\tLine\n\t **************************************************************/\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**************************************************************\n\t *\tEllipse curve\n\t **************************************************************/\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn new Vector2( x, y );\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar CurveUtils = {\n\n\t\ttangentQuadraticBezier: function ( t, p0, p1, p2 ) {\n\n\t\t\treturn 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 );\n\n\t\t},\n\n\t\t// Puay Bing, thanks for helping with this derivative!\n\n\t\ttangentCubicBezier: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\treturn - 3 * p0 * ( 1 - t ) * ( 1 - t ) +\n\t\t\t\t3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) +\n\t\t\t\t6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 +\n\t\t\t\t3 * t * t * p3;\n\n\t\t},\n\n\t\ttangentSpline: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\t// To check if my formulas are correct\n\n\t\t\tvar h00 = 6 * t * t - 6 * t; \t// derived from 2t^3 − 3t^2 + 1\n\t\t\tvar h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t\n\t\t\tvar h01 = - 6 * t * t + 6 * t; \t// − 2t3 + 3t2\n\t\t\tvar h11 = 3 * t * t - 2 * t;\t// t3 − t2\n\n\t\t\treturn h00 + h10 + h01 + h11;\n\n\t\t},\n\n\t\t// Catmull-Rom\n\n\t\tinterpolate: function( p0, p1, p2, p3, t ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t * t2;\n\t\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t};\n\n\t/**************************************************************\n\t *\tSpline curve\n\t **************************************************************/\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\treturn new Vector2(\n\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight )\n\t\t);\n\n\t};\n\n\t/**************************************************************\n\t *\tCubic Bezier curve\n\t **************************************************************/\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b3 = ShapeUtils.b3;\n\n\t\treturn new Vector2(\n\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t);\n\n\t};\n\n\tCubicBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentCubicBezier = CurveUtils.tangentCubicBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\ttangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t).normalize();\n\n\t};\n\n\t/**************************************************************\n\t *\tQuadratic Bezier curve\n\t **************************************************************/\n\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b2 = ShapeUtils.b2;\n\n\t\treturn new Vector2(\n\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t);\n\n\t};\n\n\n\tQuadraticBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentQuadraticBezier = CurveUtils.tangentQuadraticBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\ttangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t).normalize();\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t *\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\n\t// minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\tfunction ShapePath() {\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\t}\n\n\tShapePath.prototype = {\n\t\tmoveTo: function ( x, y ) {\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push(this.currentPath);\n\t\t\tthis.currentPath.moveTo( x, y );\n\t\t},\n\t\tlineTo: function ( x, y ) {\n\t\t\tthis.currentPath.lineTo( x, y );\n\t\t},\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\t\t},\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\t\t},\n\t\tsplineThru: function ( pts ) {\n\t\t\tthis.currentPath.splineThru( pts );\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar offset = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar ret = createPath( chars[ i ], scale, offset );\n\t\t\t\t\toffset += ret.offset;\n\n\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offset ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [], b2 = ShapeUtils.b2, b3 = ShapeUtils.b3;\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb2( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tb2( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb3( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tb3( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offset: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tfunction getAudioContext() {\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn context;\n\n\t}\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = getAudioContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = getAudioContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\t\tthis.source = this.context.createBufferSource();\n\t\tthis.source.onended = this.onEnded.bind( this );\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.source.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.source.buffer;\n\t\t\tsource.loop = this.source.loop;\n\t\t\tsource.onended = this.source.onended;\n\t\t\tsource.start( 0, this.startTime );\n\t\t\tsource.playbackRate.value = this.playbackRate;\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.value = this.playbackRate;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.source.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.loop = value;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\t\t\tmixFunction = this._slerp;\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\n\t\t\t\tbufferType = Array,\t\tmixFunction = this._select;\t\tbreak;\n\n\t\t\tdefault:\t\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( (root && root.isAnimationObjectGroup) ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:\\w+[\\/:])*)(\\w+)?(?:\\.(\\w+)(?:\\[(.+)\\])?)?\\.(\\w+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tvar knownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis.loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype, {\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function() {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function() {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function() {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function() {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Spline from Tween.js, slightly optimized (and trashed)\n\t * http://sole.github.com/tween.js/examples/05_spline.html\n\t *\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Spline( points ) {\n\n\t\tthis.points = points;\n\n\t\tvar c = [], v3 = { x: 0, y: 0, z: 0 },\n\t\tpoint, intPoint, weight, w2, w3,\n\t\tpa, pb, pc, pd;\n\n\t\tthis.initFromArray = function ( a ) {\n\n\t\t\tthis.points = [];\n\n\t\t\tfor ( var i = 0; i < a.length; i ++ ) {\n\n\t\t\t\tthis.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] };\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getPoint = function ( k ) {\n\n\t\t\tpoint = ( this.points.length - 1 ) * k;\n\t\t\tintPoint = Math.floor( point );\n\t\t\tweight = point - intPoint;\n\n\t\t\tc[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;\n\t\t\tc[ 1 ] = intPoint;\n\t\t\tc[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1;\n\t\t\tc[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2;\n\n\t\t\tpa = this.points[ c[ 0 ] ];\n\t\t\tpb = this.points[ c[ 1 ] ];\n\t\t\tpc = this.points[ c[ 2 ] ];\n\t\t\tpd = this.points[ c[ 3 ] ];\n\n\t\t\tw2 = weight * weight;\n\t\t\tw3 = weight * w2;\n\n\t\t\tv3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );\n\t\t\tv3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );\n\t\t\tv3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );\n\n\t\t\treturn v3;\n\n\t\t};\n\n\t\tthis.getControlPointsArray = function () {\n\n\t\t\tvar i, p, l = this.points.length,\n\t\t\t\tcoords = [];\n\n\t\t\tfor ( i = 0; i < l; i ++ ) {\n\n\t\t\t\tp = this.points[ i ];\n\t\t\t\tcoords[ i ] = [ p.x, p.y, p.z ];\n\n\t\t\t}\n\n\t\t\treturn coords;\n\n\t\t};\n\n\t\t// approximate length by summing linear segments\n\n\t\tthis.getLength = function ( nSubDivisions ) {\n\n\t\t\tvar i, index, nSamples, position,\n\t\t\t\tpoint = 0, intPoint = 0, oldIntPoint = 0,\n\t\t\t\toldPosition = new Vector3(),\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tchunkLengths = [],\n\t\t\t\ttotalLength = 0;\n\n\t\t\t// first point has 0 length\n\n\t\t\tchunkLengths[ 0 ] = 0;\n\n\t\t\tif ( ! nSubDivisions ) nSubDivisions = 100;\n\n\t\t\tnSamples = this.points.length * nSubDivisions;\n\n\t\t\toldPosition.copy( this.points[ 0 ] );\n\n\t\t\tfor ( i = 1; i < nSamples; i ++ ) {\n\n\t\t\t\tindex = i / nSamples;\n\n\t\t\t\tposition = this.getPoint( index );\n\t\t\t\ttmpVec.copy( position );\n\n\t\t\t\ttotalLength += tmpVec.distanceTo( oldPosition );\n\n\t\t\t\toldPosition.copy( position );\n\n\t\t\t\tpoint = ( this.points.length - 1 ) * index;\n\t\t\t\tintPoint = Math.floor( point );\n\n\t\t\t\tif ( intPoint !== oldIntPoint ) {\n\n\t\t\t\t\tchunkLengths[ intPoint ] = totalLength;\n\t\t\t\t\toldIntPoint = intPoint;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// last point ends with total length\n\n\t\t\tchunkLengths[ chunkLengths.length ] = totalLength;\n\n\t\t\treturn { chunks: chunkLengths, total: totalLength };\n\n\t\t};\n\n\t\tthis.reparametrizeByArcLength = function ( samplingCoef ) {\n\n\t\t\tvar i, j,\n\t\t\t\tindex, indexCurrent, indexNext,\n\t\t\t\trealDistance,\n\t\t\t\tsampling, position,\n\t\t\t\tnewpoints = [],\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tsl = this.getLength();\n\n\t\t\tnewpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() );\n\n\t\t\tfor ( i = 1; i < this.points.length; i ++ ) {\n\n\t\t\t\t//tmpVec.copy( this.points[ i - 1 ] );\n\t\t\t\t//linearDistance = tmpVec.distanceTo( this.points[ i ] );\n\n\t\t\t\trealDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ];\n\n\t\t\t\tsampling = Math.ceil( samplingCoef * realDistance / sl.total );\n\n\t\t\t\tindexCurrent = ( i - 1 ) / ( this.points.length - 1 );\n\t\t\t\tindexNext = i / ( this.points.length - 1 );\n\n\t\t\t\tfor ( j = 1; j < sampling - 1; j ++ ) {\n\n\t\t\t\t\tindex = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent );\n\n\t\t\t\t\tposition = this.getPoint( index );\n\t\t\t\t\tnewpoints.push( tmpVec.copy( position ).clone() );\n\n\t\t\t\t}\n\n\t\t\t\tnewpoints.push( tmpVec.copy( this.points[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tthis.points = newpoints;\n\n\t\t};\n\n\t\t// Catmull-Rom\n\n\t\tfunction interpolate( p0, p1, p2, p3, t, t2, t3 ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5,\n\t\t\t\tv1 = ( p3 - p1 ) * 0.5;\n\n\t\t\treturn ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\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\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\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( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar 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\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new Geometry();\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.colors.push( new Color( 0, 0, 1 ) );\n\t\t\t\tgeometry.colors.push( new Color( 0, 1, 0 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.dynamic = true;\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( (object && object.isBone) ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar geometry = this.geometry;\n\n\t\tvar matrixWorldInv = new Matrix4().getInverse( this.root.matrixWorld );\n\n\t\tvar boneMatrix = new Matrix4();\n\n\t\tvar j = 0;\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\tgeometry.vertices[ j ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\tgeometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.verticesNeedUpdate = true;\n\n\t\tgeometry.computeBoundingSphere();\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction HemisphereLightHelper( light, sphereSize ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.colors = [ new Color(), new Color() ];\n\n\t\tvar geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tgeometry.rotateX( - Math.PI / 2 );\n\n\t\tfor ( var i = 0, il = 8; i < il; i ++ ) {\n\n\t\t\tgeometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ];\n\n\t\t}\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: FaceColors, wireframe: true } );\n\n\t\tthis.lightSphere = new Mesh( geometry, material );\n\t\tthis.add( this.lightSphere );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.lightSphere.geometry.dispose();\n\t\tthis.lightSphere.material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tthis.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tthis.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tthis.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\t\t\tthis.lightSphere.geometry.colorsNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tdivisions = divisions || 1;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = ( size * 2 ) / divisions;\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - size; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - size, 0, k, size, 0, k );\n\t\t\tvertices.push( k, 0, - size, k, 0, size );\n\n\t\t\tvar color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32Attribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new Geometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar hexFrustum = 0xffaa00;\n\t\tvar hexCone = 0xff0000;\n\t\tvar hexUp = 0x00aaff;\n\t\tvar hexTarget = 0xffffff;\n\t\tvar hexCross = 0x333333;\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", hexFrustum );\n\t\taddLine( \"n2\", \"n4\", hexFrustum );\n\t\taddLine( \"n4\", \"n3\", hexFrustum );\n\t\taddLine( \"n3\", \"n1\", hexFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", hexFrustum );\n\t\taddLine( \"f2\", \"f4\", hexFrustum );\n\t\taddLine( \"f4\", \"f3\", hexFrustum );\n\t\taddLine( \"f3\", \"f1\", hexFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", hexFrustum );\n\t\taddLine( \"n2\", \"f2\", hexFrustum );\n\t\taddLine( \"n3\", \"f3\", hexFrustum );\n\t\taddLine( \"n4\", \"f4\", hexFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", hexCone );\n\t\taddLine( \"p\", \"n2\", hexCone );\n\t\taddLine( \"p\", \"n3\", hexCone );\n\t\taddLine( \"p\", \"n4\", hexCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", hexUp );\n\t\taddLine( \"u2\", \"u3\", hexUp );\n\t\taddLine( \"u3\", \"u1\", hexUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", hexTarget );\n\t\taddLine( \"p\", \"c\", hexCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", hexCross );\n\t\taddLine( \"cn3\", \"cn4\", hexCross );\n\n\t\taddLine( \"cf1\", \"cf2\", hexCross );\n\t\taddLine( \"cf3\", \"cf4\", hexCross );\n\n\t\tfunction addLine( a, b, hex ) {\n\n\t\t\taddPoint( a, hex );\n\t\t\taddPoint( b, hex );\n\n\t\t}\n\n\t\tfunction addPoint( id, hex ) {\n\n\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\tgeometry.colors.push( new Color( hex ) );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( geometry.vertices.length - 1 );\n\n\t\t}\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.camera = camera;\n\t\tif( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tgeometry.vertices[ points[ i ] ].copy( vector );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.verticesNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\t// a helper to show the world-axis-aligned bounding box for an object\n\n\tfunction BoundingBoxHelper( object, hex ) {\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0x888888;\n\n\t\tthis.object = object;\n\n\t\tthis.box = new Box3();\n\n\t\tMesh.call( this, new BoxGeometry( 1, 1, 1 ), new MeshBasicMaterial( { color: color, wireframe: true } ) );\n\n\t}\n\n\tBoundingBoxHelper.prototype = Object.create( Mesh.prototype );\n\tBoundingBoxHelper.prototype.constructor = BoundingBoxHelper;\n\n\tBoundingBoxHelper.prototype.update = function () {\n\n\t\tthis.box.setFromObject( this.object );\n\n\t\tthis.box.getSize( this.scale );\n\n\t\tthis.box.getCenter( this.position );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\tvar 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\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( (object && object.isBox3) ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry = new BufferGeometry();\n\tlineGeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\tvar coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t};\n\n\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = new Float32Array( [\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\tvar colors = new Float32Array( [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t] );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\tvar CatmullRomCurve3 = ( function() {\n\n\t\tvar\n\t\t\ttmp = new Vector3(),\n\t\t\tpx = new CubicPoly(),\n\t\t\tpy = new CubicPoly(),\n\t\t\tpz = new CubicPoly();\n\n\t\t/*\n\t\tBased on an optimized c++ solution in\n\t\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t\t - http://ideone.com/NoEbVM\n\n\t\tThis CubicPoly class could be used for reusing some variables and calculations,\n\t\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\t\twhich can be placed in CurveUtils.\n\t\t*/\n\n\t\tfunction CubicPoly() {}\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tCubicPoly.prototype.init = function( x0, x1, t0, t1 ) {\n\n\t\t\tthis.c0 = x0;\n\t\t\tthis.c1 = t0;\n\t\t\tthis.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tthis.c3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t};\n\n\t\tCubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\t// initCubicPoly\n\t\t\tthis.init( x1, x2, t1, t2 );\n\n\t\t};\n\n\t\t// standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4\n\t\tCubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) {\n\n\t\t\tthis.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t};\n\n\t\tCubicPoly.prototype.calc = function( t ) {\n\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t2 * t;\n\t\t\treturn this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3;\n\n\t\t};\n\n\t\t// Subclass Three.js curve\n\t\treturn Curve.create(\n\n\t\t\tfunction ( p /* array of Vector3 */ ) {\n\n\t\t\t\tthis.points = p || [];\n\t\t\t\tthis.closed = false;\n\n\t\t\t},\n\n\t\t\tfunction ( t ) {\n\n\t\t\t\tvar points = this.points,\n\t\t\t\t\tpoint, intPoint, weight, l;\n\n\t\t\t\tl = points.length;\n\n\t\t\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\t\t\tpoint = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\t\t\tintPoint = Math.floor( point );\n\t\t\t\tweight = point - intPoint;\n\n\t\t\t\tif ( this.closed ) {\n\n\t\t\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\t\t\tintPoint = l - 2;\n\t\t\t\t\tweight = 1;\n\n\t\t\t\t}\n\n\t\t\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\t\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate first point\n\t\t\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\t\t\tp0 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tp1 = points[ intPoint % l ];\n\t\t\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\t\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate last point\n\t\t\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\t\t\tp3 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t\t\t// safety check for repeated points\n\t\t\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t\t\t}\n\n\t\t\t\tvar v = new Vector3(\n\t\t\t\t\tpx.calc( weight ),\n\t\t\t\t\tpy.calc( weight ),\n\t\t\t\t\tpz.calc( weight )\n\t\t\t\t);\n\n\t\t\t\treturn v;\n\n\t\t\t}\n\n\t\t);\n\n\t} )();\n\n\t/**************************************************************\n\t *\tClosed Spline 3D curve\n\t **************************************************************/\n\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t/**************************************************************\n\t *\tSpline 3D curve\n\t **************************************************************/\n\n\n\tvar SplineCurve3 = Curve.create(\n\n\t\tfunction ( points /* array of Vector3 */ ) {\n\n\t\t\tconsole.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' );\n\t\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar points = this.points;\n\t\t\tvar point = ( points.length - 1 ) * t;\n\n\t\t\tvar intPoint = Math.floor( point );\n\t\t\tvar weight = point - intPoint;\n\n\t\t\tvar point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ];\n\t\t\tvar point1 = points[ intPoint ];\n\t\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\t\treturn new Vector3(\n\t\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight ),\n\t\t\t\tinterpolate( point0.z, point1.z, point2.z, point3.z, weight )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tCubic Bezier 3D curve\n\t **************************************************************/\n\n\tvar CubicBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2, v3 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\t\t\tthis.v3 = v3;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b3 = ShapeUtils.b3;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ),\n\t\t\t\tb3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tQuadratic Bezier 3D curve\n\t **************************************************************/\n\n\tvar QuadraticBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b2 = ShapeUtils.b2;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y ),\n\t\t\t\tb2( t, this.v0.z, this.v1.z, this.v2.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tLine3D\n\t **************************************************************/\n\n\tvar LineCurve3 = Curve.create(\n\n\t\tfunction ( v1, v2 ) {\n\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tif ( t === 1 ) {\n\n\t\t\t\treturn this.v2.clone();\n\n\t\t\t}\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\t\tvector.multiplyScalar( t );\n\t\t\tvector.add( this.v1 );\n\n\t\t\treturn vector;\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tArc curve\n\t **************************************************************/\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4 ( a, b, c, d, normal, color, materialIndex ) {\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction PointCloud ( geometry, material ) {\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction ParticleSystem ( geometry, material ) {\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction PointCloudMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleBasicMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleSystemMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction Vertex ( x, y, z ) {\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\t}\n\n\t//\n\n\tfunction EdgesHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\tfunction WireframeHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Line3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix3.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\t\textractPosition: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\t\t},\n\t\tsetRotationFromQuaternion: function ( q ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' );\n\t\t\treturn vector.applyProjection( this );\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t},\n\t\trotateAxis: function ( v ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\ttranslate: function ( v ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\t\t},\n\t\trotateX: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\t\t},\n\t\trotateY: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\t\t},\n\t\trotateZ: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\t\t},\n\t\trotateByAxis: function ( axis, angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.assign( Plane.prototype, {\n\t\tisIntersectionLine: function ( line ) {\n\t\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\t\treturn this.intersectsLine( line );\n\t\t}\n\t} );\n\n\tObject.assign( Quaternion.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\t\treturn vector.applyQuaternion( this );\n\t\t}\n\t} );\n\n\tObject.assign( Ray.prototype, {\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t}\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\t\textrude: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\t\t}\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\t\tsetEulerFromRotationMatrix: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Object3D.prototype, {\n\t\tgetChildByName: function ( name ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\t\t},\n\t\trenderDepth: function ( value ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\t\t}\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\t\teulerOrder: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\t\tobjects: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\t\tlength: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' );\n\t\t\t\treturn this.array.length;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\t\taddIndex: function ( index ) {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\t\t\tif ( indexOffset !== undefined ) {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\t\t},\n\t\tclearDrawCalls: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\t\t},\n\t\tcomputeTangents: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\t\t},\n\t\tcomputeOffsets: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\t\twrapAround: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\t\tmetal: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\t\tderivatives: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tEventDispatcher.prototype = Object.assign( Object.create( {\n\n\t\t// Note: Extra base ensures these properties are not 'assign'ed.\n\n\t\tconstructor: EventDispatcher,\n\n\t\tapply: function ( target ) {\n\n\t\t\tconsole.warn( \"THREE.EventDispatcher: .apply is deprecated, \" +\n\t\t\t\t\t\"just inherit or Object.assign the prototype to mix-in.\" );\n\n\t\t\tObject.assign( target, this );\n\n\t\t}\n\n\t} ), EventDispatcher.prototype );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\t\tdynamic: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\t\tsupportsFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\t\t\treturn this.capabilities.vertexTextures;\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\t\t},\n\t\tinitMaterial: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\t\t},\n\t\taddPrePlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\t\t},\n\t\taddPostPlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\t\t},\n\t\tupdateShadowMap: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.enabled;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.cullFace;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\t\tcullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\t\twrapS: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Audio.prototype, {\n\t\tload: function ( file ) {\n\t\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.' );\n\t\t\tvar scope = this;\n\t\t\tvar audioLoader = new AudioLoader();\n\t\t\taudioLoader.load( file, function ( buffer ) {\n\t\t\t\tscope.setBuffer( buffer );\n\t\t\t} );\n\t\t\treturn this;\n\t\t}\n\t} );\n\n\tObject.assign( AudioAnalyser.prototype, {\n\t\tgetData: function ( file ) {\n\t\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\t\treturn this.getFrequencyData();\n\t\t}\n\t} );\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector () {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function ( vector, camera ) {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer () {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.TextureIdCount = TextureIdCount;\n\texports.Texture = Texture;\n\texports.MaterialIdCount = MaterialIdCount;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.XHRLoader = XHRLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.getAudioContext = getAudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3DIdCount = Object3DIdCount;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Spline = Spline;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.ColorKeywords = ColorKeywords;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.ShapePath = ShapePath;\n\texports.Path = Path;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.CurveUtils = CurveUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.BlendingMode = BlendingMode;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.TextureMapping = TextureMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.TextureWrapping = TextureWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.TextureFilter = TextureFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MultiMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Sprite;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n\tObject.defineProperty( exports, 'AudioContext', {\n\t\tget: function () {\n\t\t\treturn exports.getAudioContext();\n\t\t}\n\t});\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 6\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), 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// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\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 THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = 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, must be a sub-interval of the interval [ - Math.PI, Math.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 = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 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.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// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\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: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar 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\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\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\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\t\t\t\tscope.target.add( panOffset );\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 );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\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} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\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 ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t}();\n\n\t\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\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\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\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\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\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\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\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\tscope.update();\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\tscope.update();\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\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\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 onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 7\n// module chunks = 0","'use strict';\n\nmodule.exports = function (THREE) {\n\n /**\n * @author mrdoob / http://mrdoob.com/\n */\n THREE.OBJLoader = function (manager) {\n\n this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager;\n };\n\n THREE.OBJLoader.prototype = {\n\n constructor: THREE.OBJLoader,\n\n load: function load(url, onLoad, onProgress, onError) {\n\n var scope = this;\n\n var loader = new THREE.XHRLoader(scope.manager);\n loader.load(url, function (text) {\n\n onLoad(scope.parse(text));\n }, onProgress, onError);\n },\n\n parse: function parse(text) {\n\n console.time('OBJLoader');\n\n var object,\n objects = [];\n var geometry, material;\n\n function parseVertexIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + vertices.length / 3) * 3;\n }\n\n function parseNormalIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + normals.length / 3) * 3;\n }\n\n function parseUVIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + uvs.length / 2) * 2;\n }\n\n function addVertex(a, b, c) {\n\n geometry.vertices.push(vertices[a], vertices[a + 1], vertices[a + 2], vertices[b], vertices[b + 1], vertices[b + 2], vertices[c], vertices[c + 1], vertices[c + 2]);\n }\n\n function addNormal(a, b, c) {\n\n geometry.normals.push(normals[a], normals[a + 1], normals[a + 2], normals[b], normals[b + 1], normals[b + 2], normals[c], normals[c + 1], normals[c + 2]);\n }\n\n function addUV(a, b, c) {\n\n geometry.uvs.push(uvs[a], uvs[a + 1], uvs[b], uvs[b + 1], uvs[c], uvs[c + 1]);\n }\n\n function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) {\n\n var ia = parseVertexIndex(a);\n var ib = parseVertexIndex(b);\n var ic = parseVertexIndex(c);\n var id;\n\n if (d === undefined) {\n\n addVertex(ia, ib, ic);\n } else {\n\n id = parseVertexIndex(d);\n\n addVertex(ia, ib, id);\n addVertex(ib, ic, id);\n }\n\n if (ua !== undefined) {\n\n ia = parseUVIndex(ua);\n ib = parseUVIndex(ub);\n ic = parseUVIndex(uc);\n\n if (d === undefined) {\n\n addUV(ia, ib, ic);\n } else {\n\n id = parseUVIndex(ud);\n\n addUV(ia, ib, id);\n addUV(ib, ic, id);\n }\n }\n\n if (na !== undefined) {\n\n ia = parseNormalIndex(na);\n ib = parseNormalIndex(nb);\n ic = parseNormalIndex(nc);\n\n if (d === undefined) {\n\n addNormal(ia, ib, ic);\n } else {\n\n id = parseNormalIndex(nd);\n\n addNormal(ia, ib, id);\n addNormal(ib, ic, id);\n }\n }\n }\n\n // create mesh if no objects in text\n\n if (/^o /gm.test(text) === false) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: '',\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n }\n\n var vertices = [];\n var normals = [];\n var uvs = [];\n\n // v float float float\n\n var vertex_pattern = /v( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vn float float float\n\n var normal_pattern = /vn( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vt float float\n\n var uv_pattern = /vt( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // f vertex vertex vertex ...\n\n var face_pattern1 = /f( +-?\\d+)( +-?\\d+)( +-?\\d+)( +-?\\d+)?/;\n\n // f vertex/uv vertex/uv vertex/uv ...\n\n var face_pattern2 = /f( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...\n\n var face_pattern3 = /f( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex//normal vertex//normal vertex//normal ...\n\n var face_pattern4 = /f( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))?/;\n\n //\n\n var lines = text.split('\\n');\n\n for (var i = 0; i < lines.length; i++) {\n\n var line = lines[i];\n line = line.trim();\n\n var result;\n\n if (line.length === 0 || line.charAt(0) === '#') {\n\n continue;\n } else if ((result = vertex_pattern.exec(line)) !== null) {\n\n // [\"v 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = normal_pattern.exec(line)) !== null) {\n\n // [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n normals.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = uv_pattern.exec(line)) !== null) {\n\n // [\"vt 0.1 0.2\", \"0.1\", \"0.2\"]\n\n uvs.push(parseFloat(result[1]), parseFloat(result[2]));\n } else if ((result = face_pattern1.exec(line)) !== null) {\n\n // [\"f 1 2 3\", \"1\", \"2\", \"3\", undefined]\n\n addFace(result[1], result[2], result[3], result[4]);\n } else if ((result = face_pattern2.exec(line)) !== null) {\n\n // [\"f 1/1 2/2 3/3\", \" 1/1\", \"1\", \"1\", \" 2/2\", \"2\", \"2\", \" 3/3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], result[3], result[6], result[9], result[12]);\n } else if ((result = face_pattern3.exec(line)) !== null) {\n\n // [\"f 1/1/1 2/2/2 3/3/3\", \" 1/1/1\", \"1\", \"1\", \"1\", \" 2/2/2\", \"2\", \"2\", \"2\", \" 3/3/3\", \"3\", \"3\", \"3\", undefined, undefined, undefined, undefined]\n\n addFace(result[2], result[6], result[10], result[14], result[3], result[7], result[11], result[15], result[4], result[8], result[12], result[16]);\n } else if ((result = face_pattern4.exec(line)) !== null) {\n\n // [\"f 1//1 2//2 3//3\", \" 1//1\", \"1\", \"1\", \" 2//2\", \"2\", \"2\", \" 3//3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], undefined, undefined, undefined, undefined, result[3], result[6], result[9], result[12]);\n } else if (/^o /.test(line)) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: line.substring(2).trim(),\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n } else if (/^g /.test(line)) {\n\n // group\n\n } else if (/^usemtl /.test(line)) {\n\n // material\n\n material.name = line.substring(7).trim();\n } else if (/^mtllib /.test(line)) {\n\n // mtl file\n\n } else if (/^s /.test(line)) {\n\n // smooth shading\n\n } else {\n\n // console.log( \"THREE.OBJLoader: Unhandled line \" + line );\n\n }\n }\n\n var container = new THREE.Object3D();\n var l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n\n object = objects[i];\n geometry = object.geometry;\n\n var buffergeometry = new THREE.BufferGeometry();\n\n buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3));\n\n if (geometry.normals.length > 0) {\n\n buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3));\n }\n\n if (geometry.uvs.length > 0) {\n\n buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2));\n }\n\n material = new THREE.MeshLambertMaterial({\n color: 0xff0000\n });\n material.name = object.material.name;\n\n var mesh = new THREE.Mesh(buffergeometry, material);\n mesh.name = object.name;\n\n container.add(mesh);\n }\n\n console.timeEnd('OBJLoader');\n\n return container;\n }\n\n };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-obj-loader/dist/index.js\n// module id = 8\n// module chunks = 0","// A class that represents a symbol replacement rule to\n// be used when expanding an L-system grammar.\nfunction Rule(prob, str) {\n\tthis.probability = prob; // The probability that this Rule will be used when replacing a character in the grammar string\n\tthis.successorString = str; // The string that will replace the char that maps to this Rule\n}\n\n// TODO: Implement a linked list class and its requisite functions\n// as described in the homework writeup\nfunction LinkedList() {\n\tthis.head = null;\n\tthis.tail = null;\n\tthis.dictionary = null; \n\n\tthis.link = function(a, b) {\n\t\ta.next = b;\n\t\tb.prev = a;\n\t}\n\n\tthis.expand = function(node, iteration) {\n\t\tvar rules = this.dictionary[node.symbol];\n\n\t\t// Randomly chooses the rule to expand from\n\t\tvar rv = Math.random();\n\t\tvar chosenRule;\n\t\tvar sum = 0.0;\n\t\tif (typeof rules !== \"undefined\") {\n\t\t\tfor (var i = 0; i < rules.length; i++) {\n\t\t\t\tif (rv <= sum + rules[i].probability) {\n\t\t\t\t\tchosenRule = rules[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsum += rules[i].probability;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Replaces node with the new list\n\t\t\treplaceNode(this, node, chosenRule.successorString, iteration);\n\t\t}\n\t}\n}\nfunction Node(sym) {\n\tthis.next = null;\n\tthis.prev = null;\n\tthis.symbol = sym;\n\tthis.iteration = 1;\n}\n\n\n// TODO: Turn the string into linked list \nfunction stringToLinkedList(input_string) {\n\t// ex. assuming input_string = \"F+X\"\n\t// you should return a linked list where the head is \n\t// at Node('F') and the tail is at Node('X')\n\tvar ll = new LinkedList();\n\tll.head = new Node(input_string.charAt(0));\n\tvar currNode = ll.head;\n\tfor (var i = 1; i < input_string.length; i++) {\n\t\tvar n = new Node(input_string.charAt(i));\n\t\tcurrNode.next = n;\n\t\tn.prev = currNode;\n\t\tcurrNode = currNode.next;\n\t}\n\tll.tail = currNode;\n\treturn ll;\n}\n\n// TODO: Return a string form of the LinkedList\nfunction linkedListToString(linkedList) {\n\t// ex. Node1(\"F\")->Node2(\"X\") should be \"FX\"\n\tvar result = \"\";\n\tvar currNode = linkedList.head;\n\twhile (currNode != null) {\n\t\tresult += currNode.symbol;\n\t\tcurrNode = currNode.next;\n\t}\n\treturn result;\n}\n\n// TODO: Given the node to be replaced, \n// insert a sub-linked-list that represents replacementString\nfunction replaceNode(linkedList, node, replacementString, iteration) {\n\t// Creates a linkedlist from the rule \n\tvar expanded = stringToLinkedList(replacementString);\n\tvar currNode = expanded.head;\n\twhile (currNode != null) {\n\t\t// Store iteration for each node after replacement\n\t\tcurrNode.iteration = iteration;\n\t\tcurrNode = currNode.next;\n\t}\n \tvar next = node.next;\n\texpanded.tail.next = next;\n\tif (node.prev != null) {\n\t\tnode.prev.next = expanded.head;\n\t}\n}\n\nfunction Lsystem(axiom, grammar, iterations) {\n\t// default LSystem\n\tthis.axiom = \"123\";\n\tthis.grammar = {};\n\tthis.grammar['1'] = [\n\t\tnew Rule(0.33333, 'FFA[-2]3[+3]'), \n\t\tnew Rule(0.33333, 'FFA[W2]3[Q3]'),\n\t\tnew Rule(0.33333, 'FFA[R2]3[E3]')\n\t];\n\tthis.grammar['2'] = [\n\t\tnew Rule(0.33333, 'FAF+F-F-F[FF3][+3]-F-F3'),\n\t\tnew Rule(0.33333, 'FAFQFWFWF[FF3][Q3]WFWF3'),\n\t\tnew Rule(0.33333, 'FAFEFRFRF[FFF3][E3]RFRF3'),\n\t];\n\tthis.grammar['3'] = [\n\t\tnew Rule(0.33333, 'FF-F+F+F[2][-2]+F+FA2'), \n\t\tnew Rule(0.33333, 'FFWFQFQF[2][W2]QFQFA2'), \n\t\tnew Rule(0.33333, 'FFRFEFEF[2][R2]EFEFA2')\n\t];\n\tthis.iterations = 0; \n\t\n\t// Set up the axiom string\n\tif (typeof axiom !== \"undefined\") {\n\t\tthis.axiom = axiom;\n\t}\n\n\t// Set up the grammar as a dictionary that \n\t// maps a single character (symbol) to a Rule.\n\tif (typeof grammar !== \"undefined\") {\n\t\tthis.grammar = Object.assign({}, grammar);\n\t}\n\t\n\t// Set up iterations (the number of times you \n\t// should expand the axiom in DoIterations)\n\tif (typeof iterations !== \"undefined\") {\n\t\tthis.iterations = iterations;\n\t}\n\n\t// A function to alter the axiom string stored \n\t// in the L-system\n\tthis.updateAxiom = function(axiom) {\n\t\t// Setup axiom\n\t\tif (typeof axiom !== \"undefined\") {\n\t\t\tthis.axiom = axiom;\n\t\t}\n\t}\n\n\t// TODO\n\t// This function returns a linked list that is the result \n\t// of expanding the L-system's axiom n times.\n\t// The implementation we have provided you just returns a linked\n\t// list of the axiom.\n\tthis.doIterations = function(n) {\t\n\t\tthis.iterations = n;\n\t\tvar lSystemLL = stringToLinkedList(this.axiom);\n\t\tlSystemLL.dictionary = this.grammar;\n\t\tvar currNode = lSystemLL.head;\n\n\t\tfor (var i = 1; i <= this.iterations; i++) {\n\t\t\tvar currNode = lSystemLL.head;\n\t\t\twhile (currNode != null) {\n\t\t\t\tvar next = currNode.next;\n\t\t\t\tlSystemLL.expand(currNode, i);\n\t\t\t\tcurrNode = next;\n\t\t\t}\n\t\t\t\n\t\t}\n\t\tconsole.log(lSystemLL);\t\t\n\t\treturn lSystemLL;\n\t}\n}\n\nexport default {\n\tLinkedList: LinkedList,\n\tLsystem : Lsystem,\n\tstringToLinkedList : stringToLinkedList,\n\tlinkedListToString : linkedListToString\n}\n\n\n// WEBPACK FOOTER //\n// ./src/lsystem.js","const THREE = require('three')\n\nvar objLoader = new THREE.OBJLoader();\nvar flowGeometry;\nobjLoader.load('lotus_OBJ_low.obj', function(obj) {\n\n // LOOK: This function runs after the obj has finished loading\n flowGeometry = obj.children[0].geometry;\n});\n\n// A class used to encapsulate the state of a turtle at a given moment.\n// The Turtle class contains one TurtleState member variable.\n// You are free to add features to this state class,\n// such as color or whimiscality\nvar TurtleState = function(pos, dir) {\n return {\n pos: new THREE.Vector3(pos.x, pos.y, pos.z),\n dir: new THREE.Vector3(dir.x, dir.y, dir.z), \n }\n}\n \nexport default class Turtle {\n constructor(scene, grammar) {\n this.state = new TurtleState(new THREE.Vector3(0,-5,-10), new THREE.Vector3(0,1,0));\n this.scene = scene;\n this.stack = [];\n this.angle = 15;\n this.iteration = 1;\n // TODO: Start by adding rules for '[' and ']' then more!\n // Make sure to implement the functions for the new rules inside Turtle\n if (typeof grammar === \"undefined\") {\n this.renderGrammar = {\n '+' : this.rotateTurtle.bind(this, 0, 0, 0, -1, 0, 0),\n '-' : this.rotateTurtle.bind(this, 0, 0, 0, 1, 0, 0),\n 'F' : this.makeCylinder.bind(this, 2, 0.1), \n '[' : this.saveState.bind(this), \n ']' : this.restoreState.bind(this), \n 'Q' : this.rotateTurtle.bind(this, 0, 0, 0, 0, -1, 0),\n 'W' : this.rotateTurtle.bind(this, 0, 0, 0, 0, 1, 0),\n 'E' : this.rotateTurtle.bind(this, 0, 0, 0, 0, 0, -1),\n 'R' : this.rotateTurtle.bind(this, 0, 0, 0, 0, 0, 1), \n 'A' : this.drawFlower.bind(this, 2, 0.1)\n };\n } else {\n this.renderGrammar = grammar;\n }\n }\n drawFlower(len, width) {\n //var tmp_turtle = this;\n if (this.iteration > 0) {\n //this.scene.add(mesh);\n//\n //var quat = new THREE.Quaternion();\n //quat.setFromUnitVectors(new THREE.Vector3(0,1,0), this.state.dir);\n //var mat4 = new THREE.Matrix4();\n //mat4.makeRotationFromQuaternion(quat);\n //mesh.applyMatrix(mat4);\n//\n //var mat5 = new THREE.Matrix4();\n //var trans = this.state.pos.add(this.state.dir.multiplyScalar(0.5 * len));\n //mat5.makeTranslation(trans.x, trans.y, trans.z);\n //mesh.applyMatrix(mat5);\n\n //this.moveForward(len/2);\n }\n }\n saveState() {\n var newPos = this.state.pos;\n var newDir = this.state.dir;\n var newState = new TurtleState(newPos, newDir);\n this.stack.push(newState);\n }\n restoreState() {\n this.state = this.stack.pop();\n }\n // Resets the turtle's position to the origin\n // and its orientation to the Y axis\n clear() {\n this.state = new TurtleState(new THREE.Vector3(0,0,0), new THREE.Vector3(0,1,0)); \n }\n\n // A function to help you debug your turtle functions\n // by printing out the turtle's current state.\n printState() {\n console.log(this.state.pos)\n console.log(this.state.dir)\n }\n\n // Rotate the turtle's _dir_ vector by each of the \n // Euler angles indicated by the input.\n rotateTurtle(x, y, z, signx, signy, signz ) {\n var e = new THREE.Euler(\n signx*this.angle * 3.14/180,\n\t\t\t\tsigny*this.angle * 3.14/180,\n\t\t\t\tsignz*this.angle * 3.14/180);\n this.state.dir.applyEuler(e);\n }\n\n // Translate the turtle along the input vector.\n // Does NOT change the turtle's _dir_ vector\n moveTurtle(x, y, z) {\n\t var new_vec = THREE.Vector3(x, y, z);\n\t this.state.pos.add(new_vec);\n };\n\n // Translate the turtle along its _dir_ vector by the distance indicated\n moveForward(dist) {\n var newVec = this.state.dir.multiplyScalar(dist);\n this.state.pos.add(newVec);\n };\n \n // Make a cylinder of given length and width starting at turtle pos\n // Moves turtle pos ahead to end of the new cylinder\n makeCylinder(len, width) {\n var geometry = new THREE.CylinderGeometry(1.5/this.iteration, 1.5/this.iteration, len);\n var material = new THREE.MeshLambertMaterial( {color: 0xba8964, side: THREE.DoubleSide} );\n var cylinder = new THREE.Mesh( geometry, material );\n var materialBlue = new THREE.MeshLambertMaterial({ color: 0x00ccff, side: THREE.DoubleSide });\n var mesh = new THREE.Mesh(flowGeometry, materialBlue);\n this.scene.add( cylinder );\n if (Math.random() < 0.25 && this.iteration > 1) {\n this.scene.add(mesh); \n }\n \n //Orient the cylinder to the turtle's current direction\n var quat = new THREE.Quaternion();\n quat.setFromUnitVectors(new THREE.Vector3(0,1,0), this.state.dir);\n var mat4 = new THREE.Matrix4();\n mat4.makeRotationFromQuaternion(quat);\n cylinder.applyMatrix(mat4);\n mesh.applyMatrix(mat4);\n\n //Move the cylinder so its base rests at the turtle's current position\n var mat5 = new THREE.Matrix4();\n var trans = this.state.pos.add(this.state.dir.multiplyScalar(0.5 * len));\n mat5.makeTranslation(trans.x, trans.y, trans.z);\n cylinder.applyMatrix(mat5);\n mesh.applyMatrix(mat5);\n //Scoot the turtle forward by len units\n this.moveForward(len/2);\n };\n \n // Call the function to which the input symbol is bound.\n // Look in the Turtle's constructor for examples of how to bind \n // functions to grammar symbols.\n renderSymbol(symbolNode) {\n var func = this.renderGrammar[symbolNode.symbol];\n this.iteration = symbolNode.iteration;\n if (func) {\n func();\n }\n };\n\n // Invoke renderSymbol for every node in a linked list of grammar symbols.\n renderSymbols(linkedList) {\n var currentNode;\n for(currentNode = linkedList.head; currentNode != null; currentNode = currentNode.next) {\n this.renderSymbol(currentNode);\n }\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/turtle.js"],"sourceRoot":""} \ No newline at end of file diff --git a/lotus_OBJ_low.obj b/lotus_OBJ_low.obj new file mode 100755 index 0000000..6331a0e --- /dev/null +++ b/lotus_OBJ_low.obj @@ -0,0 +1,47943 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 25.01.2017 16:45:43 + +# +# object lotu_petal_00 +# + +v -0.1775 0.1439 -0.0821 +v -0.1564 0.1404 -0.0160 +v -0.0808 0.1302 -0.0248 +v -0.0917 0.1257 -0.0896 +v -0.1988 0.1445 -0.1576 +v -0.1022 0.1222 -0.1638 +v -0.2186 0.1559 -0.2412 +v -0.1144 0.1316 -0.2467 +v -0.2428 0.1763 -0.3370 +v -0.1296 0.1562 -0.3392 +v -0.2655 0.1747 -0.0817 +v -0.2339 0.1669 -0.0137 +v -0.2958 0.1771 -0.1539 +v -0.3250 0.1906 -0.2362 +v -0.3546 0.2083 -0.3294 +v -0.3511 0.2041 -0.0772 +v -0.3109 0.2003 -0.0161 +v -0.3904 0.2146 -0.1555 +v -0.4295 0.2340 -0.2389 +v -0.4627 0.2488 -0.3318 +v -0.4358 0.2452 -0.0823 +v -0.3870 0.2390 -0.0211 +v -0.4832 0.2617 -0.1554 +v -0.5324 0.2700 -0.2347 +v -0.5732 0.2780 -0.3155 +v -0.0766 0.1332 0.0333 +v -0.0153 0.1323 0.0290 +v -0.0114 0.1294 -0.0303 +v -0.0136 0.1451 -0.3556 +v -0.0179 0.1630 -0.4583 +v -0.1395 0.1730 -0.4417 +v -0.6185 0.2830 -0.4053 +v -0.7380 0.3129 -0.3827 +v -0.6851 0.3076 -0.2841 +v -0.4555 0.2861 -0.0210 +v -0.3843 0.2853 0.0319 +v -0.3226 0.2392 0.0349 +v -0.0109 0.1213 -0.0985 +v -0.2591 0.1985 -0.4420 +v -0.6318 0.3063 -0.2030 +v -0.2609 0.1973 0.0368 +v -0.0084 0.1174 -0.1755 +v -0.3775 0.2273 -0.4362 +v -0.5739 0.3009 -0.1385 +v -0.2011 0.1641 0.0405 +v -0.0091 0.1218 -0.2612 +v -0.4982 0.2487 -0.4327 +v -0.5133 0.2901 -0.0813 +v -0.1391 0.1489 0.0421 +v -0.2800 0.2079 -0.6673 +v -0.2691 0.2064 -0.5529 +v -0.1411 0.1847 -0.5530 +v -0.1475 0.2085 -0.6725 +v -0.2890 0.2351 -0.7938 +v -0.1523 0.2207 -0.7986 +v -0.2968 0.2752 -0.9301 +v -0.1569 0.2625 -0.9358 +v -0.3063 0.3357 -1.0751 +v -0.1668 0.3165 -1.0866 +v -0.4141 0.2339 -0.6611 +v -0.4002 0.2246 -0.5457 +v -0.4259 0.2496 -0.7851 +v -0.4384 0.2915 -0.9182 +v -0.4467 0.3593 -1.0589 +v -0.5503 0.2653 -0.6507 +v -0.5338 0.2495 -0.5414 +v -0.5618 0.2789 -0.7667 +v -0.5775 0.3282 -0.8934 +v -0.5905 0.3839 -1.0386 +v -0.6835 0.3040 -0.6089 +v -0.6609 0.2867 -0.5019 +v -0.6928 0.3277 -0.7290 +v -0.7118 0.3718 -0.8612 +v -0.7322 0.4339 -1.0019 +v -0.0157 0.1698 -0.5699 +v -0.0265 0.3010 -1.1018 +v -0.0336 0.3492 -1.2605 +v -0.1745 0.3648 -1.2416 +v -0.7408 0.4973 -1.1644 +v -0.8785 0.5661 -1.1597 +v -0.8669 0.4817 -1.0056 +v -0.7833 0.3270 -0.4878 +v -0.0179 0.1973 -0.6886 +v -0.3148 0.3881 -1.2300 +v -0.8526 0.4240 -0.8650 +v -0.0183 0.2147 -0.8143 +v -0.4579 0.4110 -1.2210 +v -0.8266 0.3747 -0.7298 +v -0.0193 0.2508 -0.9510 +v -0.6016 0.4479 -1.1966 +v -0.8096 0.3482 -0.6072 +v -0.2815 0.5505 -1.6125 +v -0.2996 0.4546 -1.4115 +v -0.1606 0.4384 -1.4201 +v -0.1500 0.5389 -1.6206 +v -0.2614 0.6774 -1.8181 +v -0.1329 0.6574 -1.8272 +v -0.2447 0.8000 -1.9988 +v -0.1229 0.7993 -2.0271 +v -0.2149 0.9369 -2.1762 +v -0.1030 0.9402 -2.1923 +v -0.4130 0.5764 -1.5975 +v -0.4398 0.4958 -1.3969 +v -0.3922 0.7056 -1.8027 +v -0.3708 0.8282 -1.9803 +v -0.3317 0.9566 -2.1428 +v -0.5456 0.6120 -1.5831 +v -0.5797 0.5199 -1.3788 +v -0.5251 0.7408 -1.7855 +v -0.4970 0.8652 -1.9666 +v -0.4534 0.9840 -2.1272 +v -0.6837 0.6494 -1.5562 +v -0.7195 0.5740 -1.3482 +v -0.6555 0.7665 -1.7649 +v -0.6196 0.9047 -1.9452 +v -0.5743 1.0335 -2.1049 +v -0.0220 0.4280 -1.4336 +v 0.0048 0.9340 -2.1975 +v -0.0023 1.0629 -2.3370 +v -0.1049 1.0728 -2.3329 +v -0.5226 1.1525 -2.2541 +v -0.6287 1.2062 -2.2130 +v -0.6874 1.0871 -2.0714 +v -0.8614 0.6279 -1.3359 +v -0.0184 0.5378 -1.6322 +v -0.2089 1.0868 -2.3304 +v -0.7416 0.9428 -1.9105 +v -0.0087 0.6478 -1.8280 +v -0.3134 1.0994 -2.3134 +v -0.7790 0.8095 -1.7311 +v -0.0072 0.7980 -2.0197 +v -0.4176 1.1177 -2.2860 +v -0.8181 0.6991 -1.5381 +v -0.1599 1.3341 -2.5191 +v -0.1815 1.2145 -2.4377 +v -0.0897 1.1994 -2.4477 +v -0.0826 1.3237 -2.5304 +v -0.1205 1.4538 -2.5793 +v -0.0550 1.4483 -2.5898 +v -0.1034 1.5718 -2.6525 +v -0.0508 1.5668 -2.6581 +v -0.0808 1.6807 -2.6999 +v -0.0436 1.6820 -2.7053 +v -0.2373 1.3466 -2.5131 +v -0.2729 1.2276 -2.4268 +v -0.1881 1.4633 -2.5766 +v -0.1597 1.5720 -2.6413 +v -0.1224 1.6772 -2.6937 +v -0.3170 1.3657 -2.4966 +v -0.3667 1.2514 -2.4063 +v -0.2585 1.4743 -2.5645 +v -0.2155 1.5765 -2.6303 +v -0.1644 1.6708 -2.6817 +v -0.3975 1.3899 -2.4722 +v -0.4618 1.2783 -2.3744 +v -0.3292 1.4872 -2.5514 +v -0.2699 1.5840 -2.6211 +v -0.2006 1.6656 -2.6738 +v 0.0045 1.1938 -2.4497 +v -0.0148 1.6818 -2.7068 +v -0.0210 1.7909 -2.7219 +v -0.0404 1.7873 -2.7205 +v -0.1207 1.7503 -2.7065 +v -0.1370 1.7310 -2.7009 +v -0.2290 1.6590 -2.6613 +v -0.5606 1.3126 -2.3338 +v -0.0035 1.3198 -2.5327 +v -0.0599 1.7824 -2.7217 +v -0.3180 1.5903 -2.6047 +v 0.0070 1.4437 -2.5941 +v -0.0797 1.7759 -2.7203 +v -0.3980 1.5056 -2.5343 +v -0.0064 1.5656 -2.6557 +v -0.1000 1.7650 -2.7137 +v -0.4830 1.4212 -2.4476 +v 0.3473 0.2027 -0.1059 +v 0.2909 0.1999 -0.0413 +v 0.3673 0.2344 -0.0402 +v 0.4381 0.2366 -0.0984 +v 0.3912 0.2063 -0.1780 +v 0.4944 0.2443 -0.1714 +v 0.4245 0.2189 -0.2583 +v 0.5358 0.2469 -0.2526 +v 0.4564 0.2195 -0.3520 +v 0.5762 0.2580 -0.3471 +v 0.2518 0.1753 -0.1060 +v 0.2107 0.1719 -0.0442 +v 0.2866 0.1745 -0.1783 +v 0.3151 0.1820 -0.2644 +v 0.3362 0.1922 -0.3591 +v 0.1589 0.1511 -0.1072 +v 0.1319 0.1514 -0.0368 +v 0.1845 0.1440 -0.1857 +v 0.2078 0.1540 -0.2727 +v 0.2200 0.1757 -0.3668 +v 0.0702 0.1317 -0.1051 +v 0.0573 0.1361 -0.0371 +v 0.0858 0.1316 -0.1814 +v 0.0986 0.1334 -0.2672 +v 0.1036 0.1515 -0.3625 +v 0.2924 0.2331 0.0107 +v 0.3581 0.2822 0.0166 +v 0.4419 0.2825 -0.0316 +v 0.7003 0.3006 -0.3479 +v 0.7342 0.3325 -0.4460 +v 0.6065 0.2633 -0.4525 +v 0.1052 0.1687 -0.4667 +v 0.0445 0.1400 0.0226 +v 0.5267 0.2876 -0.0923 +v 0.4814 0.2374 -0.4512 +v 0.1036 0.1528 0.0240 +v 0.5954 0.2871 -0.1708 +v 0.3571 0.2134 -0.4620 +v 0.1641 0.1724 0.0147 +v 0.6528 0.2902 -0.2596 +v 0.2305 0.1916 -0.4696 +v 0.2284 0.1980 0.0146 +v 0.5280 0.2664 -0.6683 +v 0.5004 0.2489 -0.5576 +v 0.6319 0.2864 -0.5621 +v 0.6643 0.3078 -0.6766 +v 0.5492 0.2969 -0.7919 +v 0.6960 0.3319 -0.7959 +v 0.5540 0.3370 -0.9241 +v 0.7025 0.3851 -0.9222 +v 0.5478 0.3844 -1.0662 +v 0.6909 0.4414 -1.0576 +v 0.3902 0.2492 -0.6825 +v 0.3722 0.2301 -0.5693 +v 0.4032 0.2707 -0.8025 +v 0.4071 0.2994 -0.9341 +v 0.4056 0.3349 -1.0748 +v 0.2503 0.2122 -0.6945 +v 0.2414 0.2012 -0.5777 +v 0.2581 0.2393 -0.8186 +v 0.2629 0.2532 -0.9527 +v 0.2599 0.2945 -1.0981 +v 0.1132 0.1906 -0.6964 +v 0.1108 0.1793 -0.5786 +v 0.1170 0.2263 -0.8202 +v 0.1200 0.2483 -0.9574 +v 0.1149 0.2925 -1.1081 +v 0.7635 0.3557 -0.5471 +v 0.8398 0.4952 -1.0381 +v 0.8199 0.5411 -1.1898 +v 0.6730 0.4856 -1.2118 +v 0.1081 0.3504 -1.2661 +v 0.8006 0.3613 -0.6567 +v 0.5293 0.4235 -1.2205 +v 0.8333 0.3871 -0.7750 +v 0.3901 0.3796 -1.2309 +v 0.8402 0.4330 -0.8992 +v 0.2505 0.3588 -1.2582 +v 0.5308 0.6182 -1.5921 +v 0.5300 0.5175 -1.4045 +v 0.6681 0.5592 -1.3828 +v 0.6621 0.6588 -1.5787 +v 0.5055 0.7257 -1.7854 +v 0.6331 0.7702 -1.7621 +v 0.4750 0.8751 -1.9700 +v 0.5960 0.9171 -1.9371 +v 0.4473 1.0205 -2.1320 +v 0.5521 1.0510 -2.1075 +v 0.3920 0.5733 -1.6033 +v 0.3922 0.4610 -1.4103 +v 0.3761 0.6896 -1.8054 +v 0.3522 0.8434 -1.9905 +v 0.3389 0.9987 -2.1693 +v 0.2522 0.5448 -1.6287 +v 0.2547 0.4371 -1.4335 +v 0.2447 0.6731 -1.8221 +v 0.2295 0.8316 -2.0132 +v 0.2257 0.9704 -2.1842 +v 0.1147 0.5398 -1.6303 +v 0.1164 0.4279 -1.4381 +v 0.1157 0.6616 -1.8308 +v 0.1084 0.8043 -2.0266 +v 0.1124 0.9408 -2.1954 +v 0.8051 0.5947 -1.3656 +v 0.6575 1.0780 -2.0816 +v 0.5991 1.2010 -2.2206 +v 0.4984 1.1795 -2.2599 +v 0.0990 1.0700 -2.3383 +v 0.7949 0.6890 -1.5639 +v 0.3987 1.1531 -2.2893 +v 0.7609 0.8064 -1.7436 +v 0.2984 1.1271 -2.3104 +v 0.7081 0.9447 -1.9125 +v 0.1988 1.0974 -2.3284 +v 0.3155 1.3940 -2.4959 +v 0.3588 1.2738 -2.4003 +v 0.4461 1.2941 -2.3719 +v 0.3943 1.4139 -2.4641 +v 0.2746 1.5052 -2.5652 +v 0.3386 1.5206 -2.5469 +v 0.2076 1.6070 -2.6329 +v 0.2604 1.6138 -2.6110 +v 0.1339 1.7095 -2.6819 +v 0.1733 1.7061 -2.6733 +v 0.2372 1.3706 -2.5163 +v 0.2739 1.2493 -2.4184 +v 0.2069 1.4865 -2.5782 +v 0.1487 1.6029 -2.6440 +v 0.0925 1.7074 -2.6926 +v 0.1572 1.3454 -2.5298 +v 0.1871 1.2165 -2.4406 +v 0.1369 1.4664 -2.5895 +v 0.0908 1.5888 -2.6529 +v 0.0512 1.6980 -2.7004 +v 0.0766 1.3244 -2.5345 +v 0.0978 1.1970 -2.4495 +v 0.0694 1.4485 -2.5971 +v 0.0378 1.5744 -2.6537 +v 0.0139 1.6881 -2.7056 +v 0.5376 1.3250 -2.3425 +v 0.2091 1.6976 -2.6636 +v 0.1074 1.7835 -2.7079 +v 0.0808 1.7871 -2.7098 +v -0.0013 1.7938 -2.7237 +v 0.4715 1.4315 -2.4351 +v 0.0596 1.7912 -2.7166 +v 0.3983 1.5339 -2.5250 +v 0.0391 1.7947 -2.7226 +v 0.3061 1.6203 -2.5942 +v 0.0186 1.7971 -2.7244 +v -0.0810 0.1032 -0.0283 +v -0.1586 0.1147 -0.0189 +v -0.1808 0.1186 -0.0852 +v -0.0916 0.0989 -0.0964 +v -0.2016 0.1184 -0.1597 +v -0.1021 0.0954 -0.1712 +v -0.2254 0.1301 -0.2449 +v -0.1184 0.1053 -0.2545 +v -0.2469 0.1510 -0.3418 +v -0.1317 0.1298 -0.3475 +v -0.2411 0.1432 -0.0103 +v -0.2736 0.1494 -0.0801 +v -0.3026 0.1522 -0.1522 +v -0.3293 0.1651 -0.2366 +v -0.3598 0.1833 -0.3347 +v -0.3218 0.1763 -0.0057 +v -0.3634 0.1792 -0.0723 +v -0.4010 0.1900 -0.1530 +v -0.4374 0.2095 -0.2378 +v -0.4726 0.2230 -0.3323 +v -0.3994 0.2193 -0.0074 +v -0.4491 0.2223 -0.0744 +v -0.4940 0.2358 -0.1489 +v -0.5425 0.2420 -0.2307 +v -0.5821 0.2507 -0.3134 +v -0.0085 0.1053 0.0264 +v -0.0732 0.1065 0.0311 +v -0.0087 0.1024 -0.0329 +v -0.1420 0.1462 -0.4501 +v -0.0187 0.1359 -0.4655 +v -0.0137 0.1185 -0.3619 +v -0.7465 0.2869 -0.3826 +v -0.6261 0.2573 -0.4044 +v -0.6960 0.2814 -0.2826 +v -0.3365 0.2224 0.0510 +v -0.4004 0.2680 0.0500 +v -0.4712 0.2675 -0.0081 +v -0.0081 0.0941 -0.1013 +v -0.2640 0.1722 -0.4455 +v -0.6447 0.2789 -0.1981 +v -0.2746 0.1784 0.0483 +v -0.0061 0.0904 -0.1789 +v -0.3847 0.2006 -0.4402 +v -0.5868 0.2770 -0.1299 +v -0.2087 0.1401 0.0471 +v -0.0099 0.0950 -0.2660 +v -0.5035 0.2221 -0.4340 +v -0.5293 0.2660 -0.0713 +v -0.1402 0.1227 0.0399 +v -0.1435 0.1591 -0.5586 +v -0.2719 0.1794 -0.5556 +v -0.2842 0.1806 -0.6740 +v -0.1500 0.1811 -0.6756 +v -0.2930 0.2095 -0.7979 +v -0.1547 0.1945 -0.8052 +v -0.3010 0.2498 -0.9362 +v -0.1608 0.2386 -0.9417 +v -0.3108 0.3103 -1.0832 +v -0.1684 0.2910 -1.0931 +v -0.4020 0.1973 -0.5514 +v -0.4192 0.2067 -0.6669 +v -0.4322 0.2233 -0.7920 +v -0.4419 0.2674 -0.9270 +v -0.4525 0.3340 -1.0709 +v -0.5353 0.2240 -0.5439 +v -0.5545 0.2400 -0.6552 +v -0.5697 0.2533 -0.7726 +v -0.5850 0.3040 -0.9003 +v -0.5935 0.3606 -1.0431 +v -0.6676 0.2610 -0.5053 +v -0.6911 0.2790 -0.6135 +v -0.7026 0.3047 -0.7355 +v -0.7220 0.3486 -0.8677 +v -0.7387 0.4115 -1.0120 +v -0.0167 0.1437 -0.5752 +v -0.1745 0.3384 -1.2539 +v -0.0312 0.3226 -1.2707 +v -0.0263 0.2743 -1.1091 +v -0.8892 0.5424 -1.1679 +v -0.7489 0.4749 -1.1699 +v -0.8786 0.4590 -1.0153 +v -0.7939 0.3015 -0.4896 +v -0.0186 0.1708 -0.6930 +v -0.3179 0.3631 -1.2403 +v -0.8576 0.4018 -0.8690 +v -0.0190 0.1880 -0.8211 +v -0.4593 0.3879 -1.2284 +v -0.8348 0.3491 -0.7342 +v -0.0213 0.2251 -0.9576 +v -0.6044 0.4234 -1.2042 +v -0.8201 0.3222 -0.6069 +v -0.1594 0.4124 -1.4331 +v -0.3009 0.4315 -1.4213 +v -0.2888 0.5258 -1.6230 +v -0.1525 0.5162 -1.6302 +v -0.2657 0.6540 -1.8343 +v -0.1348 0.6358 -1.8388 +v -0.2490 0.7796 -2.0170 +v -0.1250 0.7775 -2.0417 +v -0.2199 0.9176 -2.1919 +v -0.1022 0.9208 -2.2112 +v -0.4419 0.4728 -1.4094 +v -0.4223 0.5511 -1.6091 +v -0.3978 0.6826 -1.8163 +v -0.3755 0.8034 -1.9988 +v -0.3369 0.9396 -2.1593 +v -0.5838 0.4984 -1.3872 +v -0.5540 0.5896 -1.5951 +v -0.5305 0.7191 -1.8029 +v -0.5043 0.8469 -1.9857 +v -0.4569 0.9690 -2.1446 +v -0.7252 0.5510 -1.3545 +v -0.6887 0.6254 -1.5662 +v -0.6635 0.7447 -1.7812 +v -0.6289 0.8847 -1.9647 +v -0.5810 1.0205 -2.1218 +v -0.0185 0.4041 -1.4487 +v -0.1042 1.0536 -2.3541 +v 0.0004 1.0448 -2.3587 +v 0.0089 0.9112 -2.2148 +v -0.6404 1.1916 -2.2317 +v -0.5317 1.1375 -2.2719 +v -0.6969 1.0714 -2.0867 +v -0.8663 0.6049 -1.3458 +v -0.0182 0.5140 -1.6448 +v -0.2101 1.0702 -2.3474 +v -0.7485 0.9247 -1.9260 +v -0.0083 0.6255 -1.8407 +v -0.3176 1.0854 -2.3270 +v -0.7902 0.7907 -1.7464 +v -0.0062 0.7778 -2.0361 +v -0.4251 1.1051 -2.3023 +v -0.8268 0.6747 -1.5508 +v -0.0913 1.1819 -2.4704 +v -0.1842 1.1987 -2.4612 +v -0.1697 1.3190 -2.5415 +v -0.0903 1.3084 -2.5540 +v -0.1296 1.4400 -2.6044 +v -0.0612 1.4364 -2.6146 +v -0.1098 1.5585 -2.6758 +v -0.0544 1.5564 -2.6822 +v -0.0850 1.6722 -2.7261 +v -0.0453 1.6721 -2.7320 +v -0.2779 1.2115 -2.4476 +v -0.2477 1.3306 -2.5361 +v -0.1984 1.4486 -2.6011 +v -0.1685 1.5584 -2.6660 +v -0.1282 1.6674 -2.7196 +v -0.3725 1.2377 -2.4270 +v -0.3256 1.3482 -2.5176 +v -0.2666 1.4637 -2.5876 +v -0.2261 1.5651 -2.6563 +v -0.1707 1.6619 -2.7075 +v -0.4696 1.2677 -2.3935 +v -0.4074 1.3779 -2.4934 +v -0.3360 1.4787 -2.5749 +v -0.2784 1.5745 -2.6450 +v -0.2090 1.6580 -2.6984 +v 0.0043 1.1751 -2.4742 +v -0.0406 1.7808 -2.7473 +v -0.0198 1.7852 -2.7482 +v -0.0132 1.6751 -2.7322 +v -0.1446 1.7240 -2.7279 +v -0.1243 1.7403 -2.7326 +v -0.2395 1.6510 -2.6863 +v -0.5709 1.3041 -2.3521 +v -0.0087 1.3030 -2.5566 +v -0.0612 1.7749 -2.7491 +v -0.3242 1.5846 -2.6280 +v 0.0040 1.4314 -2.6176 +v -0.0818 1.7656 -2.7464 +v -0.4042 1.4925 -2.5579 +v -0.0067 1.5567 -2.6793 +v -0.1029 1.7544 -2.7393 +v -0.4921 1.4135 -2.4675 +v 0.3794 0.2137 -0.0300 +v 0.3013 0.1751 -0.0323 +v 0.3545 0.1767 -0.0997 +v 0.4483 0.2138 -0.0952 +v 0.3986 0.1807 -0.1753 +v 0.5054 0.2209 -0.1716 +v 0.4335 0.1919 -0.2597 +v 0.5461 0.2220 -0.2542 +v 0.4623 0.1936 -0.3552 +v 0.5865 0.2313 -0.3487 +v 0.2205 0.1471 -0.0371 +v 0.2588 0.1494 -0.1036 +v 0.2936 0.1491 -0.1757 +v 0.3237 0.1553 -0.2629 +v 0.3431 0.1655 -0.3589 +v 0.1416 0.1246 -0.0330 +v 0.1660 0.1252 -0.1043 +v 0.1913 0.1179 -0.1849 +v 0.2098 0.1280 -0.2720 +v 0.2242 0.1487 -0.3668 +v 0.0635 0.1093 -0.0399 +v 0.0757 0.1050 -0.1082 +v 0.0908 0.1050 -0.1852 +v 0.0991 0.1069 -0.2705 +v 0.1056 0.1248 -0.3646 +v 0.3675 0.2656 0.0320 +v 0.3034 0.2136 0.0237 +v 0.4520 0.2623 -0.0198 +v 0.6171 0.2387 -0.4563 +v 0.7454 0.3087 -0.4434 +v 0.7099 0.2769 -0.3437 +v 0.1067 0.1419 -0.4694 +v 0.0547 0.1131 0.0196 +v 0.5355 0.2660 -0.0852 +v 0.4910 0.2103 -0.4588 +v 0.1158 0.1263 0.0261 +v 0.6055 0.2613 -0.1695 +v 0.3612 0.1870 -0.4634 +v 0.1752 0.1478 0.0194 +v 0.6614 0.2658 -0.2570 +v 0.2333 0.1650 -0.4720 +v 0.2373 0.1734 0.0241 +v 0.6428 0.2613 -0.5643 +v 0.5131 0.2229 -0.5650 +v 0.5375 0.2405 -0.6772 +v 0.6738 0.2817 -0.6788 +v 0.5546 0.2720 -0.7981 +v 0.7028 0.3073 -0.7997 +v 0.5595 0.3113 -0.9319 +v 0.7086 0.3622 -0.9320 +v 0.5579 0.3618 -1.0778 +v 0.7005 0.4177 -1.0689 +v 0.3811 0.2034 -0.5746 +v 0.3954 0.2224 -0.6898 +v 0.4069 0.2454 -0.8104 +v 0.4135 0.2753 -0.9418 +v 0.4097 0.3094 -1.0838 +v 0.2458 0.1741 -0.5826 +v 0.2530 0.1858 -0.6980 +v 0.2609 0.2127 -0.8252 +v 0.2654 0.2265 -0.9595 +v 0.2621 0.2698 -1.1076 +v 0.1121 0.1516 -0.5823 +v 0.1142 0.1649 -0.7015 +v 0.1182 0.1999 -0.8283 +v 0.1194 0.2220 -0.9626 +v 0.1167 0.2675 -1.1152 +v 0.7722 0.3294 -0.5480 +v 0.6811 0.4622 -1.2213 +v 0.8267 0.5164 -1.1984 +v 0.8457 0.4717 -1.0456 +v 0.1115 0.3243 -1.2774 +v 0.8091 0.3359 -0.6586 +v 0.5396 0.4008 -1.2285 +v 0.8435 0.3622 -0.7791 +v 0.3987 0.3559 -1.2404 +v 0.8533 0.4086 -0.9079 +v 0.2541 0.3342 -1.2680 +v 0.6788 0.5357 -1.3929 +v 0.5394 0.4958 -1.4167 +v 0.5365 0.5946 -1.6064 +v 0.6745 0.6360 -1.5941 +v 0.5150 0.7058 -1.7987 +v 0.6434 0.7515 -1.7799 +v 0.4836 0.8582 -1.9888 +v 0.6060 0.8993 -1.9546 +v 0.4605 1.0031 -2.1486 +v 0.5657 1.0328 -2.1230 +v 0.4003 0.4386 -1.4221 +v 0.3935 0.5508 -1.6172 +v 0.3820 0.6699 -1.8178 +v 0.3599 0.8241 -2.0076 +v 0.3466 0.9795 -2.1850 +v 0.2604 0.4129 -1.4463 +v 0.2524 0.5223 -1.6408 +v 0.2486 0.6507 -1.8375 +v 0.2338 0.8112 -2.0305 +v 0.2297 0.9495 -2.2036 +v 0.1211 0.4058 -1.4510 +v 0.1161 0.5166 -1.6449 +v 0.1180 0.6396 -1.8475 +v 0.1109 0.7846 -2.0439 +v 0.1180 0.9196 -2.2144 +v 0.8182 0.5730 -1.3778 +v 0.5104 1.1642 -2.2792 +v 0.6101 1.1860 -2.2388 +v 0.6701 1.0616 -2.1011 +v 0.1042 1.0528 -2.3550 +v 0.8049 0.6655 -1.5761 +v 0.4086 1.1362 -2.3061 +v 0.7696 0.7843 -1.7644 +v 0.3077 1.1090 -2.3308 +v 0.7223 0.9264 -1.9314 +v 0.2067 1.0777 -2.3455 +v 0.4594 1.2804 -2.3919 +v 0.3707 1.2614 -2.4223 +v 0.3244 1.3811 -2.5185 +v 0.4051 1.4015 -2.4854 +v 0.2833 1.4928 -2.5900 +v 0.3514 1.5092 -2.5695 +v 0.2127 1.6017 -2.6551 +v 0.2700 1.6058 -2.6351 +v 0.1419 1.7062 -2.7076 +v 0.1817 1.7010 -2.6998 +v 0.2826 1.2347 -2.4388 +v 0.2406 1.3608 -2.5391 +v 0.2103 1.4763 -2.6036 +v 0.1532 1.5960 -2.6676 +v 0.0990 1.7045 -2.7172 +v 0.1936 1.2021 -2.4610 +v 0.1569 1.3323 -2.5528 +v 0.1379 1.4592 -2.6151 +v 0.0948 1.5854 -2.6769 +v 0.0569 1.6930 -2.7259 +v 0.1006 1.1808 -2.4709 +v 0.0738 1.3116 -2.5596 +v 0.0689 1.4392 -2.6228 +v 0.0405 1.5687 -2.6770 +v 0.0184 1.6847 -2.7321 +v 0.5501 1.3094 -2.3641 +v 0.0846 1.7769 -2.7345 +v 0.1061 1.7667 -2.7281 +v 0.2150 1.6896 -2.6867 +v 0.0011 1.7877 -2.7499 +v 0.4845 1.4192 -2.4566 +v 0.0642 1.7814 -2.7416 +v 0.4132 1.5235 -2.5473 +v 0.0436 1.7863 -2.7481 +v 0.3191 1.6099 -2.6197 +v 0.0223 1.7889 -2.7506 +# 650 vertices + +vn 0.2577 0.9644 -0.0587 +vn 0.2344 0.9666 -0.1040 +vn 0.0765 0.9953 -0.0592 +vn 0.1216 0.9894 -0.0789 +vn 0.2692 0.9631 -0.0040 +vn 0.1401 0.9901 0.0115 +vn 0.2679 0.9585 0.0977 +vn 0.1595 0.9766 0.1444 +vn 0.2311 0.9601 0.1572 +vn 0.1518 0.9693 0.1936 +vn 0.3300 0.9413 -0.0712 +vn 0.3456 0.9300 -0.1255 +vn 0.3470 0.9371 -0.0392 +vn 0.3456 0.9373 0.0462 +vn 0.3008 0.9506 0.0765 +vn 0.3906 0.9115 -0.1290 +vn 0.4251 0.8592 -0.2846 +vn 0.3945 0.9180 -0.0417 +vn 0.3473 0.9373 0.0298 +vn 0.3079 0.9508 -0.0324 +vn 0.4525 0.8703 -0.1945 +vn 0.4716 0.7783 -0.4145 +vn 0.4061 0.9059 -0.1201 +vn 0.3212 0.9434 -0.0821 +vn 0.2536 0.9662 -0.0457 +vn 0.0899 0.9920 -0.0887 +vn -0.0558 0.9971 -0.0526 +vn -0.0499 0.9952 -0.0841 +vn 0.0307 0.9803 0.1950 +vn 0.0354 0.9923 0.1189 +vn 0.1515 0.9811 0.1204 +vn 0.2521 0.9655 -0.0652 +vn 0.2415 0.9703 -0.0146 +vn 0.2504 0.9640 -0.0893 +vn 0.5016 0.7185 -0.4819 +vn 0.4801 0.6022 -0.6378 +vn 0.4792 0.6704 -0.5665 +vn -0.0403 0.9958 -0.0816 +vn 0.2072 0.9738 0.0942 +vn 0.3050 0.9371 -0.1701 +vn 0.4645 0.7820 -0.4156 +vn -0.0397 0.9992 0.0095 +vn 0.2117 0.9767 0.0363 +vn 0.3736 0.9015 -0.2186 +vn 0.3034 0.9400 -0.1562 +vn 0.0000 0.9898 0.1422 +vn 0.2341 0.9706 -0.0560 +vn 0.4753 0.8072 -0.3500 +vn 0.2427 0.9511 -0.1910 +vn 0.1095 0.9875 0.1133 +vn 0.1657 0.9855 0.0375 +vn 0.1246 0.9851 0.1182 +vn 0.0713 0.9843 0.1617 +vn 0.1021 0.9682 0.2285 +vn 0.0922 0.9770 0.1921 +vn 0.1252 0.9345 0.3331 +vn 0.1080 0.9450 0.3088 +vn 0.1656 0.9293 0.3302 +vn 0.1464 0.9404 0.3068 +vn 0.2035 0.9765 0.0715 +vn 0.1792 0.9837 0.0154 +vn 0.1914 0.9586 0.2107 +vn 0.2033 0.9199 0.3353 +vn 0.2033 0.9130 0.3536 +vn 0.2744 0.9569 0.0952 +vn 0.2351 0.9717 0.0243 +vn 0.3041 0.9321 0.1966 +vn 0.3243 0.8945 0.3077 +vn 0.3083 0.8894 0.3375 +vn 0.3213 0.9395 0.1190 +vn 0.2990 0.9542 -0.0042 +vn 0.3487 0.9176 0.1907 +vn 0.3475 0.8899 0.2955 +vn 0.3540 0.8713 0.3399 +vn 0.0337 0.9890 0.1442 +vn 0.0998 0.9507 0.2937 +vn 0.0820 0.9310 0.3557 +vn 0.1587 0.9307 0.3295 +vn 0.4024 0.8485 0.3436 +vn 0.4045 0.8446 0.3508 +vn 0.2998 0.8662 0.3998 +vn 0.3008 0.9527 0.0433 +vn 0.0604 0.9854 0.1590 +vn 0.1862 0.9213 0.3413 +vn 0.3219 0.8967 0.3037 +vn 0.0203 0.9754 0.2196 +vn 0.2246 0.9067 0.3570 +vn 0.3223 0.9201 0.2227 +vn 0.0605 0.9599 0.2739 +vn 0.3324 0.8749 0.3522 +vn 0.3268 0.9363 0.1282 +vn 0.1680 0.8567 0.4877 +vn 0.2130 0.8948 0.3924 +vn 0.1222 0.8988 0.4209 +vn 0.0891 0.8690 0.4867 +vn 0.1993 0.8159 0.5427 +vn 0.1133 0.8358 0.5372 +vn 0.2072 0.7759 0.5959 +vn 0.0588 0.7835 0.6187 +vn 0.1833 0.7343 0.6536 +vn 0.0695 0.7452 0.6632 +vn 0.2567 0.8438 0.4713 +vn 0.2451 0.8788 0.4094 +vn 0.2580 0.7936 0.5510 +vn 0.2662 0.7563 0.5975 +vn 0.2733 0.7233 0.6342 +vn 0.2820 0.8351 0.4723 +vn 0.3085 0.8600 0.4066 +vn 0.2698 0.7808 0.5635 +vn 0.3171 0.7349 0.5995 +vn 0.3227 0.6979 0.6393 +vn 0.3518 0.8221 0.4477 +vn 0.3793 0.8427 0.3820 +vn 0.3308 0.7580 0.5621 +vn 0.3644 0.6860 0.6298 +vn 0.4341 0.6299 0.6441 +vn 0.0555 0.8939 0.4447 +vn 0.0111 0.7605 0.6492 +vn 0.0254 0.6994 0.7142 +vn 0.1073 0.6893 0.7165 +vn 0.4601 0.5596 0.6893 +vn 0.5133 0.5298 0.6751 +vn 0.4573 0.5953 0.6607 +vn 0.3734 0.8490 0.3740 +vn 0.0202 0.8702 0.4922 +vn 0.1503 0.6649 0.7316 +vn 0.3917 0.6608 0.6403 +vn -0.0070 0.8341 0.5516 +vn 0.2603 0.6527 0.7115 +vn 0.3959 0.7401 0.5436 +vn -0.0171 0.7889 0.6143 +vn 0.3494 0.6218 0.7010 +vn 0.3616 0.8217 0.4405 +vn 0.1615 0.4761 0.8644 +vn 0.1707 0.5824 0.7947 +vn 0.1212 0.5998 0.7909 +vn 0.1219 0.4776 0.8701 +vn 0.1457 0.4496 0.8813 +vn 0.1285 0.4561 0.8806 +vn 0.1555 0.4370 0.8859 +vn 0.0582 0.4282 0.9018 +vn 0.1205 0.2850 0.9509 +vn 0.0771 0.2728 0.9590 +vn 0.2140 0.4688 0.8570 +vn 0.2436 0.5601 0.7918 +vn 0.1592 0.4441 0.8817 +vn 0.1861 0.4339 0.8815 +vn 0.1809 0.2747 0.9444 +vn 0.3229 0.4489 0.8332 +vn 0.3523 0.5175 0.7798 +vn 0.2328 0.4341 0.8703 +vn 0.2057 0.4293 0.8794 +vn 0.1932 0.2910 0.9370 +vn 0.3834 0.4475 0.8079 +vn 0.4288 0.4846 0.7624 +vn 0.2967 0.4288 0.8533 +vn 0.2820 0.3855 0.8786 +vn 0.2804 0.2120 0.9362 +vn 0.0129 0.6045 0.7965 +vn -0.0243 0.2787 0.9601 +vn 0.0446 0.1565 0.9867 +vn -0.0145 0.1423 0.9897 +vn 0.1838 0.2043 0.9615 +vn -0.6597 0.3698 -0.6542 +vn 0.3357 0.2647 0.9040 +vn 0.4809 0.4711 0.7394 +vn 0.0239 0.4961 0.8679 +vn -0.0362 0.1719 0.9844 +vn 0.3390 0.3767 0.8621 +vn 0.0422 0.4551 0.8894 +vn 0.0666 0.1993 0.9777 +vn 0.3387 0.4328 0.8355 +vn -0.0668 0.4083 0.9104 +vn 0.2261 0.1635 0.9603 +vn 0.4127 0.4528 0.7904 +vn -0.3135 0.9257 -0.2118 +vn -0.3490 0.8763 -0.3320 +vn -0.3822 0.7871 -0.4841 +vn -0.3874 0.8615 -0.3282 +vn -0.3213 0.9443 -0.0708 +vn -0.3597 0.9161 -0.1772 +vn -0.2811 0.9592 -0.0312 +vn -0.3145 0.9443 -0.0965 +vn -0.2513 0.9675 0.0301 +vn -0.3039 0.9525 -0.0185 +vn -0.2741 0.9495 -0.1528 +vn -0.2925 0.9356 -0.1979 +vn -0.2779 0.9581 -0.0696 +vn -0.2679 0.9626 0.0407 +vn -0.2062 0.9744 0.0890 +vn -0.2192 0.9692 -0.1124 +vn -0.2455 0.9603 -0.1327 +vn -0.2103 0.9762 -0.0524 +vn -0.2277 0.9670 0.1147 +vn -0.1841 0.9712 0.1511 +vn -0.1747 0.9823 -0.0672 +vn -0.1590 0.9820 -0.1017 +vn -0.1448 0.9892 -0.0237 +vn -0.1235 0.9865 0.1073 +vn -0.1156 0.9780 0.1737 +vn -0.4130 0.7461 -0.5223 +vn -0.4021 0.6673 -0.6270 +vn -0.4051 0.7413 -0.5351 +vn -0.3864 0.9223 0.0115 +vn -0.4752 0.8754 0.0880 +vn -0.3288 0.9429 0.0532 +vn -0.1139 0.9866 0.1171 +vn -0.1566 0.9837 -0.0879 +vn -0.4132 0.8371 -0.3586 +vn -0.2111 0.9739 0.0832 +vn -0.2461 0.9601 -0.1329 +vn -0.3664 0.9021 -0.2280 +vn -0.1989 0.9713 0.1303 +vn -0.3122 0.9235 -0.2230 +vn -0.3403 0.9352 -0.0983 +vn -0.1701 0.9796 0.1068 +vn -0.3607 0.8670 -0.3437 +vn -0.2156 0.9660 0.1425 +vn -0.1969 0.9752 0.1009 +vn -0.3740 0.9237 0.0832 +vn -0.3336 0.9390 0.0837 +vn -0.2226 0.9501 0.2185 +vn -0.3216 0.9195 0.2262 +vn -0.2742 0.9153 0.2950 +vn -0.3417 0.8703 0.3547 +vn -0.3379 0.8912 0.3028 +vn -0.3657 0.8680 0.3359 +vn -0.1974 0.9695 0.1453 +vn -0.2011 0.9728 0.1151 +vn -0.2116 0.9623 0.1707 +vn -0.2770 0.9330 0.2296 +vn -0.2952 0.9127 0.2827 +vn -0.1957 0.9687 0.1529 +vn -0.1851 0.9794 0.0812 +vn -0.1577 0.9761 0.1493 +vn -0.1705 0.9650 0.1990 +vn -0.1768 0.9317 0.3174 +vn -0.0672 0.9837 0.1666 +vn -0.1005 0.9893 0.1060 +vn -0.0775 0.9726 0.2193 +vn -0.0089 0.9756 0.2193 +vn 0.0091 0.9522 0.3053 +vn -0.4336 0.9010 0.0119 +vn -0.3630 0.8654 0.3453 +vn -0.3576 0.8743 0.3282 +vn -0.3747 0.8598 0.3468 +vn -0.0285 0.9235 0.3826 +vn -0.3702 0.9288 0.0193 +vn -0.3487 0.8721 0.3434 +vn -0.3819 0.8980 0.2185 +vn -0.2565 0.9058 0.3372 +vn -0.3586 0.8674 0.3451 +vn -0.1500 0.9131 0.3791 +vn -0.3065 0.8280 0.4695 +vn -0.3410 0.8338 0.4341 +vn -0.3094 0.8619 0.4017 +vn -0.2824 0.8313 0.4787 +vn -0.3255 0.7569 0.5666 +vn -0.3285 0.7374 0.5902 +vn -0.3473 0.6851 0.6404 +vn -0.3520 0.6801 0.6431 +vn -0.3553 0.6630 0.6590 +vn -0.3413 0.6752 0.6539 +vn -0.2808 0.8250 0.4905 +vn -0.2876 0.8512 0.4391 +vn -0.2387 0.7874 0.5683 +vn -0.2455 0.7310 0.6367 +vn -0.3136 0.6785 0.6643 +vn -0.1530 0.8450 0.5124 +vn -0.1463 0.8832 0.4456 +vn -0.1598 0.7993 0.5793 +vn -0.2139 0.7504 0.6254 +vn -0.2533 0.7209 0.6451 +vn -0.0368 0.8638 0.5025 +vn -0.0332 0.8905 0.4537 +vn -0.0836 0.8206 0.5654 +vn -0.1159 0.7831 0.6110 +vn -0.1573 0.7462 0.6469 +vn -0.2708 0.8902 0.3664 +vn -0.3434 0.6692 0.6590 +vn -0.4030 0.5739 0.7129 +vn -0.3814 0.5901 0.7116 +vn -0.1428 0.6894 0.7102 +vn -0.2548 0.8381 0.4824 +vn -0.3403 0.6195 0.7074 +vn -0.2997 0.7387 0.6038 +vn -0.3258 0.6300 0.7050 +vn -0.3162 0.6913 0.6497 +vn -0.2776 0.6628 0.6955 +vn -0.3799 0.4263 0.8209 +vn -0.3501 0.5375 0.7672 +vn -0.3941 0.5014 0.7703 +vn -0.4105 0.4217 0.8085 +vn -0.3142 0.3980 0.8619 +vn -0.3706 0.3728 0.8506 +vn -0.2989 0.3049 0.9043 +vn -0.3770 0.2619 0.8884 +vn -0.2270 0.2523 0.9407 +vn -0.1881 0.3233 0.9274 +vn -0.3132 0.4559 0.8331 +vn -0.3493 0.5434 0.7634 +vn -0.2698 0.3881 0.8812 +vn -0.2174 0.3598 0.9073 +vn -0.2376 0.2303 0.9437 +vn -0.2414 0.4675 0.8504 +vn -0.2934 0.5630 0.7726 +vn -0.2278 0.3863 0.8938 +vn -0.1803 0.3748 0.9094 +vn -0.2065 0.2364 0.9495 +vn -0.0912 0.4956 0.8637 +vn -0.1210 0.6011 0.7899 +vn -0.1059 0.4172 0.9026 +vn -0.1264 0.3917 0.9114 +vn -0.1348 0.2558 0.9573 +vn -0.4121 0.4923 0.7667 +vn -0.0790 0.5746 0.8146 +vn 0.0004 0.4582 0.8889 +vn -0.2444 0.1604 0.9563 +vn 0.0102 0.1963 0.9805 +vn -0.4008 0.4388 0.8043 +vn -0.2515 0.1700 0.9528 +vn -0.3908 0.3894 0.8340 +vn -0.1011 0.2680 0.9581 +vn -0.3579 0.3111 0.8804 +vn -0.0448 0.2426 0.9691 +vn -0.0837 -0.9946 0.0608 +vn -0.2329 -0.9671 0.1018 +vn -0.2537 -0.9655 0.0580 +vn -0.1257 -0.9891 0.0769 +vn -0.2696 -0.9629 0.0128 +vn -0.1390 -0.9902 -0.0131 +vn -0.2746 -0.9570 -0.0936 +vn -0.1613 -0.9761 -0.1454 +vn -0.2344 -0.9595 -0.1560 +vn -0.1552 -0.9694 -0.1900 +vn -0.3283 -0.9369 0.1197 +vn -0.3165 -0.9461 0.0694 +vn -0.3399 -0.9399 0.0307 +vn -0.3464 -0.9371 -0.0433 +vn -0.2946 -0.9529 -0.0722 +vn -0.4182 -0.8566 0.3022 +vn -0.3861 -0.9138 0.1262 +vn -0.3798 -0.9248 0.0232 +vn -0.3312 -0.9429 -0.0344 +vn -0.2947 -0.9552 0.0293 +vn -0.4714 -0.7692 0.4315 +vn -0.4461 -0.8711 0.2056 +vn -0.3998 -0.9068 0.1337 +vn -0.3059 -0.9494 0.0707 +vn -0.2498 -0.9678 0.0308 +vn 0.0549 -0.9972 0.0505 +vn -0.0902 -0.9917 0.0919 +vn 0.0458 -0.9957 0.0811 +vn -0.1510 -0.9809 -0.1224 +vn -0.0336 -0.9920 -0.1213 +vn -0.0261 -0.9810 -0.1923 +vn -0.2413 -0.9704 0.0092 +vn -0.2510 -0.9665 0.0532 +vn -0.2573 -0.9631 0.0794 +vn -0.4715 -0.6884 0.5512 +vn -0.4761 -0.6555 0.5863 +vn -0.4891 -0.7156 0.4987 +vn 0.0375 -0.9959 0.0818 +vn -0.2063 -0.9743 -0.0902 +vn -0.3067 -0.9373 0.1655 +vn -0.4534 -0.7729 0.4438 +vn 0.0408 -0.9991 -0.0112 +vn -0.2120 -0.9768 -0.0313 +vn -0.3709 -0.8981 0.2364 +vn -0.3012 -0.9415 0.1514 +vn 0.0010 -0.9898 -0.1427 +vn -0.2342 -0.9711 0.0470 +vn -0.4583 -0.8316 0.3137 +vn -0.2372 -0.9544 0.1815 +vn -0.1211 -0.9853 -0.1202 +vn -0.1611 -0.9863 -0.0367 +vn -0.1049 -0.9874 -0.1184 +vn -0.0680 -0.9844 -0.1621 +vn -0.1005 -0.9666 -0.2356 +vn -0.0938 -0.9754 -0.1995 +vn -0.1219 -0.9360 -0.3301 +vn -0.1083 -0.9439 -0.3120 +vn -0.1604 -0.9297 -0.3316 +vn -0.1490 -0.9427 -0.2985 +vn -0.1841 -0.9828 -0.0149 +vn -0.2094 -0.9754 -0.0690 +vn -0.1888 -0.9568 -0.2209 +vn -0.2047 -0.9191 -0.3366 +vn -0.2123 -0.9116 -0.3521 +vn -0.2364 -0.9712 -0.0279 +vn -0.2802 -0.9560 -0.0870 +vn -0.3111 -0.9305 -0.1931 +vn -0.3226 -0.8907 -0.3201 +vn -0.3155 -0.8869 -0.3376 +vn -0.2918 -0.9565 -0.0044 +vn -0.3130 -0.9416 -0.1244 +vn -0.3492 -0.9166 -0.1944 +vn -0.3569 -0.8874 -0.2918 +vn -0.3432 -0.8725 -0.3479 +vn -0.0373 -0.9887 -0.1450 +vn -0.1634 -0.9308 -0.3271 +vn -0.0773 -0.9322 -0.3536 +vn -0.0973 -0.9522 -0.2896 +vn -0.3853 -0.8490 -0.3617 +vn -0.3933 -0.8515 -0.3468 +vn -0.2962 -0.8689 -0.3967 +vn -0.2955 -0.9543 -0.0447 +vn -0.0578 -0.9855 -0.1594 +vn -0.1967 -0.9192 -0.3412 +vn -0.3398 -0.8953 -0.2882 +vn -0.0227 -0.9750 -0.2211 +vn -0.2287 -0.9031 -0.3635 +vn -0.3123 -0.9187 -0.2419 +vn -0.0668 -0.9595 -0.2738 +vn -0.3323 -0.8740 -0.3544 +vn -0.3195 -0.9386 -0.1302 +vn -0.1268 -0.8960 -0.4255 +vn -0.2188 -0.8945 -0.3900 +vn -0.1594 -0.8594 -0.4859 +vn -0.0850 -0.8668 -0.4913 +vn -0.1854 -0.8202 -0.5412 +vn -0.1041 -0.8377 -0.5362 +vn -0.1896 -0.7740 -0.6042 +vn -0.0560 -0.7852 -0.6167 +vn -0.1958 -0.7266 -0.6585 +vn -0.0840 -0.7465 -0.6601 +vn -0.2538 -0.8809 -0.3996 +vn -0.2589 -0.8468 -0.4647 +vn -0.2608 -0.7950 -0.5477 +vn -0.2687 -0.7503 -0.6040 +vn -0.2773 -0.7090 -0.6484 +vn -0.3113 -0.8612 -0.4018 +vn -0.2927 -0.8371 -0.4621 +vn -0.2665 -0.7817 -0.5639 +vn -0.3196 -0.7255 -0.6095 +vn -0.3261 -0.6876 -0.6487 +vn -0.3729 -0.8471 -0.3786 +vn -0.3464 -0.8282 -0.4406 +vn -0.3383 -0.7579 -0.5578 +vn -0.3702 -0.6760 -0.6372 +vn -0.4266 -0.6282 -0.6506 +vn -0.0464 -0.8907 -0.4522 +vn -0.1248 -0.6924 -0.7107 +vn -0.0083 -0.6990 -0.7150 +vn -0.0153 -0.7646 -0.6443 +vn -0.5013 -0.5372 -0.6784 +vn -0.4465 -0.5656 -0.6934 +vn -0.4530 -0.5931 -0.6656 +vn -0.3640 -0.8550 -0.3694 +vn -0.0283 -0.8688 -0.4943 +vn -0.1839 -0.6698 -0.7194 +vn -0.4209 -0.6466 -0.6362 +vn -0.0035 -0.8344 -0.5511 +vn -0.2672 -0.6575 -0.7045 +vn -0.4004 -0.7369 -0.5447 +vn 0.0141 -0.7912 -0.6114 +vn -0.3349 -0.6260 -0.7042 +vn -0.3455 -0.8285 -0.4406 +vn -0.1312 -0.6022 -0.7875 +vn -0.1812 -0.5891 -0.7875 +vn -0.1594 -0.4817 -0.8617 +vn -0.1306 -0.4774 -0.8689 +vn -0.1348 -0.4496 -0.8830 +vn -0.1095 -0.4496 -0.8865 +vn -0.1333 -0.4368 -0.8896 +vn -0.0421 -0.4293 -0.9022 +vn -0.1225 -0.2885 -0.9496 +vn -0.0491 -0.2824 -0.9580 +vn -0.2597 -0.5776 -0.7739 +vn -0.2234 -0.4704 -0.8537 +vn -0.1778 -0.4437 -0.8784 +vn -0.1706 -0.4296 -0.8867 +vn -0.1798 -0.2720 -0.9454 +vn -0.3646 -0.5308 -0.7651 +vn -0.3403 -0.4476 -0.8270 +vn -0.2624 -0.4283 -0.8647 +vn -0.2329 -0.4148 -0.8796 +vn -0.2107 -0.2750 -0.9381 +vn -0.4375 -0.4847 -0.7574 +vn -0.4049 -0.4464 -0.7980 +vn -0.2953 -0.4238 -0.8563 +vn -0.3262 -0.3717 -0.8691 +vn -0.2707 -0.2312 -0.9345 +vn -0.0017 -0.6070 -0.7947 +vn 0.0463 -0.1437 -0.9885 +vn -0.0283 -0.1598 -0.9867 +vn 0.0565 -0.2840 -0.9572 +vn 0.3552 -0.6479 -0.6739 +vn -0.1427 -0.2337 -0.9618 +vn -0.3037 -0.2999 -0.9043 +vn -0.4795 -0.4645 -0.7445 +vn -0.0201 -0.4903 -0.8713 +vn 0.0433 -0.1698 -0.9845 +vn -0.3766 -0.3539 -0.8561 +vn -0.0366 -0.4450 -0.8948 +vn -0.0874 -0.1975 -0.9764 +vn -0.3269 -0.4380 -0.8375 +vn 0.0865 -0.4042 -0.9106 +vn -0.2353 -0.1530 -0.9598 +vn -0.4382 -0.4505 -0.7778 +vn 0.3969 -0.7771 0.4885 +vn 0.3573 -0.8705 0.3384 +vn 0.3242 -0.9223 0.2104 +vn 0.3982 -0.8598 0.3197 +vn 0.3260 -0.9418 0.0823 +vn 0.3567 -0.9151 0.1880 +vn 0.2870 -0.9572 0.0360 +vn 0.3136 -0.9442 0.1009 +vn 0.2471 -0.9685 -0.0293 +vn 0.3100 -0.9505 0.0230 +vn 0.2943 -0.9352 0.1969 +vn 0.2714 -0.9514 0.1453 +vn 0.2741 -0.9592 0.0694 +vn 0.2598 -0.9651 -0.0320 +vn 0.2072 -0.9738 -0.0938 +vn 0.2498 -0.9599 0.1275 +vn 0.2226 -0.9693 0.1040 +vn 0.2140 -0.9758 0.0451 +vn 0.2227 -0.9684 -0.1121 +vn 0.1806 -0.9724 -0.1475 +vn 0.1506 -0.9841 0.0941 +vn 0.1728 -0.9830 0.0615 +vn 0.1448 -0.9893 0.0184 +vn 0.1274 -0.9857 -0.1102 +vn 0.1195 -0.9780 -0.1708 +vn 0.4070 -0.6614 0.6300 +vn 0.4234 -0.7269 0.5407 +vn 0.4106 -0.7469 0.5230 +vn 0.3428 -0.9379 -0.0539 +vn 0.4792 -0.8742 -0.0778 +vn 0.3996 -0.9167 -0.0049 +vn 0.1138 -0.9868 -0.1153 +vn 0.1539 -0.9851 0.0768 +vn 0.4094 -0.8379 0.3609 +vn 0.2082 -0.9750 -0.0774 +vn 0.2513 -0.9591 0.1302 +vn 0.3558 -0.9067 0.2266 +vn 0.1921 -0.9735 -0.1245 +vn 0.3228 -0.9169 0.2345 +vn 0.3505 -0.9309 0.1033 +vn 0.1699 -0.9800 -0.1037 +vn 0.3594 -0.8634 0.3541 +vn 0.3807 -0.9214 -0.0785 +vn 0.2054 -0.9733 -0.1025 +vn 0.2205 -0.9634 -0.1526 +vn 0.3382 -0.9367 -0.0907 +vn 0.2244 -0.9482 -0.2251 +vn 0.3204 -0.9193 -0.2287 +vn 0.2756 -0.9162 -0.2910 +vn 0.3351 -0.8761 -0.3468 +vn 0.3377 -0.8913 -0.3028 +vn 0.3680 -0.8668 -0.3364 +vn 0.1942 -0.9744 -0.1135 +vn 0.1952 -0.9690 -0.1517 +vn 0.2169 -0.9597 -0.1789 +vn 0.2750 -0.9339 -0.2286 +vn 0.2903 -0.9149 -0.2805 +vn 0.1828 -0.9797 -0.0821 +vn 0.1890 -0.9700 -0.1529 +vn 0.1573 -0.9762 -0.1490 +vn 0.1712 -0.9642 -0.2027 +vn 0.1747 -0.9321 -0.3173 +vn 0.0972 -0.9895 -0.1072 +vn 0.0676 -0.9833 -0.1691 +vn 0.0759 -0.9733 -0.2167 +vn 0.0071 -0.9752 -0.2212 +vn -0.0063 -0.9533 -0.3020 +vn 0.4366 -0.8996 -0.0097 +vn 0.3742 -0.8602 -0.3465 +vn 0.3558 -0.8778 -0.3208 +vn 0.3752 -0.8555 -0.3569 +vn 0.0356 -0.9231 -0.3828 +vn 0.3723 -0.9278 -0.0257 +vn 0.3496 -0.8710 -0.3451 +vn 0.3682 -0.9042 -0.2166 +vn 0.2596 -0.9044 -0.3385 +vn 0.3473 -0.8731 -0.3422 +vn 0.1533 -0.9126 -0.3790 +vn 0.3053 -0.8663 -0.3954 +vn 0.3361 -0.8368 -0.4322 +vn 0.2938 -0.8313 -0.4718 +vn 0.2813 -0.8303 -0.4812 +vn 0.3137 -0.7601 -0.5691 +vn 0.3122 -0.7414 -0.5940 +vn 0.3457 -0.6864 -0.6398 +vn 0.3404 -0.6834 -0.6458 +vn 0.3526 -0.6645 -0.6589 +vn 0.3349 -0.6773 -0.6550 +vn 0.2916 -0.8484 -0.4419 +vn 0.2724 -0.8265 -0.4927 +vn 0.2435 -0.7861 -0.5682 +vn 0.2485 -0.7336 -0.6325 +vn 0.3157 -0.6810 -0.6607 +vn 0.1470 -0.8824 -0.4470 +vn 0.1549 -0.8448 -0.5121 +vn 0.1699 -0.7980 -0.5782 +vn 0.2138 -0.7545 -0.6205 +vn 0.2609 -0.7158 -0.6477 +vn 0.0370 -0.8891 -0.4562 +vn 0.0389 -0.8638 -0.5024 +vn 0.0786 -0.8207 -0.5660 +vn 0.1121 -0.7861 -0.6078 +vn 0.1608 -0.7437 -0.6489 +vn 0.2739 -0.8901 -0.3642 +vn 0.3809 -0.5904 -0.7116 +vn 0.4113 -0.5651 -0.7152 +vn 0.3370 -0.6678 -0.6637 +vn 0.1534 -0.6868 -0.7105 +vn 0.2589 -0.8382 -0.4799 +vn 0.3454 -0.6179 -0.7063 +vn 0.2740 -0.7507 -0.6012 +vn 0.3291 -0.6266 -0.7064 +vn 0.2972 -0.6947 -0.6551 +vn 0.2639 -0.6662 -0.6975 +vn 0.3895 -0.5055 -0.7699 +vn 0.3440 -0.5405 -0.7678 +vn 0.3669 -0.4386 -0.8204 +vn 0.4070 -0.4269 -0.8076 +vn 0.3101 -0.3865 -0.8686 +vn 0.3702 -0.3701 -0.8520 +vn 0.2804 -0.3119 -0.9078 +vn 0.3191 -0.3213 -0.8916 +vn 0.1875 -0.2992 -0.9356 +vn 0.2592 -0.2193 -0.9406 +vn 0.3425 -0.5396 -0.7691 +vn 0.3004 -0.4611 -0.8349 +vn 0.2482 -0.3964 -0.8839 +vn 0.2220 -0.3482 -0.9108 +vn 0.2356 -0.2446 -0.9406 +vn 0.2940 -0.5575 -0.7764 +vn 0.2481 -0.4644 -0.8501 +vn 0.2216 -0.3837 -0.8965 +vn 0.1741 -0.3777 -0.9094 +vn 0.2215 -0.2413 -0.9448 +vn 0.1414 -0.6006 -0.7870 +vn 0.0999 -0.4911 -0.8654 +vn 0.1067 -0.4077 -0.9068 +vn 0.1385 -0.3862 -0.9119 +vn 0.1338 -0.2593 -0.9565 +vn 0.3967 -0.5102 -0.7631 +vn 0.3192 -0.0274 -0.9473 +vn 0.1298 -0.3200 -0.9385 +vn 0.1834 -0.4603 -0.8686 +vn -0.0148 -0.2023 -0.9792 +vn 0.3912 -0.4422 -0.8071 +vn 0.2637 -0.1502 -0.9528 +vn 0.3848 -0.3971 -0.8332 +vn 0.1114 -0.2821 -0.9529 +vn 0.3038 -0.3809 -0.8733 +vn 0.0397 -0.2568 -0.9657 +vn 0.0875 -0.0701 0.9937 +vn 0.0958 -0.0732 0.9927 +vn 0.0899 -0.0737 0.9932 +vn 0.0953 -0.0703 0.9930 +vn -0.8503 0.2887 0.4400 +vn -0.8014 0.3699 0.4700 +vn -0.8013 0.3542 0.4822 +vn -0.8503 0.2841 0.4430 +vn -0.4567 0.7439 0.4879 +vn -0.3727 0.8132 0.4470 +vn -0.3793 0.7982 0.4679 +vn -0.4591 0.7209 0.5191 +vn 0.3409 0.5044 0.7933 +vn 0.3250 0.4812 0.8141 +vn 0.3282 0.5003 0.8012 +vn 0.3418 0.5084 0.7904 +vn -0.7135 0.4441 0.5419 +vn -0.7110 0.4231 0.5617 +vn 0.2275 0.3552 0.9067 +vn 0.2314 0.3970 0.8881 +vn -0.5835 0.5434 0.6036 +vn -0.5871 0.5232 0.6177 +vn 0.0951 0.1953 0.9761 +vn 0.0973 0.2573 0.9614 +vn -0.5303 0.6132 0.5854 +vn -0.5382 0.5922 0.5997 +vn 0.1022 -0.0825 0.9913 +vn 0.0929 -0.0444 0.9947 +vn -0.9185 0.3682 0.1440 +vn -0.9046 0.3479 0.2463 +vn -0.9015 0.3553 0.2472 +vn -0.9226 0.3633 0.1295 +vn -0.8788 0.3382 0.3366 +vn -0.8765 0.3409 0.3398 +vn -0.9569 0.1781 0.2293 +vn -0.9564 0.1840 0.2266 +vn -0.9372 0.2698 0.2212 +vn -0.9398 0.2579 0.2240 +vn -0.9033 0.3649 0.2257 +vn -0.9069 0.3595 0.2199 +vn -0.8287 0.5536 0.0825 +vn -0.8866 0.4566 0.0735 +vn -0.8826 0.4638 0.0771 +vn -0.8250 0.5583 0.0873 +vn -0.9679 0.2445 -0.0583 +vn -0.9692 0.2398 -0.0568 +vn -0.9408 0.3375 0.0312 +vn -0.9410 0.3370 0.0303 +vn -0.8919 0.4416 0.0977 +vn -0.8910 0.4433 0.0975 +vn -0.9381 0.3452 -0.0266 +vn -0.9349 0.3541 -0.0225 +vn -0.1687 0.9607 -0.2205 +vn -0.2248 0.9460 -0.2334 +vn -0.2127 0.9508 -0.2253 +vn -0.1742 0.9592 -0.2227 +vn -0.6250 0.7802 -0.0238 +vn -0.6110 0.7916 0.0001 +vn -0.6109 0.7917 -0.0004 +vn -0.6714 0.7390 -0.0557 +vn -0.6502 0.7460 -0.1437 +vn -0.6881 0.7014 -0.1861 +vn -0.7564 0.6435 0.1174 +vn -0.7552 0.6442 0.1211 +vn -0.3206 0.9106 -0.2610 +vn -0.2724 0.9332 -0.2342 +vn -0.6739 0.7387 -0.0111 +vn -0.6765 0.7365 0.0041 +vn -0.4765 0.8300 -0.2899 +vn -0.4434 0.8543 -0.2715 +vn -0.7770 0.6169 -0.1256 +vn -0.7769 0.6167 -0.1265 +vn -0.5610 0.7881 -0.2535 +vn -0.5687 0.7803 -0.2601 +vn -0.7092 0.7033 0.0489 +vn -0.7250 0.6871 0.0472 +vn 0.3530 0.7147 0.6038 +vn 0.4442 0.5943 0.6705 +vn 0.4290 0.6158 0.6608 +vn 0.3367 0.7339 0.5899 +vn -0.3146 0.4101 0.8561 +vn -0.4627 0.4472 0.7654 +vn -0.4424 0.4331 0.7853 +vn -0.2933 0.3896 0.8730 +vn 0.7951 0.4014 0.4547 +vn 0.8244 0.4170 0.3828 +vn 0.8229 0.4263 0.3758 +vn 0.8034 0.3956 0.4450 +vn 0.0331 -0.0703 0.9970 +vn 0.0646 -0.0863 0.9942 +vn 0.6153 0.4469 0.6494 +vn 0.5977 0.4700 0.6495 +vn 0.0001 0.0945 0.9955 +vn 0.0038 0.0540 0.9985 +vn 0.7654 0.3282 0.5536 +vn 0.7555 0.3371 0.5617 +vn -0.0298 0.1965 0.9801 +vn 0.0002 0.1711 0.9852 +vn 0.7972 0.3398 0.4990 +vn 0.7994 0.3349 0.4987 +vn -0.1720 0.3169 0.9327 +vn -0.1372 0.2911 0.9468 +vn 0.9070 0.2895 0.3059 +vn 0.9018 0.3010 0.3101 +vn 0.9691 0.2468 0.0052 +vn 0.9589 0.2834 -0.0132 +vn 0.9619 0.2727 -0.0191 +vn 0.9660 0.2585 0.0087 +vn 0.9060 0.2815 0.3161 +vn 0.9067 0.2800 0.3156 +vn 0.9076 0.3328 0.2562 +vn 0.9114 0.3279 0.2486 +vn 0.8975 0.3977 0.1908 +vn 0.8939 0.4037 0.1948 +vn 0.8840 0.4481 0.1332 +vn 0.8862 0.4453 0.1278 +vn 0.8511 0.5110 0.1203 +vn 0.8529 0.5138 0.0930 +vn 0.8529 0.5137 0.0928 +vn 0.8507 0.5113 0.1219 +vn 0.9322 0.3530 0.0797 +vn 0.9299 0.3586 0.0820 +vn 0.9342 0.3557 0.0273 +vn 0.9365 0.3499 0.0222 +vn 0.8539 0.4961 0.1573 +vn 0.8578 0.4915 0.1504 +vn 0.8330 0.5456 0.0923 +vn 0.8340 0.5452 0.0853 +vn 0.6558 0.7452 -0.1207 +vn 0.4823 0.7121 -0.5102 +vn 0.3936 0.7092 -0.5849 +vn 0.6534 0.7520 -0.0871 +vn 0.3870 0.8742 -0.2933 +vn 0.2989 0.8643 -0.4044 +vn -0.1019 0.9681 -0.2288 +vn -0.1454 0.9551 -0.2580 +vn 0.7780 0.6153 0.1270 +vn 0.7807 0.6139 0.1165 +vn 0.2897 0.9129 -0.2876 +vn 0.2691 0.9100 -0.3153 +vn 0.6964 0.7057 0.1302 +vn 0.6921 0.7113 0.1228 +vn 0.2234 0.9381 -0.2647 +vn 0.2034 0.9363 -0.2862 +vn 0.6460 0.7632 0.0104 +vn 0.6420 0.7665 0.0170 +vn 0.0297 0.9612 -0.2743 +vn -0.0214 0.9526 -0.3033 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_00 +s 1 +f 1/1/1 2/2/2 3/3/3 4/4/4 +f 5/5/5 1/1/1 4/4/4 6/6/6 +f 7/7/7 5/5/5 6/6/6 8/8/8 +f 9/9/9 7/7/7 8/8/8 10/10/10 +f 11/11/11 12/12/12 2/2/2 1/1/1 +f 13/13/13 11/11/11 1/1/1 5/5/5 +f 14/14/14 13/13/13 5/5/5 7/7/7 +f 15/15/15 14/14/14 7/7/7 9/9/9 +f 16/16/16 17/17/17 12/12/12 11/11/11 +f 18/18/18 16/16/16 11/11/11 13/13/13 +f 19/19/19 18/18/18 13/13/13 14/14/14 +f 20/20/20 19/19/19 14/14/14 15/15/15 +f 21/21/21 22/22/22 17/17/17 16/16/16 +f 23/23/23 21/21/21 16/16/16 18/18/18 +f 24/24/24 23/23/23 18/18/18 19/19/19 +f 25/25/25 24/24/24 19/19/19 20/20/20 +f 3/3/3 26/26/26 27/27/27 28/28/28 +f 29/29/29 30/30/30 31/31/31 10/10/10 +f 25/25/25 32/32/32 33/33/33 34/34/34 +f 35/35/35 36/36/36 37/37/37 22/22/22 +f 4/4/4 3/3/3 28/28/28 38/38/38 +f 10/10/10 31/31/31 39/39/39 9/9/9 +f 24/24/24 25/25/25 34/34/34 40/40/40 +f 22/22/22 37/37/37 41/41/41 17/17/17 +f 6/6/6 4/4/4 38/38/38 42/42/42 +f 9/9/9 39/39/39 43/43/43 15/15/15 +f 23/23/23 24/24/24 40/40/40 44/44/44 +f 17/17/17 41/41/41 45/45/45 12/12/12 +f 8/8/8 6/6/6 42/42/42 46/46/46 +f 15/15/15 43/43/43 47/47/47 20/20/20 +f 21/21/21 23/23/23 44/44/44 48/48/48 +f 12/12/12 45/45/45 49/49/49 2/2/2 +f 10/10/10 8/8/8 46/46/46 29/29/29 +f 20/20/20 47/47/47 32/32/32 25/25/25 +f 22/22/22 21/21/21 48/48/48 35/35/35 +f 2/2/2 49/49/49 26/26/26 3/3/3 +f 50/50/50 51/51/51 52/52/52 53/53/53 +f 54/54/54 50/50/50 53/53/53 55/55/55 +f 56/56/56 54/54/54 55/55/55 57/57/57 +f 58/58/58 56/56/56 57/57/57 59/59/59 +f 60/60/60 61/61/61 51/51/51 50/50/50 +f 62/62/62 60/60/60 50/50/50 54/54/54 +f 63/63/63 62/62/62 54/54/54 56/56/56 +f 64/64/64 63/63/63 56/56/56 58/58/58 +f 65/65/65 66/66/66 61/61/61 60/60/60 +f 67/67/67 65/65/65 60/60/60 62/62/62 +f 68/68/68 67/67/67 62/62/62 63/63/63 +f 69/69/69 68/68/68 63/63/63 64/64/64 +f 70/70/70 71/71/71 66/66/66 65/65/65 +f 72/72/72 70/70/70 65/65/65 67/67/67 +f 73/73/73 72/72/72 67/67/67 68/68/68 +f 74/74/74 73/73/73 68/68/68 69/69/69 +f 52/52/52 31/31/31 30/30/30 75/75/75 +f 76/76/76 77/77/77 78/78/78 59/59/59 +f 74/74/74 79/79/79 80/80/80 81/81/81 +f 82/82/82 33/33/33 32/32/32 71/71/71 +f 53/53/53 52/52/52 75/75/75 83/83/83 +f 59/59/59 78/78/78 84/84/84 58/58/58 +f 73/73/73 74/74/74 81/81/81 85/85/85 +f 71/71/71 32/32/32 47/47/47 66/66/66 +f 55/55/55 53/53/53 83/83/83 86/86/86 +f 58/58/58 84/84/84 87/87/87 64/64/64 +f 72/72/72 73/73/73 85/85/85 88/88/88 +f 66/66/66 47/47/47 43/43/43 61/61/61 +f 57/57/57 55/55/55 86/86/86 89/89/89 +f 64/64/64 87/87/87 90/90/90 69/69/69 +f 70/70/70 72/72/72 88/88/88 91/91/91 +f 61/61/61 43/43/43 39/39/39 51/51/51 +f 59/59/59 57/57/57 89/89/89 76/76/76 +f 69/69/69 90/90/90 79/79/79 74/74/74 +f 71/71/71 70/70/70 91/91/91 82/82/82 +f 51/51/51 39/39/39 31/31/31 52/52/52 +f 92/92/92 93/93/93 94/94/94 95/95/95 +f 96/96/96 92/92/92 95/95/95 97/97/97 +f 98/98/98 96/96/96 97/97/97 99/99/99 +f 100/100/100 98/98/98 99/99/99 101/101/101 +f 102/102/102 103/103/103 93/93/93 92/92/92 +f 104/104/104 102/102/102 92/92/92 96/96/96 +f 105/105/105 104/104/104 96/96/96 98/98/98 +f 106/106/106 105/105/105 98/98/98 100/100/100 +f 107/107/107 108/108/108 103/103/103 102/102/102 +f 109/109/109 107/107/107 102/102/102 104/104/104 +f 110/110/110 109/109/109 104/104/104 105/105/105 +f 111/111/111 110/110/110 105/105/105 106/106/106 +f 112/112/112 113/113/113 108/108/108 107/107/107 +f 114/114/114 112/112/112 107/107/107 109/109/109 +f 115/115/115 114/114/114 109/109/109 110/110/110 +f 116/116/116 115/115/115 110/110/110 111/111/111 +f 94/94/94 78/78/78 77/77/77 117/117/117 +f 118/118/118 119/119/119 120/120/120 101/101/101 +f 116/116/116 121/121/121 122/122/122 123/123/123 +f 124/124/124 80/80/80 79/79/79 113/113/113 +f 95/95/95 94/94/94 117/117/117 125/125/125 +f 101/101/101 120/120/120 126/126/126 100/100/100 +f 115/115/115 116/116/116 123/123/123 127/127/127 +f 113/113/113 79/79/79 90/90/90 108/108/108 +f 97/97/97 95/95/95 125/125/125 128/128/128 +f 100/100/100 126/126/126 129/129/129 106/106/106 +f 114/114/114 115/115/115 127/127/127 130/130/130 +f 108/108/108 90/90/90 87/87/87 103/103/103 +f 99/99/99 97/97/97 128/128/128 131/131/131 +f 106/106/106 129/129/129 132/132/132 111/111/111 +f 112/112/112 114/114/114 130/130/130 133/133/133 +f 103/103/103 87/87/87 84/84/84 93/93/93 +f 101/101/101 99/99/99 131/131/131 118/118/118 +f 111/111/111 132/132/132 121/121/121 116/116/116 +f 113/113/113 112/112/112 133/133/133 124/124/124 +f 93/93/93 84/84/84 78/78/78 94/94/94 +f 134/134/134 135/135/135 136/136/136 137/137/137 +f 138/138/138 134/134/134 137/137/137 139/139/139 +f 140/140/140 138/138/138 139/139/139 141/141/141 +f 142/142/142 140/140/140 141/141/141 143/143/143 +f 144/144/144 145/145/145 135/135/135 134/134/134 +f 146/146/146 144/144/144 134/134/134 138/138/138 +f 147/147/147 146/146/146 138/138/138 140/140/140 +f 148/148/148 147/147/147 140/140/140 142/142/142 +f 149/149/149 150/150/150 145/145/145 144/144/144 +f 151/151/151 149/149/149 144/144/144 146/146/146 +f 152/152/152 151/151/151 146/146/146 147/147/147 +f 153/153/153 152/152/152 147/147/147 148/148/148 +f 154/154/154 155/155/155 150/150/150 149/149/149 +f 156/156/156 154/154/154 149/149/149 151/151/151 +f 157/157/157 156/156/156 151/151/151 152/152/152 +f 158/158/158 157/157/157 152/152/152 153/153/153 +f 136/136/136 120/120/120 119/119/119 159/159/159 +f 160/160/160 161/161/161 162/162/162 143/143/143 +f 158/158/158 163/163/163 164/164/164 165/165/165 +f 166/166/166 122/122/122 121/121/121 155/155/155 +f 137/137/137 136/136/136 159/159/159 167/167/167 +f 143/143/143 162/162/162 168/168/168 142/142/142 +f 157/157/157 158/158/158 165/165/165 169/169/169 +f 155/155/155 121/121/121 132/132/132 150/150/150 +f 139/139/139 137/137/137 167/167/167 170/170/170 +f 142/142/142 168/168/168 171/171/171 148/148/148 +f 156/156/156 157/157/157 169/169/169 172/172/172 +f 150/150/150 132/132/132 129/129/129 145/145/145 +f 141/141/141 139/139/139 170/170/170 173/173/173 +f 148/148/148 171/171/171 174/174/174 153/153/153 +f 154/154/154 156/156/156 172/172/172 175/175/175 +f 145/145/145 129/129/129 126/126/126 135/135/135 +f 143/143/143 141/141/141 173/173/173 160/160/160 +f 153/153/153 174/174/174 163/163/163 158/158/158 +f 155/155/155 154/154/154 175/175/175 166/166/166 +f 135/135/135 126/126/126 120/120/120 136/136/136 +f 176/176/176 177/177/177 178/178/178 179/179/179 +f 180/180/180 176/176/176 179/179/179 181/181/181 +f 182/182/182 180/180/180 181/181/181 183/183/183 +f 184/184/184 182/182/182 183/183/183 185/185/185 +f 186/186/186 187/187/187 177/177/177 176/176/176 +f 188/188/188 186/186/186 176/176/176 180/180/180 +f 189/189/189 188/188/188 180/180/180 182/182/182 +f 190/190/190 189/189/189 182/182/182 184/184/184 +f 191/191/191 192/192/192 187/187/187 186/186/186 +f 193/193/193 191/191/191 186/186/186 188/188/188 +f 194/194/194 193/193/193 188/188/188 189/189/189 +f 195/195/195 194/194/194 189/189/189 190/190/190 +f 196/196/196 197/197/197 192/192/192 191/191/191 +f 198/198/198 196/196/196 191/191/191 193/193/193 +f 199/199/199 198/198/198 193/193/193 194/194/194 +f 200/200/200 199/199/199 194/194/194 195/195/195 +f 178/178/178 201/201/201 202/202/202 203/203/203 +f 204/204/204 205/205/205 206/206/206 185/185/185 +f 200/200/200 207/207/207 30/30/30 29/29/29 +f 28/28/28 27/27/27 208/208/208 197/197/197 +f 179/179/179 178/178/178 203/203/203 209/209/209 +f 185/185/185 206/206/206 210/210/210 184/184/184 +f 199/199/199 200/200/200 29/29/29 46/46/46 +f 197/197/197 208/208/208 211/211/211 192/192/192 +f 181/181/181 179/179/179 209/209/209 212/212/212 +f 184/184/184 210/210/210 213/213/213 190/190/190 +f 198/198/198 199/199/199 46/46/46 42/42/42 +f 192/192/192 211/211/211 214/214/214 187/187/187 +f 183/183/183 181/181/181 212/212/212 215/215/215 +f 190/190/190 213/213/213 216/216/216 195/195/195 +f 196/196/196 198/198/198 42/42/42 38/38/38 +f 187/187/187 214/214/214 217/217/217 177/177/177 +f 185/185/185 183/183/183 215/215/215 204/204/204 +f 195/195/195 216/216/216 207/207/207 200/200/200 +f 197/197/197 196/196/196 38/38/38 28/28/28 +f 177/177/177 217/217/217 201/201/201 178/178/178 +f 218/218/218 219/219/219 220/220/220 221/221/221 +f 222/222/222 218/218/218 221/221/221 223/223/223 +f 224/224/224 222/222/222 223/223/223 225/225/225 +f 226/226/226 224/224/224 225/225/225 227/227/227 +f 228/228/228 229/229/229 219/219/219 218/218/218 +f 230/230/230 228/228/228 218/218/218 222/222/222 +f 231/231/231 230/230/230 222/222/222 224/224/224 +f 232/232/232 231/231/231 224/224/224 226/226/226 +f 233/233/233 234/234/234 229/229/229 228/228/228 +f 235/235/235 233/233/233 228/228/228 230/230/230 +f 236/236/236 235/235/235 230/230/230 231/231/231 +f 237/237/237 236/236/236 231/231/231 232/232/232 +f 238/238/238 239/239/239 234/234/234 233/233/233 +f 240/240/240 238/238/238 233/233/233 235/235/235 +f 241/241/241 240/240/240 235/235/235 236/236/236 +f 242/242/242 241/241/241 236/236/236 237/237/237 +f 220/220/220 206/206/206 205/205/205 243/243/243 +f 244/244/244 245/245/245 246/246/246 227/227/227 +f 242/242/242 247/247/247 77/77/77 76/76/76 +f 75/75/75 30/30/30 207/207/207 239/239/239 +f 221/221/221 220/220/220 243/243/243 248/248/248 +f 227/227/227 246/246/246 249/249/249 226/226/226 +f 241/241/241 242/242/242 76/76/76 89/89/89 +f 239/239/239 207/207/207 216/216/216 234/234/234 +f 223/223/223 221/221/221 248/248/248 250/250/250 +f 226/226/226 249/249/249 251/251/251 232/232/232 +f 240/240/240 241/241/241 89/89/89 86/86/86 +f 234/234/234 216/216/216 213/213/213 229/229/229 +f 225/225/225 223/223/223 250/250/250 252/252/252 +f 232/232/232 251/251/251 253/253/253 237/237/237 +f 238/238/238 240/240/240 86/86/86 83/83/83 +f 229/229/229 213/213/213 210/210/210 219/219/219 +f 227/227/227 225/225/225 252/252/252 244/244/244 +f 237/237/237 253/253/253 247/247/247 242/242/242 +f 239/239/239 238/238/238 83/83/83 75/75/75 +f 219/219/219 210/210/210 206/206/206 220/220/220 +f 254/254/254 255/255/255 256/256/256 257/257/257 +f 258/258/258 254/254/254 257/257/257 259/259/259 +f 260/260/260 258/258/258 259/259/259 261/261/261 +f 262/262/262 260/260/260 261/261/261 263/263/263 +f 264/264/264 265/265/265 255/255/255 254/254/254 +f 266/266/266 264/264/264 254/254/254 258/258/258 +f 267/267/267 266/266/266 258/258/258 260/260/260 +f 268/268/268 267/267/267 260/260/260 262/262/262 +f 269/269/269 270/270/270 265/265/265 264/264/264 +f 271/271/271 269/269/269 264/264/264 266/266/266 +f 272/272/272 271/271/271 266/266/266 267/267/267 +f 273/273/273 272/272/272 267/267/267 268/268/268 +f 274/274/274 275/275/275 270/270/270 269/269/269 +f 276/276/276 274/274/274 269/269/269 271/271/271 +f 277/277/277 276/276/276 271/271/271 272/272/272 +f 278/278/278 277/277/277 272/272/272 273/273/273 +f 256/256/256 246/246/246 245/245/245 279/279/279 +f 280/280/280 281/281/281 282/282/282 263/263/263 +f 278/278/278 283/283/283 119/119/119 118/118/118 +f 117/117/117 77/77/77 247/247/247 275/275/275 +f 257/257/257 256/256/256 279/279/279 284/284/284 +f 263/263/263 282/282/282 285/285/285 262/262/262 +f 277/277/277 278/278/278 118/118/118 131/131/131 +f 275/275/275 247/247/247 253/253/253 270/270/270 +f 259/259/259 257/257/257 284/284/284 286/286/286 +f 262/262/262 285/285/285 287/287/287 268/268/268 +f 276/276/276 277/277/277 131/131/131 128/128/128 +f 270/270/270 253/253/253 251/251/251 265/265/265 +f 261/261/261 259/259/259 286/286/286 288/288/288 +f 268/268/268 287/287/287 289/289/289 273/273/273 +f 274/274/274 276/276/276 128/128/128 125/125/125 +f 265/265/265 251/251/251 249/249/249 255/255/255 +f 263/263/263 261/261/261 288/288/288 280/280/280 +f 273/273/273 289/289/289 283/283/283 278/278/278 +f 275/275/275 274/274/274 125/125/125 117/117/117 +f 255/255/255 249/249/249 246/246/246 256/256/256 +f 290/290/290 291/291/291 292/292/292 293/293/293 +f 294/294/294 290/290/290 293/293/293 295/295/295 +f 296/296/296 294/294/294 295/295/295 297/297/297 +f 298/298/298 296/296/296 297/297/297 299/299/299 +f 300/300/300 301/301/301 291/291/291 290/290/290 +f 302/302/302 300/300/300 290/290/290 294/294/294 +f 303/303/303 302/302/302 294/294/294 296/296/296 +f 304/304/304 303/303/303 296/296/296 298/298/298 +f 305/305/305 306/306/306 301/301/301 300/300/300 +f 307/307/307 305/305/305 300/300/300 302/302/302 +f 308/308/308 307/307/307 302/302/302 303/303/303 +f 309/309/309 308/308/308 303/303/303 304/304/304 +f 310/310/310 311/311/311 306/306/306 305/305/305 +f 312/312/312 310/310/310 305/305/305 307/307/307 +f 313/313/313 312/312/312 307/307/307 308/308/308 +f 314/314/314 313/313/313 308/308/308 309/309/309 +f 292/292/292 282/282/282 281/281/281 315/315/315 +f 316/316/316 317/317/317 318/318/318 299/299/299 +f 314/314/314 319/319/319 161/161/161 160/160/160 +f 159/159/159 119/119/119 283/283/283 311/311/311 +f 293/293/293 292/292/292 315/315/315 320/320/320 +f 299/299/299 318/318/318 321/321/321 298/298/298 +f 313/313/313 314/314/314 160/160/160 173/173/173 +f 311/311/311 283/283/283 289/289/289 306/306/306 +f 295/295/295 293/293/293 320/320/320 322/322/322 +f 298/298/298 321/321/321 323/323/323 304/304/304 +f 312/312/312 313/313/313 173/173/173 170/170/170 +f 306/306/306 289/289/289 287/287/287 301/301/301 +f 297/297/297 295/295/295 322/322/322 324/324/324 +f 304/304/304 323/323/323 325/325/325 309/309/309 +f 310/310/310 312/312/312 170/170/170 167/167/167 +f 301/301/301 287/287/287 285/285/285 291/291/291 +f 299/299/299 297/297/297 324/324/324 316/316/316 +f 309/309/309 325/325/325 319/319/319 314/314/314 +f 311/311/311 310/310/310 167/167/167 159/159/159 +f 291/291/291 285/285/285 282/282/282 292/292/292 +f 326/3/326 327/2/327 328/1/328 329/4/329 +f 329/4/329 328/1/328 330/5/330 331/6/331 +f 331/6/331 330/5/330 332/7/332 333/8/333 +f 333/8/333 332/7/332 334/9/334 335/10/335 +f 327/2/327 336/12/336 337/11/337 328/1/328 +f 328/1/328 337/11/337 338/13/338 330/5/330 +f 330/5/330 338/13/338 339/14/339 332/7/332 +f 332/7/332 339/14/339 340/15/340 334/9/334 +f 336/12/336 341/17/341 342/16/342 337/11/337 +f 337/11/337 342/16/342 343/18/343 338/13/338 +f 338/13/338 343/18/343 344/19/344 339/14/339 +f 339/14/339 344/19/344 345/20/345 340/15/340 +f 341/17/341 346/22/346 347/21/347 342/16/342 +f 342/16/342 347/21/347 348/23/348 343/18/343 +f 343/18/343 348/23/348 349/24/349 344/19/344 +f 344/19/344 349/24/349 350/25/350 345/20/345 +f 351/27/351 352/26/352 326/3/326 353/28/353 +f 354/31/354 355/30/355 356/29/356 335/10/335 +f 357/33/357 358/32/358 350/25/350 359/34/359 +f 360/37/360 361/36/361 362/35/362 346/22/346 +f 353/28/353 326/3/326 329/4/329 363/38/363 +f 364/39/364 354/31/354 335/10/335 334/9/334 +f 359/34/359 350/25/350 349/24/349 365/40/365 +f 366/41/366 360/37/360 346/22/346 341/17/341 +f 363/38/363 329/4/329 331/6/331 367/42/367 +f 368/43/368 364/39/364 334/9/334 340/15/340 +f 365/40/365 349/24/349 348/23/348 369/44/369 +f 370/45/370 366/41/366 341/17/341 336/12/336 +f 367/42/367 331/6/331 333/8/333 371/46/371 +f 372/47/372 368/43/368 340/15/340 345/20/345 +f 369/44/369 348/23/348 347/21/347 373/48/373 +f 374/49/374 370/45/370 336/12/336 327/2/327 +f 371/46/371 333/8/333 335/10/335 356/29/356 +f 358/32/358 372/47/372 345/20/345 350/25/350 +f 373/48/373 347/21/347 346/22/346 362/35/362 +f 352/26/352 374/49/374 327/2/327 326/3/326 +f 375/52/375 376/51/376 377/50/377 378/53/378 +f 378/53/378 377/50/377 379/54/379 380/55/380 +f 380/55/380 379/54/379 381/56/381 382/57/382 +f 382/57/382 381/56/381 383/58/383 384/59/384 +f 376/51/376 385/61/385 386/60/386 377/50/377 +f 377/50/377 386/60/386 387/62/387 379/54/379 +f 379/54/379 387/62/387 388/63/388 381/56/381 +f 381/56/381 388/63/388 389/64/389 383/58/383 +f 385/61/385 390/66/390 391/65/391 386/60/386 +f 386/60/386 391/65/391 392/67/392 387/62/387 +f 387/62/387 392/67/392 393/68/393 388/63/388 +f 388/63/388 393/68/393 394/69/394 389/64/389 +f 390/66/390 395/71/395 396/70/396 391/65/391 +f 391/65/391 396/70/396 397/72/397 392/67/392 +f 392/67/392 397/72/397 398/73/398 393/68/393 +f 393/68/393 398/73/398 399/74/399 394/69/394 +f 355/30/355 354/31/354 375/52/375 400/75/400 +f 401/78/401 402/77/402 403/76/403 384/59/384 +f 404/80/404 405/79/405 399/74/399 406/81/406 +f 358/32/358 357/33/357 407/82/407 395/71/395 +f 400/75/400 375/52/375 378/53/378 408/83/408 +f 409/84/409 401/78/401 384/59/384 383/58/383 +f 406/81/406 399/74/399 398/73/398 410/85/410 +f 372/47/372 358/32/358 395/71/395 390/66/390 +f 408/83/408 378/53/378 380/55/380 411/86/411 +f 412/87/412 409/84/409 383/58/383 389/64/389 +f 410/85/410 398/73/398 397/72/397 413/88/413 +f 368/43/368 372/47/372 390/66/390 385/61/385 +f 411/86/411 380/55/380 382/57/382 414/89/414 +f 415/90/415 412/87/412 389/64/389 394/69/394 +f 413/88/413 397/72/397 396/70/396 416/91/416 +f 364/39/364 368/43/368 385/61/385 376/51/376 +f 414/89/414 382/57/382 384/59/384 403/76/403 +f 405/79/405 415/90/415 394/69/394 399/74/399 +f 416/91/416 396/70/396 395/71/395 407/82/407 +f 354/31/354 364/39/364 376/51/376 375/52/375 +f 417/94/417 418/93/418 419/92/419 420/95/420 +f 420/95/420 419/92/419 421/96/421 422/97/422 +f 422/97/422 421/96/421 423/98/423 424/99/424 +f 424/99/424 423/98/423 425/100/425 426/101/426 +f 418/93/418 427/103/427 428/102/428 419/92/419 +f 419/92/419 428/102/428 429/104/429 421/96/421 +f 421/96/421 429/104/429 430/105/430 423/98/423 +f 423/98/423 430/105/430 431/106/431 425/100/425 +f 427/103/427 432/108/432 433/107/433 428/102/428 +f 428/102/428 433/107/433 434/109/434 429/104/429 +f 429/104/429 434/109/434 435/110/435 430/105/430 +f 430/105/430 435/110/435 436/111/436 431/106/431 +f 432/108/432 437/113/437 438/112/438 433/107/433 +f 433/107/433 438/112/438 439/114/439 434/109/434 +f 434/109/434 439/114/439 440/115/440 435/110/435 +f 435/110/435 440/115/440 441/116/441 436/111/436 +f 402/77/402 401/78/401 417/94/417 442/117/442 +f 443/120/443 444/119/444 445/118/445 426/101/426 +f 446/122/446 447/121/447 441/116/441 448/123/448 +f 405/79/405 404/80/404 449/124/449 437/113/437 +f 442/117/442 417/94/417 420/95/420 450/125/450 +f 451/126/451 443/120/443 426/101/426 425/100/425 +f 448/123/448 441/116/441 440/115/440 452/127/452 +f 415/90/415 405/79/405 437/113/437 432/108/432 +f 450/125/450 420/95/420 422/97/422 453/128/453 +f 454/129/454 451/126/451 425/100/425 431/106/431 +f 452/127/452 440/115/440 439/114/439 455/130/455 +f 412/87/412 415/90/415 432/108/432 427/103/427 +f 453/128/453 422/97/422 424/99/424 456/131/456 +f 457/132/457 454/129/454 431/106/431 436/111/436 +f 455/130/455 439/114/439 438/112/438 458/133/458 +f 409/84/409 412/87/412 427/103/427 418/93/418 +f 456/131/456 424/99/424 426/101/426 445/118/445 +f 447/121/447 457/132/457 436/111/436 441/116/441 +f 458/133/458 438/112/438 437/113/437 449/124/449 +f 401/78/401 409/84/409 418/93/418 417/94/417 +f 459/136/459 460/135/460 461/134/461 462/137/462 +f 462/137/462 461/134/461 463/138/463 464/139/464 +f 464/139/464 463/138/463 465/140/465 466/141/466 +f 466/141/466 465/140/465 467/142/467 468/143/468 +f 460/135/460 469/145/469 470/144/470 461/134/461 +f 461/134/461 470/144/470 471/146/471 463/138/463 +f 463/138/463 471/146/471 472/147/472 465/140/465 +f 465/140/465 472/147/472 473/148/473 467/142/467 +f 469/145/469 474/150/474 475/149/475 470/144/470 +f 470/144/470 475/149/475 476/151/476 471/146/471 +f 471/146/471 476/151/476 477/152/477 472/147/472 +f 472/147/472 477/152/477 478/153/478 473/148/473 +f 474/150/474 479/155/479 480/154/480 475/149/475 +f 475/149/475 480/154/480 481/156/481 476/151/476 +f 476/151/476 481/156/481 482/157/482 477/152/477 +f 477/152/477 482/157/482 483/158/483 478/153/478 +f 444/119/444 443/120/443 459/136/459 484/159/484 +f 485/162/485 486/161/486 487/160/487 468/143/468 +f 488/164/488 489/163/489 483/158/483 490/165/490 +f 447/121/447 446/122/446 491/166/491 479/155/479 +f 484/159/484 459/136/459 462/137/462 492/167/492 +f 493/168/493 485/162/485 468/143/468 467/142/467 +f 490/165/490 483/158/483 482/157/482 494/169/494 +f 457/132/457 447/121/447 479/155/479 474/150/474 +f 492/167/492 462/137/462 464/139/464 495/170/495 +f 496/171/496 493/168/493 467/142/467 473/148/473 +f 494/169/494 482/157/482 481/156/481 497/172/497 +f 454/129/454 457/132/457 474/150/474 469/145/469 +f 495/170/495 464/139/464 466/141/466 498/173/498 +f 499/174/499 496/171/496 473/148/473 478/153/478 +f 497/172/497 481/156/481 480/154/480 500/175/500 +f 451/126/451 454/129/454 469/145/469 460/135/460 +f 498/173/498 466/141/466 468/143/468 487/160/487 +f 489/163/489 499/174/499 478/153/478 483/158/483 +f 500/175/500 480/154/480 479/155/479 491/166/491 +f 443/120/443 451/126/451 460/135/460 459/136/459 +f 501/178/501 502/177/502 503/176/503 504/179/504 +f 504/179/504 503/176/503 505/180/505 506/181/506 +f 506/181/506 505/180/505 507/182/507 508/183/508 +f 508/183/508 507/182/507 509/184/509 510/185/510 +f 502/177/502 511/187/511 512/186/512 503/176/503 +f 503/176/503 512/186/512 513/188/513 505/180/505 +f 505/180/505 513/188/513 514/189/514 507/182/507 +f 507/182/507 514/189/514 515/190/515 509/184/509 +f 511/187/511 516/192/516 517/191/517 512/186/512 +f 512/186/512 517/191/517 518/193/518 513/188/513 +f 513/188/513 518/193/518 519/194/519 514/189/514 +f 514/189/514 519/194/519 520/195/520 515/190/515 +f 516/192/516 521/197/521 522/196/522 517/191/517 +f 517/191/517 522/196/522 523/198/523 518/193/518 +f 518/193/518 523/198/523 524/199/524 519/194/519 +f 519/194/519 524/199/524 525/200/525 520/195/520 +f 526/202/526 527/201/527 501/178/501 528/203/528 +f 529/206/529 530/205/530 531/204/531 510/185/510 +f 355/30/355 532/207/532 525/200/525 356/29/356 +f 533/208/533 351/27/351 353/28/353 521/197/521 +f 528/203/528 501/178/501 504/179/504 534/209/534 +f 535/210/535 529/206/529 510/185/510 509/184/509 +f 356/29/356 525/200/525 524/199/524 371/46/371 +f 536/211/536 533/208/533 521/197/521 516/192/516 +f 534/209/534 504/179/504 506/181/506 537/212/537 +f 538/213/538 535/210/535 509/184/509 515/190/515 +f 371/46/371 524/199/524 523/198/523 367/42/367 +f 539/214/539 536/211/536 516/192/516 511/187/511 +f 537/212/537 506/181/506 508/183/508 540/215/540 +f 541/216/541 538/213/538 515/190/515 520/195/520 +f 367/42/367 523/198/523 522/196/522 363/38/363 +f 542/217/542 539/214/539 511/187/511 502/177/502 +f 540/215/540 508/183/508 510/185/510 531/204/531 +f 532/207/532 541/216/541 520/195/520 525/200/525 +f 363/38/363 522/196/522 521/197/521 353/28/353 +f 527/201/527 542/217/542 502/177/502 501/178/501 +f 543/220/543 544/219/544 545/218/545 546/221/546 +f 546/221/546 545/218/545 547/222/547 548/223/548 +f 548/223/548 547/222/547 549/224/549 550/225/550 +f 550/225/550 549/224/549 551/226/551 552/227/552 +f 544/219/544 553/229/553 554/228/554 545/218/545 +f 545/218/545 554/228/554 555/230/555 547/222/547 +f 547/222/547 555/230/555 556/231/556 549/224/549 +f 549/224/549 556/231/556 557/232/557 551/226/551 +f 553/229/553 558/234/558 559/233/559 554/228/554 +f 554/228/554 559/233/559 560/235/560 555/230/555 +f 555/230/555 560/235/560 561/236/561 556/231/556 +f 556/231/556 561/236/561 562/237/562 557/232/557 +f 558/234/558 563/239/563 564/238/564 559/233/559 +f 559/233/559 564/238/564 565/240/565 560/235/560 +f 560/235/560 565/240/565 566/241/566 561/236/561 +f 561/236/561 566/241/566 567/242/567 562/237/562 +f 530/205/530 529/206/529 543/220/543 568/243/568 +f 569/246/569 570/245/570 571/244/571 552/227/552 +f 402/77/402 572/247/572 567/242/567 403/76/403 +f 532/207/532 355/30/355 400/75/400 563/239/563 +f 568/243/568 543/220/543 546/221/546 573/248/573 +f 574/249/574 569/246/569 552/227/552 551/226/551 +f 403/76/403 567/242/567 566/241/566 414/89/414 +f 541/216/541 532/207/532 563/239/563 558/234/558 +f 573/248/573 546/221/546 548/223/548 575/250/575 +f 576/251/576 574/249/574 551/226/551 557/232/557 +f 414/89/414 566/241/566 565/240/565 411/86/411 +f 538/213/538 541/216/541 558/234/558 553/229/553 +f 575/250/575 548/223/548 550/225/550 577/252/577 +f 578/253/578 576/251/576 557/232/557 562/237/562 +f 411/86/411 565/240/565 564/238/564 408/83/408 +f 535/210/535 538/213/538 553/229/553 544/219/544 +f 577/252/577 550/225/550 552/227/552 571/244/571 +f 572/247/572 578/253/578 562/237/562 567/242/567 +f 408/83/408 564/238/564 563/239/563 400/75/400 +f 529/206/529 535/210/535 544/219/544 543/220/543 +f 579/256/579 580/255/580 581/254/581 582/257/582 +f 582/257/582 581/254/581 583/258/583 584/259/584 +f 584/259/584 583/258/583 585/260/585 586/261/586 +f 586/261/586 585/260/585 587/262/587 588/263/588 +f 580/255/580 589/265/589 590/264/590 581/254/581 +f 581/254/581 590/264/590 591/266/591 583/258/583 +f 583/258/583 591/266/591 592/267/592 585/260/585 +f 585/260/585 592/267/592 593/268/593 587/262/587 +f 589/265/589 594/270/594 595/269/595 590/264/590 +f 590/264/590 595/269/595 596/271/596 591/266/591 +f 591/266/591 596/271/596 597/272/597 592/267/592 +f 592/267/592 597/272/597 598/273/598 593/268/593 +f 594/270/594 599/275/599 600/274/600 595/269/595 +f 595/269/595 600/274/600 601/276/601 596/271/596 +f 596/271/596 601/276/601 602/277/602 597/272/597 +f 597/272/597 602/277/602 603/278/603 598/273/598 +f 570/245/570 569/246/569 579/256/579 604/279/604 +f 605/282/605 606/281/606 607/280/607 588/263/588 +f 444/119/444 608/283/608 603/278/603 445/118/445 +f 572/247/572 402/77/402 442/117/442 599/275/599 +f 604/279/604 579/256/579 582/257/582 609/284/609 +f 610/285/610 605/282/605 588/263/588 587/262/587 +f 445/118/445 603/278/603 602/277/602 456/131/456 +f 578/253/578 572/247/572 599/275/599 594/270/594 +f 609/284/609 582/257/582 584/259/584 611/286/611 +f 612/287/612 610/285/610 587/262/587 593/268/593 +f 456/131/456 602/277/602 601/276/601 453/128/453 +f 576/251/576 578/253/578 594/270/594 589/265/589 +f 611/286/611 584/259/584 586/261/586 613/288/613 +f 614/289/614 612/287/612 593/268/593 598/273/598 +f 453/128/453 601/276/601 600/274/600 450/125/450 +f 574/249/574 576/251/576 589/265/589 580/255/580 +f 613/288/613 586/261/586 588/263/588 607/280/607 +f 608/283/608 614/289/614 598/273/598 603/278/603 +f 450/125/450 600/274/600 599/275/599 442/117/442 +f 569/246/569 574/249/574 580/255/580 579/256/579 +f 615/292/615 616/291/616 617/290/617 618/293/618 +f 618/293/618 617/290/617 619/294/619 620/295/620 +f 620/295/620 619/294/619 621/296/621 622/297/622 +f 622/297/622 621/296/621 623/298/623 624/299/624 +f 616/291/616 625/301/625 626/300/626 617/290/617 +f 617/290/617 626/300/626 627/302/627 619/294/619 +f 619/294/619 627/302/627 628/303/628 621/296/621 +f 621/296/621 628/303/628 629/304/629 623/298/623 +f 625/301/625 630/306/630 631/305/631 626/300/626 +f 626/300/626 631/305/631 632/307/632 627/302/627 +f 627/302/627 632/307/632 633/308/633 628/303/628 +f 628/303/628 633/308/633 634/309/634 629/304/629 +f 630/306/630 635/311/635 636/310/636 631/305/631 +f 631/305/631 636/310/636 637/312/637 632/307/632 +f 632/307/632 637/312/637 638/313/638 633/308/633 +f 633/308/633 638/313/638 639/314/639 634/309/634 +f 606/281/606 605/282/605 615/292/615 640/315/640 +f 641/318/641 642/317/642 643/316/643 624/299/624 +f 486/161/486 644/319/644 639/314/639 487/160/487 +f 608/283/608 444/119/444 484/159/484 635/311/635 +f 640/315/640 615/292/615 618/293/618 645/320/645 +f 646/321/646 641/318/641 624/299/624 623/298/623 +f 487/160/487 639/314/639 638/313/638 498/173/498 +f 614/289/614 608/283/608 635/311/635 630/306/630 +f 645/320/645 618/293/618 620/295/620 647/322/647 +f 648/323/648 646/321/646 623/298/623 629/304/629 +f 498/173/498 638/313/638 637/312/637 495/170/495 +f 612/287/612 614/289/614 630/306/630 625/301/625 +f 647/322/647 620/295/620 622/297/622 649/324/649 +f 650/325/650 648/323/648 629/304/629 634/309/634 +f 495/170/495 637/312/637 636/310/636 492/167/492 +f 610/285/610 612/287/612 625/301/625 616/291/616 +f 649/324/649 622/297/622 624/299/624 643/316/643 +f 644/319/644 650/325/650 634/309/634 639/314/639 +f 492/167/492 636/310/636 635/311/635 484/159/484 +f 605/282/605 610/285/610 616/291/616 615/292/615 +s 2 +f 352/26/651 351/27/652 27/27/653 26/26/654 +s 4 +f 357/33/655 359/34/656 34/34/657 33/33/658 +f 362/35/659 361/36/660 36/36/661 35/35/662 +s 2 +f 361/36/663 360/37/664 37/37/665 36/36/666 +s 4 +f 359/34/656 365/40/667 40/40/668 34/34/657 +s 2 +f 360/37/664 366/41/669 41/41/670 37/37/665 +s 4 +f 365/40/667 369/44/671 44/44/672 40/40/668 +s 2 +f 366/41/669 370/45/673 45/45/674 41/41/670 +s 4 +f 369/44/671 373/48/675 48/48/676 44/44/672 +s 2 +f 370/45/673 374/49/677 49/49/678 45/45/674 +s 4 +f 373/48/675 362/35/659 35/35/662 48/48/676 +s 2 +f 374/49/677 352/26/651 26/26/654 49/49/678 +s 4 +f 404/80/679 406/81/680 81/81/681 80/80/682 +f 407/82/683 357/33/655 33/33/658 82/82/684 +f 406/81/680 410/85/685 85/85/686 81/81/681 +f 410/85/685 413/88/687 88/88/688 85/85/686 +f 413/88/687 416/91/689 91/91/690 88/88/688 +f 416/91/689 407/82/683 82/82/684 91/91/690 +f 446/122/691 448/123/692 123/123/693 122/122/694 +f 449/124/695 404/80/679 80/80/682 124/124/696 +f 448/123/692 452/127/697 127/127/698 123/123/693 +f 452/127/697 455/130/699 130/130/700 127/127/698 +f 455/130/699 458/133/701 133/133/702 130/130/700 +f 458/133/701 449/124/695 124/124/696 133/133/702 +f 486/161/703 485/162/704 162/162/705 161/161/706 +f 488/164/707 490/165/708 165/165/709 164/164/710 +f 489/163/711 488/164/707 164/164/710 163/163/712 +f 491/166/713 446/122/691 122/122/694 166/166/714 +f 485/162/704 493/168/715 168/168/716 162/162/705 +f 490/165/708 494/169/717 169/169/718 165/165/709 +f 493/168/715 496/171/719 171/171/720 168/168/716 +f 494/169/717 497/172/721 172/172/722 169/169/718 +f 496/171/719 499/174/723 174/174/724 171/171/720 +f 497/172/721 500/175/725 175/175/726 172/172/722 +f 499/174/723 489/163/711 163/163/712 174/174/724 +f 500/175/725 491/166/713 166/166/714 175/175/726 +f 526/202/727 528/203/728 203/203/729 202/202/730 +s 2 +f 527/201/731 526/202/732 202/202/733 201/201/734 +s 4 +f 531/204/735 530/205/736 205/205/737 204/204/738 +s 2 +f 351/27/652 533/208/739 208/208/740 27/27/653 +s 4 +f 528/203/728 534/209/741 209/209/742 203/203/729 +s 2 +f 533/208/739 536/211/743 211/211/744 208/208/740 +s 4 +f 534/209/741 537/212/745 212/212/746 209/209/742 +s 2 +f 536/211/743 539/214/747 214/214/748 211/211/744 +s 4 +f 537/212/745 540/215/749 215/215/750 212/212/746 +s 2 +f 539/214/747 542/217/751 217/217/752 214/214/748 +s 4 +f 540/215/749 531/204/735 204/204/738 215/215/750 +s 2 +f 542/217/751 527/201/731 201/201/734 217/217/752 +s 4 +f 530/205/736 568/243/753 243/243/754 205/205/737 +f 571/244/755 570/245/756 245/245/757 244/244/758 +f 568/243/753 573/248/759 248/248/760 243/243/754 +f 573/248/759 575/250/761 250/250/762 248/248/760 +f 575/250/761 577/252/763 252/252/764 250/250/762 +f 577/252/763 571/244/755 244/244/758 252/252/764 +f 570/245/756 604/279/765 279/279/766 245/245/757 +f 607/280/767 606/281/768 281/281/769 280/280/770 +f 604/279/765 609/284/771 284/284/772 279/279/766 +f 609/284/771 611/286/773 286/286/774 284/284/772 +f 611/286/773 613/288/775 288/288/776 286/286/774 +f 613/288/775 607/280/767 280/280/770 288/288/776 +f 606/281/768 640/315/777 315/315/778 281/281/769 +f 643/316/779 642/317/780 317/317/781 316/316/782 +f 642/317/780 641/318/783 318/318/784 317/317/781 +f 644/319/785 486/161/703 161/161/706 319/319/786 +f 640/315/777 645/320/787 320/320/788 315/315/778 +f 641/318/783 646/321/789 321/321/790 318/318/784 +f 645/320/787 647/322/791 322/322/792 320/320/788 +f 646/321/789 648/323/793 323/323/794 321/321/790 +f 647/322/791 649/324/795 324/324/796 322/322/792 +f 648/323/793 650/325/797 325/325/798 323/323/794 +f 649/324/795 643/316/779 316/316/782 324/324/796 +f 650/325/797 644/319/785 319/319/786 325/325/798 +# 648 polygons + +# +# object lotu_petal_01 +# + +v 0.0056 0.0396 -0.1975 +v -0.0294 0.0405 -0.1315 +v 0.0092 0.0374 -0.0778 +v 0.0584 0.0366 -0.1339 +v 0.0518 0.0465 -0.2695 +v 0.1097 0.0413 -0.1916 +v 0.1056 0.0641 -0.3369 +v 0.1705 0.0449 -0.2574 +v 0.1567 0.0821 -0.4094 +v 0.2393 0.0639 -0.3240 +v -0.0486 0.0646 -0.2616 +v -0.0771 0.0591 -0.1906 +v -0.0071 0.0754 -0.3398 +v 0.0288 0.0905 -0.4191 +v 0.0916 0.0958 -0.4980 +v -0.0995 0.1072 -0.3276 +v -0.1231 0.0907 -0.2460 +v -0.0772 0.1154 -0.4091 +v -0.0291 0.1165 -0.4923 +v 0.0247 0.1198 -0.5793 +v -0.1567 0.1524 -0.3843 +v -0.1624 0.1415 -0.2980 +v -0.1303 0.1540 -0.4685 +v -0.0914 0.1526 -0.5612 +v -0.0474 0.1647 -0.6550 +v -0.0332 0.0428 -0.0277 +v 0.0034 0.0415 0.0165 +v 0.0473 0.0418 -0.0255 +v 0.3079 0.0610 -0.2208 +v 0.3917 0.0815 -0.2813 +v 0.3085 0.0805 -0.3799 +v 0.0105 0.1697 -0.7542 +v -0.0723 0.2051 -0.8306 +v -0.1165 0.2043 -0.7311 +v -0.2085 0.1967 -0.3493 +v -0.2007 0.1858 -0.2553 +v -0.1680 0.1276 -0.2091 +v 0.1021 0.0434 -0.0686 +v 0.2307 0.0996 -0.4868 +v -0.1603 0.2091 -0.6355 +v -0.1285 0.0879 -0.1653 +v 0.1663 0.0457 -0.1205 +v 0.1609 0.1093 -0.5752 +v -0.1853 0.2077 -0.5399 +v -0.0949 0.0634 -0.1211 +v 0.2340 0.0523 -0.1746 +v 0.0832 0.1251 -0.6675 +v -0.2017 0.2079 -0.4439 +v -0.0656 0.0502 -0.0731 +v 0.4018 0.1416 -0.6329 +v 0.3176 0.1163 -0.5501 +v 0.3903 0.1026 -0.4531 +v 0.4867 0.1184 -0.5295 +v 0.4970 0.1547 -0.7145 +v 0.5832 0.1420 -0.6038 +v 0.6007 0.1884 -0.7979 +v 0.6891 0.1762 -0.6876 +v 0.7120 0.2484 -0.8864 +v 0.8084 0.2297 -0.7739 +v 0.3197 0.1536 -0.7357 +v 0.2330 0.1227 -0.6583 +v 0.4059 0.1804 -0.8192 +v 0.5074 0.2151 -0.9053 +v 0.6153 0.2659 -0.9993 +v 0.2277 0.1692 -0.8449 +v 0.1559 0.1457 -0.7576 +v 0.3166 0.1861 -0.9283 +v 0.4087 0.2340 -1.0053 +v 0.5186 0.2920 -1.0893 +v 0.1439 0.1972 -0.9400 +v 0.0703 0.1818 -0.8510 +v 0.2188 0.2157 -1.0276 +v 0.3155 0.2451 -1.1134 +v 0.4184 0.3008 -1.1894 +v 0.4761 0.0898 -0.3560 +v 0.8902 0.2349 -0.6581 +v 1.0248 0.2918 -0.7490 +v 0.9295 0.3029 -0.8588 +v 0.5428 0.3762 -1.2802 +v 0.4498 0.4089 -1.3750 +v 0.3220 0.3388 -1.3016 +v -0.0097 0.2273 -0.9343 +v 0.5603 0.1066 -0.4225 +v 0.8372 0.3240 -0.9753 +v 0.2149 0.3007 -1.2156 +v 0.6662 0.1423 -0.5010 +v 0.7389 0.3424 -1.0876 +v 0.1320 0.2679 -1.1288 +v 0.7779 0.1947 -0.5734 +v 0.6348 0.3542 -1.1933 +v 0.0503 0.2489 -1.0356 +v 1.1232 0.4657 -1.1624 +v 0.9751 0.4012 -1.0679 +v 1.0688 0.3727 -0.9531 +v 1.2211 0.4491 -1.0649 +v 1.2915 0.5761 -1.2826 +v 1.3839 0.5769 -1.1997 +v 1.4735 0.7162 -1.3859 +v 1.5501 0.7190 -1.3009 +v 1.6309 0.8606 -1.4809 +v 1.7042 0.8556 -1.3967 +v 1.0349 0.4899 -1.2652 +v 0.8715 0.4119 -1.1745 +v 1.2138 0.6002 -1.3645 +v 1.3936 0.7203 -1.4825 +v 1.5458 0.8744 -1.5539 +v 0.9472 0.5106 -1.3787 +v 0.7829 0.4313 -1.2777 +v 1.1337 0.6272 -1.4633 +v 1.2976 0.7517 -1.5651 +v 1.4513 0.8960 -1.6433 +v 0.8716 0.5453 -1.4837 +v 0.6898 0.4673 -1.3807 +v 1.0359 0.6531 -1.5647 +v 1.2024 0.7790 -1.6454 +v 1.3648 0.9304 -1.7190 +v 1.1597 0.3553 -0.8456 +v 1.7711 0.8614 -1.3145 +v 1.8900 1.0067 -1.3925 +v 1.8273 1.0092 -1.4707 +v 1.5017 1.0564 -1.7548 +v 1.4126 1.0941 -1.8249 +v 1.2672 0.9642 -1.7887 +v 0.6051 0.5188 -1.4808 +v 1.3171 0.4583 -0.9715 +v 1.7555 1.0199 -1.5466 +v 1.1132 0.8265 -1.7300 +v 1.4778 0.5843 -1.1022 +v 1.6680 1.0329 -1.6144 +v 0.9397 0.6960 -1.6582 +v 1.6253 0.7210 -1.2081 +v 1.5890 1.0413 -1.6848 +v 0.7712 0.6036 -1.5677 +v 1.9317 1.2815 -1.6137 +v 1.8488 1.1576 -1.5888 +v 1.9181 1.1543 -1.5198 +v 1.9909 1.2735 -1.5620 +v 2.0033 1.4011 -1.6217 +v 2.0546 1.3934 -1.5767 +v 2.0640 1.5149 -1.6259 +v 2.1046 1.5094 -1.5939 +v 2.1182 1.6204 -1.6386 +v 2.1457 1.6155 -1.6184 +v 1.8642 1.2933 -1.6657 +v 1.7750 1.1765 -1.6518 +v 1.9416 1.4146 -1.6719 +v 2.0159 1.5208 -1.6643 +v 2.0829 1.6234 -1.6604 +v 1.7909 1.3130 -1.7176 +v 1.7033 1.1871 -1.7097 +v 1.8750 1.4242 -1.7202 +v 1.9617 1.5310 -1.7060 +v 2.0465 1.6213 -1.6808 +v 1.7195 1.3196 -1.7639 +v 1.6191 1.1934 -1.7710 +v 1.8122 1.4301 -1.7579 +v 1.9127 1.5366 -1.7372 +v 2.0112 1.6203 -1.7030 +v 1.9777 1.1436 -1.4513 +v 2.1631 1.6092 -1.6020 +v 2.1857 1.7153 -1.6301 +v 2.1721 1.7170 -1.6419 +v 2.1091 1.6952 -1.6742 +v 2.0909 1.6780 -1.6765 +v 1.9794 1.6147 -1.7222 +v 1.5241 1.2115 -1.8287 +v 2.0497 1.2672 -1.5060 +v 2.1578 1.7168 -1.6526 +v 1.8678 1.5340 -1.7619 +v 2.0959 1.3859 -1.5275 +v 2.1426 1.7131 -1.6628 +v 1.7484 1.4362 -1.7937 +v 2.1367 1.5004 -1.5658 +v 2.1264 1.7055 -1.6691 +v 1.6400 1.3292 -1.8099 +v 0.2965 0.1067 0.2260 +v 0.2174 0.1037 0.2173 +v 0.2671 0.1438 0.2856 +v 0.3526 0.1433 0.2928 +v 0.3805 0.1089 0.2075 +v 0.4408 0.1355 0.2896 +v 0.4705 0.1125 0.1834 +v 0.5323 0.1406 0.2762 +v 0.5623 0.1212 0.1580 +v 0.6243 0.1564 0.2509 +v 0.2453 0.0793 0.1440 +v 0.1725 0.0822 0.1537 +v 0.3258 0.0820 0.1327 +v 0.4106 0.0935 0.0952 +v 0.5006 0.0996 0.0587 +v 0.1990 0.0610 0.0644 +v 0.1274 0.0604 0.0913 +v 0.2735 0.0598 0.0430 +v 0.3535 0.0680 0.0148 +v 0.4397 0.0774 -0.0373 +v 0.1483 0.0495 -0.0057 +v 0.0894 0.0480 0.0313 +v 0.2161 0.0522 -0.0455 +v 0.2938 0.0587 -0.0784 +v 0.3800 0.0633 -0.1231 +v 0.1798 0.1398 0.2555 +v 0.2216 0.1895 0.3090 +v 0.3107 0.1916 0.3404 +v 0.7001 0.2077 0.3550 +v 0.8033 0.2333 0.3324 +v 0.7282 0.1812 0.2267 +v 0.4625 0.0775 -0.1892 +v 0.0370 0.0498 0.0631 +v 0.4037 0.1881 0.3643 +v 0.6588 0.1355 0.1171 +v 0.0682 0.0627 0.1131 +v 0.4997 0.1900 0.3704 +v 0.5977 0.1137 0.0181 +v 0.1040 0.0831 0.1636 +v 0.5986 0.1909 0.3670 +v 0.5336 0.0906 -0.0872 +v 0.1393 0.1078 0.2123 +v 0.8690 0.1843 0.0289 +v 0.7628 0.1527 0.0786 +v 0.8391 0.1986 0.1894 +v 0.9445 0.2337 0.1523 +v 0.9848 0.2261 -0.0285 +v 1.0593 0.2712 0.0930 +v 1.1090 0.2533 -0.1006 +v 1.1706 0.3012 0.0223 +v 1.2298 0.3024 -0.1841 +v 1.2997 0.3414 -0.0665 +v 0.8041 0.1422 -0.0889 +v 0.6983 0.1198 -0.0325 +v 0.9176 0.1888 -0.1488 +v 1.0295 0.2302 -0.2218 +v 1.1446 0.2779 -0.3088 +v 0.7259 0.1286 -0.2011 +v 0.6321 0.0987 -0.1440 +v 0.8387 0.1641 -0.2693 +v 0.9448 0.2185 -0.3370 +v 1.0613 0.2647 -0.4253 +v 0.6493 0.1086 -0.3194 +v 0.5512 0.0913 -0.2517 +v 0.7461 0.1513 -0.3828 +v 0.8596 0.2018 -0.4620 +v 0.9725 0.2578 -0.5398 +v 0.9107 0.2617 0.3081 +v 1.3625 0.3908 0.0628 +v 1.4856 0.4361 -0.0248 +v 1.4271 0.3872 -0.1630 +v 1.0952 0.3082 -0.6359 +v 1.0221 0.2888 0.2618 +v 1.3507 0.3601 -0.2845 +v 1.1320 0.3132 0.2145 +v 1.2677 0.3269 -0.4045 +v 1.2474 0.3378 0.1439 +v 1.1756 0.3189 -0.5175 +v 1.6107 0.5243 -0.5273 +v 1.4815 0.4225 -0.3920 +v 1.5517 0.4519 -0.2665 +v 1.6879 0.5433 -0.4114 +v 1.7572 0.6256 -0.6656 +v 1.8169 0.6545 -0.5483 +v 1.8953 0.7641 -0.8056 +v 1.9388 0.7848 -0.6868 +v 2.0089 0.8977 -0.9327 +v 2.0422 0.9228 -0.8347 +v 1.5522 0.4931 -0.6404 +v 1.3891 0.3954 -0.5219 +v 1.7023 0.6199 -0.7834 +v 1.8538 0.7547 -0.9146 +v 1.9651 0.8911 -1.0280 +v 1.4759 0.4728 -0.7613 +v 1.3153 0.3819 -0.6347 +v 1.6298 0.6081 -0.8913 +v 1.7822 0.7445 -1.0195 +v 1.9099 0.8826 -1.1287 +v 1.3930 0.4653 -0.8750 +v 1.2477 0.3691 -0.7454 +v 1.5646 0.5934 -0.9981 +v 1.7029 0.7280 -1.1215 +v 1.8378 0.8678 -1.2249 +v 1.6192 0.4921 -0.1463 +v 2.0806 0.9510 -0.7261 +v 2.1624 1.0901 -0.8419 +v 2.1299 1.0515 -0.9515 +v 1.9525 0.9994 -1.3099 +v 1.7479 0.5817 -0.2887 +v 2.1046 1.0334 -1.0478 +v 1.8733 0.6918 -0.4345 +v 2.0664 1.0184 -1.1395 +v 1.9871 0.8219 -0.5760 +v 2.0121 1.0074 -1.2261 +v 2.2103 1.2803 -1.2387 +v 2.1728 1.1552 -1.1440 +v 2.1993 1.1692 -1.0533 +v 2.2339 1.2925 -1.1607 +v 2.2303 1.3924 -1.3156 +v 2.2513 1.4054 -1.2541 +v 2.2546 1.5021 -1.3977 +v 2.2752 1.5093 -1.3474 +v 2.2449 1.6017 -1.4758 +v 2.2580 1.5972 -1.4382 +v 2.1777 1.2637 -1.3093 +v 2.1282 1.1463 -1.2271 +v 2.2049 1.3859 -1.3781 +v 2.2266 1.4994 -1.4478 +v 2.2286 1.6019 -1.5157 +v 2.1453 1.2639 -1.3800 +v 2.0812 1.1378 -1.3050 +v 2.1708 1.3799 -1.4334 +v 2.2004 1.4929 -1.4943 +v 2.2026 1.6009 -1.5521 +v 2.1002 1.2681 -1.4460 +v 2.0298 1.1388 -1.3804 +v 2.1332 1.3774 -1.4815 +v 2.1677 1.4942 -1.5344 +v 2.1804 1.6052 -1.5824 +v 2.2177 1.2026 -0.9641 +v 2.2708 1.5912 -1.4047 +v 2.2498 1.6696 -1.5069 +v 2.2356 1.6761 -1.5324 +v 2.1979 1.7107 -1.6155 +v 2.2631 1.3098 -1.0788 +v 2.2251 1.6844 -1.5559 +v 2.2746 1.4156 -1.1899 +v 2.2180 1.6937 -1.5777 +v 2.2898 1.5066 -1.2992 +v 2.2094 1.7034 -1.5979 +v 0.0098 0.0106 -0.0835 +v -0.0334 0.0140 -0.1370 +v 0.0050 0.0130 -0.2038 +v 0.0600 0.0090 -0.1378 +v 0.0529 0.0193 -0.2740 +v 0.1113 0.0141 -0.1973 +v 0.1044 0.0375 -0.3441 +v 0.1736 0.0179 -0.2631 +v 0.1545 0.0555 -0.4194 +v 0.2425 0.0375 -0.3293 +v -0.0841 0.0336 -0.1956 +v -0.0511 0.0398 -0.2676 +v -0.0134 0.0503 -0.3449 +v 0.0241 0.0645 -0.4269 +v 0.0857 0.0691 -0.5032 +v -0.1352 0.0695 -0.2520 +v -0.1084 0.0836 -0.3340 +v -0.0866 0.0905 -0.4173 +v -0.0360 0.0914 -0.4981 +v 0.0198 0.0935 -0.5873 +v -0.1812 0.1225 -0.3019 +v -0.1730 0.1305 -0.3923 +v -0.1409 0.1307 -0.4790 +v -0.1007 0.1281 -0.5685 +v -0.0550 0.1404 -0.6627 +v 0.0031 0.0145 0.0133 +v -0.0335 0.0160 -0.0319 +v 0.0494 0.0148 -0.0273 +v 0.3102 0.0544 -0.3829 +v 0.3974 0.0550 -0.2825 +v 0.3142 0.0343 -0.2242 +v -0.0774 0.1799 -0.8390 +v 0.0060 0.1432 -0.7602 +v -0.1258 0.1788 -0.7372 +v -0.1886 0.1133 -0.2108 +v -0.2202 0.1719 -0.2543 +v -0.2280 0.1801 -0.3506 +v 0.1054 0.0166 -0.0711 +v 0.2281 0.0726 -0.4924 +v -0.1703 0.1847 -0.6401 +v -0.1447 0.0666 -0.1703 +v 0.1715 0.0188 -0.1232 +v 0.1592 0.0818 -0.5826 +v -0.1981 0.1857 -0.5442 +v -0.1049 0.0403 -0.1268 +v 0.2387 0.0254 -0.1777 +v 0.0775 0.1002 -0.6773 +v -0.2198 0.1870 -0.4470 +v -0.0695 0.0237 -0.0786 +v 0.3907 0.0769 -0.4536 +v 0.3176 0.0896 -0.5550 +v 0.4034 0.1146 -0.6392 +v 0.4915 0.0917 -0.5338 +v 0.4997 0.1282 -0.7213 +v 0.5876 0.1162 -0.6063 +v 0.6009 0.1630 -0.8047 +v 0.6930 0.1496 -0.6911 +v 0.7170 0.2263 -0.8942 +v 0.8115 0.2041 -0.7798 +v 0.2327 0.0959 -0.6673 +v 0.3192 0.1279 -0.7395 +v 0.4027 0.1544 -0.8270 +v 0.5092 0.1901 -0.9154 +v 0.6185 0.2433 -1.0091 +v 0.1532 0.1207 -0.7623 +v 0.2243 0.1414 -0.8530 +v 0.3153 0.1593 -0.9360 +v 0.4079 0.2084 -1.0180 +v 0.5238 0.2677 -1.1006 +v 0.0643 0.1555 -0.8583 +v 0.1402 0.1712 -0.9501 +v 0.2151 0.1901 -1.0402 +v 0.3187 0.2201 -1.1247 +v 0.4257 0.2755 -1.2021 +v 0.4787 0.0632 -0.3562 +v 0.9342 0.2784 -0.8655 +v 1.0310 0.2655 -0.7576 +v 0.8988 0.2089 -0.6626 +v 0.4569 0.3869 -1.3862 +v 0.5457 0.3555 -1.2957 +v 0.3252 0.3155 -1.3114 +v -0.0147 0.2023 -0.9429 +v 0.5637 0.0793 -0.4258 +v 0.8410 0.3014 -0.9860 +v 0.2199 0.2756 -1.2270 +v 0.6725 0.1168 -0.5010 +v 0.7434 0.3163 -1.0961 +v 0.1325 0.2431 -1.1368 +v 0.7825 0.1685 -0.5780 +v 0.6440 0.3299 -1.2065 +v 0.0455 0.2250 -1.0457 +v 1.0789 0.3484 -0.9645 +v 0.9851 0.3767 -1.0810 +v 1.1304 0.4427 -1.1760 +v 1.2290 0.4254 -1.0803 +v 1.3005 0.5553 -1.2979 +v 1.3905 0.5529 -1.2101 +v 1.4853 0.6925 -1.4014 +v 1.5603 0.6964 -1.3134 +v 1.6414 0.8446 -1.4945 +v 1.7125 0.8359 -1.4102 +v 0.8792 0.3871 -1.1862 +v 1.0436 0.4679 -1.2748 +v 1.2253 0.5768 -1.3790 +v 1.4036 0.7007 -1.4977 +v 1.5518 0.8565 -1.5713 +v 0.7902 0.4059 -1.2936 +v 0.9571 0.4862 -1.3889 +v 1.1444 0.6050 -1.4769 +v 1.3032 0.7330 -1.5806 +v 1.4625 0.8799 -1.6590 +v 0.6993 0.4440 -1.3939 +v 0.8761 0.5237 -1.4939 +v 1.0462 0.6319 -1.5806 +v 1.2114 0.7614 -1.6632 +v 1.3732 0.9131 -1.7384 +v 1.1707 0.3313 -0.8554 +v 1.8403 0.9936 -1.4842 +v 1.9044 0.9888 -1.4049 +v 1.7860 0.8426 -1.3266 +v 1.4222 1.0842 -1.8434 +v 1.5103 1.0457 -1.7725 +v 1.2759 0.9483 -1.8087 +v 0.6079 0.4964 -1.4948 +v 1.3239 0.4359 -0.9816 +v 1.7659 1.0049 -1.5616 +v 1.1204 0.8079 -1.7462 +v 1.4868 0.5600 -1.1070 +v 1.6795 1.0200 -1.6313 +v 0.9465 0.6764 -1.6747 +v 1.6357 0.6971 -1.2205 +v 1.6016 1.0280 -1.7057 +v 0.7760 0.5806 -1.5824 +v 1.9323 1.1364 -1.5398 +v 1.8608 1.1410 -1.6054 +v 1.9436 1.2680 -1.6304 +v 2.0046 1.2559 -1.5812 +v 2.0157 1.3870 -1.6419 +v 2.0741 1.3792 -1.5944 +v 2.0787 1.5028 -1.6465 +v 2.1218 1.4951 -1.6143 +v 2.1331 1.6110 -1.6613 +v 2.1643 1.6046 -1.6411 +v 1.7897 1.1612 -1.6732 +v 1.8757 1.2809 -1.6847 +v 1.9504 1.4008 -1.6918 +v 2.0263 1.5099 -1.6853 +v 2.0977 1.6142 -1.6841 +v 1.7138 1.1743 -1.7295 +v 1.8033 1.2969 -1.7384 +v 1.8863 1.4135 -1.7402 +v 1.9746 1.5208 -1.7239 +v 2.0598 1.6151 -1.7036 +v 1.6299 1.1816 -1.7907 +v 1.7312 1.3045 -1.7857 +v 1.8216 1.4182 -1.7814 +v 1.9239 1.5277 -1.7602 +v 2.0216 1.6133 -1.7253 +v 1.9954 1.1245 -1.4680 +v 2.1911 1.7058 -1.6626 +v 2.2046 1.7024 -1.6471 +v 2.1842 1.5987 -1.6229 +v 2.1038 1.6725 -1.7006 +v 2.1256 1.6860 -1.6972 +v 1.9908 1.6043 -1.7445 +v 1.5379 1.1978 -1.8505 +v 2.0678 1.2517 -1.5231 +v 2.1767 1.7055 -1.6756 +v 1.8799 1.5242 -1.7850 +v 2.1171 1.3706 -1.5472 +v 2.1616 1.7030 -1.6853 +v 1.7604 1.4228 -1.8155 +v 2.1552 1.4858 -1.5845 +v 2.1449 1.6960 -1.6928 +v 1.6526 1.3178 -1.8336 +v 0.2668 0.1247 0.3014 +v 0.2178 0.0797 0.2292 +v 0.2986 0.0806 0.2374 +v 0.3554 0.1198 0.3085 +v 0.3844 0.0814 0.2178 +v 0.4452 0.1116 0.3005 +v 0.4782 0.0848 0.1911 +v 0.5378 0.1159 0.2869 +v 0.5709 0.0929 0.1638 +v 0.6337 0.1311 0.2577 +v 0.1748 0.0567 0.1606 +v 0.2488 0.0539 0.1521 +v 0.3308 0.0568 0.1391 +v 0.4162 0.0666 0.1021 +v 0.5105 0.0735 0.0632 +v 0.1326 0.0342 0.0941 +v 0.2022 0.0338 0.0669 +v 0.2808 0.0329 0.0462 +v 0.3601 0.0416 0.0167 +v 0.4458 0.0506 -0.0327 +v 0.0925 0.0212 0.0324 +v 0.1521 0.0227 -0.0060 +v 0.2209 0.0256 -0.0464 +v 0.2991 0.0320 -0.0797 +v 0.3839 0.0362 -0.1241 +v 0.2172 0.1727 0.3268 +v 0.1792 0.1199 0.2742 +v 0.3076 0.1698 0.3592 +v 0.7321 0.1558 0.2344 +v 0.8109 0.2075 0.3399 +v 0.7053 0.1838 0.3650 +v 0.4687 0.0507 -0.1873 +v 0.0406 0.0234 0.0641 +v 0.4012 0.1650 0.3778 +v 0.6678 0.1092 0.1249 +v 0.0740 0.0364 0.1163 +v 0.4985 0.1665 0.3846 +v 0.6069 0.0863 0.0206 +v 0.1055 0.0573 0.1690 +v 0.6005 0.1668 0.3791 +v 0.5402 0.0648 -0.0850 +v 0.1385 0.0838 0.2253 +v 0.8438 0.1740 0.1960 +v 0.7727 0.1284 0.0843 +v 0.8764 0.1602 0.0322 +v 0.9528 0.2087 0.1547 +v 0.9948 0.2004 -0.0250 +v 1.0666 0.2456 0.0969 +v 1.1191 0.2277 -0.0980 +v 1.1791 0.2757 0.0231 +v 1.2373 0.2782 -0.1886 +v 1.3113 0.3155 -0.0663 +v 0.7069 0.0932 -0.0311 +v 0.8124 0.1162 -0.0870 +v 0.9244 0.1635 -0.1476 +v 1.0391 0.2055 -0.2214 +v 1.1552 0.2518 -0.3118 +v 0.6398 0.0720 -0.1426 +v 0.7350 0.1023 -0.2021 +v 0.8442 0.1387 -0.2702 +v 0.9533 0.1914 -0.3393 +v 1.0722 0.2398 -0.4269 +v 0.5586 0.0647 -0.2515 +v 0.6576 0.0821 -0.3186 +v 0.7514 0.1266 -0.3847 +v 0.8655 0.1752 -0.4625 +v 0.9862 0.2332 -0.5448 +v 0.9174 0.2376 0.3164 +v 1.4422 0.3635 -0.1604 +v 1.5031 0.4115 -0.0202 +v 1.3765 0.3659 0.0650 +v 1.1059 0.2823 -0.6433 +v 1.0300 0.2642 0.2681 +v 1.3612 0.3340 -0.2873 +v 1.1408 0.2878 0.2123 +v 1.2779 0.3023 -0.4106 +v 1.2588 0.3114 0.1433 +v 1.1873 0.2931 -0.5244 +v 1.5685 0.4280 -0.2659 +v 1.4964 0.3978 -0.3925 +v 1.6256 0.4999 -0.5310 +v 1.7042 0.5215 -0.4138 +v 1.7759 0.6053 -0.6721 +v 1.8358 0.6318 -0.5531 +v 1.9184 0.7411 -0.8094 +v 1.9592 0.7631 -0.6905 +v 2.0301 0.8773 -0.9402 +v 2.0641 0.9076 -0.8386 +v 1.4038 0.3716 -0.5247 +v 1.5629 0.4700 -0.6424 +v 1.7165 0.5988 -0.7896 +v 1.8705 0.7317 -0.9197 +v 1.9838 0.8688 -1.0362 +v 1.3282 0.3573 -0.6402 +v 1.4891 0.4489 -0.7606 +v 1.6436 0.5851 -0.8997 +v 1.7943 0.7224 -1.0265 +v 1.9267 0.8612 -1.1373 +v 1.2615 0.3449 -0.7523 +v 1.4057 0.4416 -0.8811 +v 1.5744 0.5705 -1.0039 +v 1.7137 0.7086 -1.1301 +v 1.8520 0.8458 -1.2360 +v 1.6376 0.4665 -0.1470 +v 2.1521 1.0362 -0.9545 +v 2.1860 1.0760 -0.8461 +v 2.1012 0.9370 -0.7284 +v 1.9682 0.9825 -1.3227 +v 1.7651 0.5600 -0.2913 +v 2.1278 1.0139 -1.0574 +v 1.8893 0.6698 -0.4372 +v 2.0854 0.9984 -1.1508 +v 2.0080 0.8030 -0.5802 +v 2.0271 0.9894 -1.2393 +v 2.2231 1.1577 -1.0625 +v 2.1953 1.1390 -1.1515 +v 2.2345 1.2652 -1.2485 +v 2.2579 1.2840 -1.1679 +v 2.2541 1.3855 -1.3287 +v 2.2758 1.3950 -1.2633 +v 2.2766 1.4954 -1.4101 +v 2.2991 1.4990 -1.3572 +v 2.2695 1.5941 -1.4878 +v 2.2830 1.5883 -1.4487 +v 2.1487 1.1310 -1.2359 +v 2.2011 1.2484 -1.3199 +v 2.2274 1.3719 -1.3913 +v 2.2502 1.4900 -1.4626 +v 2.2502 1.5911 -1.5270 +v 2.0999 1.1224 -1.3173 +v 2.1658 1.2453 -1.3921 +v 2.1922 1.3650 -1.4531 +v 2.2213 1.4817 -1.5100 +v 2.2232 1.5886 -1.5659 +v 2.0500 1.1224 -1.3957 +v 2.1194 1.2489 -1.4601 +v 2.1548 1.3615 -1.5040 +v 2.1861 1.4810 -1.5520 +v 2.2014 1.5932 -1.5988 +v 2.2430 1.1918 -0.9707 +v 2.2561 1.6619 -1.5454 +v 2.2651 1.6493 -1.5235 +v 2.2942 1.5823 -1.4150 +v 2.2181 1.6971 -1.6299 +v 2.2880 1.2977 -1.0856 +v 2.2477 1.6735 -1.5679 +v 2.2987 1.4026 -1.1973 +v 2.2405 1.6820 -1.5898 +v 2.3134 1.4967 -1.3093 +v 2.2294 1.6898 -1.6106 +# 650 vertices + +vn 0.1661 0.9857 -0.0300 +vn 0.1486 0.9807 -0.1268 +vn -0.0017 0.9992 -0.0401 +vn -0.0223 0.9992 0.0345 +vn 0.1721 0.9817 0.0817 +vn 0.0148 0.9981 0.0598 +vn 0.1843 0.9751 0.1236 +vn 0.0610 0.9921 0.1100 +vn 0.1409 0.9786 0.1502 +vn 0.0786 0.9823 0.1700 +vn 0.3571 0.9282 -0.1044 +vn 0.3156 0.9269 -0.2033 +vn 0.3246 0.9457 -0.0184 +vn 0.2534 0.9671 0.0214 +vn 0.1750 0.9830 0.0546 +vn 0.4480 0.8734 -0.1912 +vn 0.4672 0.8203 -0.3300 +vn 0.3904 0.9044 -0.1722 +vn 0.3244 0.9415 -0.0918 +vn 0.3063 0.9495 -0.0683 +vn 0.4968 0.7801 -0.3803 +vn 0.5329 0.7041 -0.4693 +vn 0.4472 0.8473 -0.2866 +vn 0.4005 0.8999 -0.1727 +vn 0.3586 0.9286 -0.0953 +vn 0.0515 0.9921 -0.1143 +vn -0.0878 0.9961 -0.0068 +vn -0.0859 0.9962 0.0107 +vn -0.0116 0.9903 0.1387 +vn 0.0251 0.9901 0.1382 +vn 0.0664 0.9805 0.1848 +vn 0.3408 0.9390 -0.0474 +vn 0.3153 0.9489 -0.0134 +vn 0.3673 0.9124 -0.1806 +vn 0.5316 0.6827 -0.5013 +vn 0.5186 0.4781 -0.7088 +vn 0.5099 0.7372 -0.4434 +vn -0.0795 0.9963 0.0311 +vn 0.1089 0.9830 0.1478 +vn 0.4537 0.8411 -0.2944 +vn 0.4130 0.8138 -0.4087 +vn -0.0653 0.9966 0.0502 +vn 0.1202 0.9864 0.1122 +vn 0.4857 0.7899 -0.3744 +vn 0.2844 0.9113 -0.2976 +vn -0.0554 0.9937 0.0978 +vn 0.2535 0.9666 0.0369 +vn 0.5237 0.7014 -0.4835 +vn 0.1721 0.9610 -0.2164 +vn 0.1378 0.9791 0.1495 +vn 0.0895 0.9784 0.1863 +vn 0.1022 0.9830 0.1528 +vn 0.1197 0.9816 0.1491 +vn 0.1515 0.9722 0.1785 +vn 0.0563 0.9725 0.2260 +vn 0.1341 0.9428 0.3052 +vn 0.0084 0.9495 0.3138 +vn 0.1291 0.9035 0.4087 +vn 0.0360 0.9218 0.3861 +vn 0.0902 0.9724 0.2151 +vn 0.1128 0.9791 0.1694 +vn 0.1215 0.9661 0.2278 +vn 0.1883 0.9390 0.2878 +vn 0.1801 0.9081 0.3781 +vn 0.1788 0.9728 0.1475 +vn 0.2195 0.9673 0.1268 +vn 0.1301 0.9628 0.2367 +vn 0.1177 0.9250 0.3613 +vn 0.1800 0.9117 0.3693 +vn 0.3032 0.9494 0.0823 +vn 0.3347 0.9420 0.0242 +vn 0.3020 0.9429 0.1408 +vn 0.2426 0.9240 0.2955 +vn 0.1815 0.8917 0.4147 +vn 0.0486 0.9922 0.1152 +vn -0.0742 0.9414 0.3289 +vn -0.0253 0.9379 0.3459 +vn 0.1041 0.9079 0.4062 +vn 0.2410 0.8663 0.4375 +vn 0.2626 0.8450 0.4659 +vn 0.2853 0.8804 0.3788 +vn 0.3585 0.9331 0.0262 +vn 0.0292 0.9801 0.1962 +vn 0.1346 0.8923 0.4309 +vn 0.3765 0.9015 0.2136 +vn -0.0423 0.9508 0.3068 +vn 0.1348 0.8929 0.4297 +vn 0.3686 0.9189 0.1403 +vn -0.0790 0.9434 0.3222 +vn 0.1939 0.8925 0.4073 +vn 0.3695 0.9276 0.0560 +vn 0.1809 0.8908 0.4169 +vn 0.1526 0.9078 0.3906 +vn 0.1528 0.9151 0.3730 +vn 0.0935 0.8876 0.4509 +vn 0.1597 0.8460 0.5088 +vn 0.0544 0.8333 0.5502 +vn 0.0595 0.7881 0.6127 +vn 0.0225 0.7967 0.6040 +vn 0.1556 0.7041 0.6928 +vn 0.0364 0.7342 0.6779 +vn 0.1546 0.8822 0.4447 +vn 0.1351 0.9043 0.4049 +vn 0.2183 0.8414 0.4944 +vn 0.1909 0.7753 0.6020 +vn 0.2134 0.6683 0.7126 +vn 0.1777 0.8697 0.4604 +vn 0.2011 0.8924 0.4040 +vn 0.2032 0.8182 0.5378 +vn 0.2997 0.7499 0.5898 +vn 0.2858 0.6513 0.7029 +vn 0.3286 0.8317 0.4476 +vn 0.3143 0.8522 0.4183 +vn 0.2751 0.7794 0.5629 +vn 0.3293 0.7157 0.6158 +vn 0.3614 0.6292 0.6881 +vn 0.0113 0.9227 0.3853 +vn -0.0266 0.7389 0.6732 +vn 0.0382 0.6538 0.7557 +vn 0.0851 0.6264 0.7749 +vn 0.3323 0.5345 0.7771 +vn 0.3782 0.5219 0.7646 +vn 0.3868 0.6194 0.6832 +vn 0.3326 0.8280 0.4514 +vn -0.0170 0.8730 0.4875 +vn 0.2062 0.5935 0.7779 +vn 0.3609 0.6890 0.6285 +vn -0.0075 0.8285 0.5599 +vn 0.2393 0.5723 0.7844 +vn 0.3543 0.7551 0.5517 +vn -0.0023 0.7974 0.6034 +vn 0.2397 0.5631 0.7908 +vn 0.4338 0.7974 0.4195 +vn 0.2480 0.4470 0.8595 +vn 0.2091 0.5225 0.8266 +vn 0.1265 0.5608 0.8183 +vn 0.1953 0.4824 0.8539 +vn 0.2491 0.3599 0.8991 +vn 0.1657 0.3774 0.9111 +vn 0.2667 0.3459 0.8996 +vn 0.2560 0.3816 0.8882 +vn 0.3290 0.3464 0.8785 +vn 0.2767 0.3512 0.8945 +vn 0.3179 0.4146 0.8527 +vn 0.2787 0.4877 0.8273 +vn 0.2936 0.3467 0.8908 +vn 0.2819 0.3183 0.9051 +vn 0.3519 0.3300 0.8759 +vn 0.3417 0.3869 0.8565 +vn 0.2721 0.4578 0.8464 +vn 0.3460 0.3318 0.8776 +vn 0.3261 0.2874 0.9006 +vn 0.3383 0.3152 0.8867 +vn 0.3627 0.3465 0.8651 +vn 0.3394 0.4092 0.8469 +vn 0.3832 0.3145 0.8685 +vn 0.3672 0.2684 0.8906 +vn 0.3136 0.3206 0.8938 +vn 0.0749 0.5921 0.8024 +vn 0.1843 0.3491 0.9188 +vn 0.1774 0.3217 0.9301 +vn 0.2382 0.3229 0.9160 +vn 0.4383 0.2689 0.8576 +vn -0.0892 -0.5647 -0.8205 +vn 0.3125 0.3052 0.8996 +vn 0.3868 0.3974 0.8321 +vn 0.0995 0.4948 0.8633 +vn 0.2545 0.3327 0.9080 +vn 0.3794 0.2770 0.8828 +vn 0.0922 0.4038 0.9102 +vn 0.2833 0.3433 0.8955 +vn 0.3999 0.3105 0.8624 +vn 0.2121 0.4147 0.8849 +vn 0.3629 0.3336 0.8701 +vn 0.3949 0.3134 0.8636 +vn -0.3352 0.9171 -0.2157 +vn -0.3309 0.8858 -0.3254 +vn -0.4325 0.7510 -0.4990 +vn -0.3848 0.8476 -0.3654 +vn -0.2705 0.9581 -0.0943 +vn -0.3472 0.9097 -0.2277 +vn -0.2123 0.9770 -0.0208 +vn -0.3498 0.9333 -0.0813 +vn -0.2386 0.9700 0.0469 +vn -0.3504 0.9358 0.0395 +vn -0.2227 0.9658 -0.1332 +vn -0.2608 0.9485 -0.1798 +vn -0.2497 0.9680 -0.0245 +vn -0.2202 0.9750 0.0311 +vn -0.1896 0.9805 0.0514 +vn -0.1583 0.9855 -0.0607 +vn -0.2187 0.9724 -0.0812 +vn -0.1411 0.9900 -0.0069 +vn -0.1764 0.9826 0.0581 +vn -0.1701 0.9820 0.0820 +vn -0.1098 0.9939 0.0119 +vn -0.1331 0.9909 -0.0202 +vn -0.0808 0.9961 0.0361 +vn -0.0674 0.9961 0.0567 +vn -0.0684 0.9927 0.0993 +vn -0.4276 0.7435 -0.5142 +vn -0.4502 0.6204 -0.6422 +vn -0.4412 0.7203 -0.5353 +vn -0.3720 0.9276 0.0337 +vn -0.3918 0.9184 0.0552 +vn -0.3537 0.9337 0.0553 +vn -0.0465 0.9918 0.1191 +vn -0.1602 0.9866 -0.0316 +vn -0.4140 0.8113 -0.4127 +vn -0.2691 0.9609 0.0646 +vn -0.2381 0.9664 -0.0968 +vn -0.4272 0.8599 -0.2793 +vn -0.1865 0.9808 0.0565 +vn -0.3136 0.9338 -0.1723 +vn -0.3883 0.9155 -0.1053 +vn -0.1440 0.9861 0.0824 +vn -0.3543 0.8817 -0.3117 +vn -0.3238 0.9205 0.2190 +vn -0.3052 0.9454 0.1145 +vn -0.3685 0.9232 0.1089 +vn -0.3645 0.9122 0.1872 +vn -0.2901 0.9340 0.2083 +vn -0.3246 0.9283 0.1813 +vn -0.2628 0.9370 0.2300 +vn -0.3079 0.9287 0.2066 +vn -0.2488 0.9193 0.3048 +vn -0.3085 0.9135 0.2654 +vn -0.2182 0.9497 0.2247 +vn -0.1972 0.9749 0.1036 +vn -0.2305 0.9276 0.2940 +vn -0.1451 0.9489 0.2801 +vn -0.1265 0.9422 0.3103 +vn -0.1307 0.9599 0.2480 +vn -0.1337 0.9815 0.1374 +vn -0.1256 0.9387 0.3211 +vn -0.1062 0.9345 0.3397 +vn -0.0739 0.9443 0.3206 +vn -0.0761 0.9665 0.2453 +vn -0.0414 0.9910 0.1274 +vn -0.0847 0.9399 0.3308 +vn -0.0950 0.9325 0.3486 +vn -0.1099 0.9371 0.3314 +vn -0.4088 0.9066 0.1049 +vn -0.3682 0.8845 0.2865 +vn -0.3582 0.8868 0.2919 +vn -0.2935 0.9033 0.3128 +vn -0.1054 0.9422 0.3179 +vn -0.3541 0.9246 0.1406 +vn -0.2176 0.9144 0.3413 +vn -0.2861 0.9468 0.1474 +vn -0.1361 0.9293 0.3432 +vn -0.2868 0.9343 0.2119 +vn -0.0748 0.9416 0.3282 +vn -0.2192 0.8485 0.4816 +vn -0.2120 0.8838 0.4170 +vn -0.2766 0.8716 0.4047 +vn -0.2480 0.8430 0.4773 +vn -0.2071 0.8243 0.5270 +vn -0.3075 0.7699 0.5592 +vn -0.2732 0.7418 0.6124 +vn -0.3440 0.7039 0.6214 +vn -0.2916 0.6943 0.6580 +vn -0.3837 0.6411 0.6647 +vn -0.2135 0.8431 0.4936 +vn -0.1524 0.9044 0.3987 +vn -0.1400 0.8317 0.5373 +vn -0.1717 0.7707 0.6136 +vn -0.1775 0.7327 0.6570 +vn -0.1151 0.8697 0.4801 +vn -0.1106 0.9176 0.3817 +vn -0.1319 0.8173 0.5610 +vn -0.0973 0.7934 0.6009 +vn -0.1207 0.7441 0.6571 +vn -0.0552 0.8771 0.4771 +vn -0.0955 0.9174 0.3864 +vn -0.0844 0.8210 0.5646 +vn -0.0558 0.7945 0.6047 +vn -0.0656 0.7463 0.6624 +vn -0.3131 0.8738 0.3721 +vn -0.3922 0.6311 0.6692 +vn -0.4716 0.5307 0.7042 +vn -0.4261 0.5763 0.6973 +vn -0.0199 0.6738 0.7386 +vn -0.3298 0.8094 0.4859 +vn -0.3406 0.6081 0.7171 +vn -0.3406 0.7552 0.5601 +vn -0.2096 0.6469 0.7332 +vn -0.3718 0.6841 0.6275 +vn -0.1069 0.6719 0.7329 +vn -0.3315 0.3929 0.8578 +vn -0.2949 0.5397 0.7885 +vn -0.4474 0.4638 0.7647 +vn -0.3758 0.3903 0.8405 +vn -0.3160 0.3687 0.8742 +vn -0.3440 0.3805 0.8584 +vn -0.2293 0.3441 0.9105 +vn -0.3141 0.2879 0.9047 +vn -0.2755 0.1541 0.9489 +vn -0.2664 0.1860 0.9458 +vn -0.2247 0.4625 0.8576 +vn -0.1730 0.5853 0.7921 +vn -0.2078 0.3977 0.8937 +vn -0.1619 0.3614 0.9182 +vn -0.1466 0.2600 0.9544 +vn -0.1040 0.4897 0.8656 +vn -0.0868 0.6003 0.7950 +vn -0.0710 0.4303 0.8999 +vn -0.0662 0.3766 0.9240 +vn -0.0143 0.3185 0.9478 +vn 0.0091 0.4969 0.8678 +vn -0.0113 0.5984 0.8011 +vn 0.0405 0.4274 0.9032 +vn 0.1002 0.4172 0.9033 +vn 0.0718 0.3324 0.9404 +vn -0.5070 0.4320 0.7458 +vn -0.2213 0.2804 0.9340 +vn -0.0141 0.4870 0.8733 +vn -0.1000 0.3579 0.9284 +vn 0.0903 0.3199 0.9431 +vn -0.3543 0.4789 0.8032 +vn -0.2647 0.1430 0.9537 +vn -0.3270 0.3926 0.8596 +vn -0.1718 0.2008 0.9645 +vn -0.2937 0.4122 0.8625 +vn 0.0024 0.3012 0.9536 +vn -0.0019 -0.9990 0.0438 +vn -0.1527 -0.9803 0.1251 +vn -0.1760 -0.9838 0.0337 +vn 0.0215 -0.9993 -0.0321 +vn -0.1727 -0.9815 -0.0823 +vn -0.0149 -0.9979 -0.0623 +vn -0.1864 -0.9751 -0.1203 +vn -0.0591 -0.9917 -0.1138 +vn -0.1404 -0.9790 -0.1478 +vn -0.0753 -0.9813 -0.1773 +vn -0.3236 -0.9240 0.2038 +vn -0.3543 -0.9302 0.0957 +vn -0.3239 -0.9456 0.0290 +vn -0.2580 -0.9661 -0.0084 +vn -0.1800 -0.9825 -0.0478 +vn -0.4624 -0.8298 0.3123 +vn -0.4343 -0.8798 0.1932 +vn -0.3859 -0.9052 0.1782 +vn -0.3259 -0.9409 0.0925 +vn -0.3093 -0.9483 0.0710 +vn -0.5230 -0.7033 0.4816 +vn -0.4912 -0.7876 0.3722 +vn -0.4507 -0.8467 0.2827 +vn -0.3997 -0.9010 0.1689 +vn -0.3572 -0.9292 0.0950 +vn 0.0829 -0.9965 0.0105 +vn -0.0503 -0.9925 0.1117 +vn 0.0847 -0.9964 -0.0078 +vn -0.0643 -0.9792 -0.1926 +vn -0.0281 -0.9896 -0.1408 +vn 0.0102 -0.9899 -0.1417 +vn -0.3164 -0.9485 0.0132 +vn -0.3437 -0.9375 0.0539 +vn -0.3601 -0.9176 0.1684 +vn -0.5160 -0.6915 0.5054 +vn -0.5128 -0.4555 0.7277 +vn -0.5290 -0.6574 0.5367 +vn 0.0812 -0.9962 -0.0315 +vn -0.1020 -0.9832 -0.1517 +vn -0.4550 -0.8377 0.3020 +vn -0.4109 -0.8299 0.3774 +vn 0.0666 -0.9965 -0.0506 +vn -0.1265 -0.9859 -0.1091 +vn -0.4925 -0.7867 0.3722 +vn -0.2982 -0.9015 0.3137 +vn 0.0555 -0.9936 -0.0986 +vn -0.2587 -0.9651 -0.0409 +vn -0.5303 -0.7050 0.4710 +vn -0.1724 -0.9599 0.2208 +vn -0.0981 -0.9835 -0.1520 +vn -0.0830 -0.9787 -0.1876 +vn -0.1403 -0.9794 -0.1452 +vn -0.1176 -0.9821 -0.1474 +vn -0.1474 -0.9716 -0.1853 +vn -0.0528 -0.9717 -0.2302 +vn -0.1333 -0.9405 -0.3126 +vn -0.0123 -0.9495 -0.3136 +vn -0.1312 -0.9035 -0.4079 +vn -0.0476 -0.9216 -0.3853 +vn -0.1154 -0.9778 -0.1749 +vn -0.0877 -0.9715 -0.2202 +vn -0.1193 -0.9668 -0.2258 +vn -0.1820 -0.9379 -0.2952 +vn -0.1699 -0.9102 -0.3776 +vn -0.2235 -0.9676 -0.1179 +vn -0.1785 -0.9740 -0.1393 +vn -0.1245 -0.9630 -0.2391 +vn -0.1124 -0.9264 -0.3595 +vn -0.1707 -0.9119 -0.3732 +vn -0.3330 -0.9426 -0.0238 +vn -0.3108 -0.9474 -0.0760 +vn -0.3120 -0.9397 -0.1400 +vn -0.2441 -0.9232 -0.2968 +vn -0.1854 -0.8891 -0.4184 +vn -0.0531 -0.9926 -0.1094 +vn -0.1125 -0.9101 -0.3989 +vn 0.0141 -0.9389 -0.3438 +vn 0.0669 -0.9427 -0.3268 +vn -0.2695 -0.8412 -0.4688 +vn -0.2509 -0.8628 -0.4388 +vn -0.3028 -0.8748 -0.3782 +vn -0.3650 -0.9306 -0.0264 +vn -0.0298 -0.9800 -0.1970 +vn -0.1312 -0.8976 -0.4208 +vn -0.3813 -0.8976 -0.2210 +vn 0.0455 -0.9495 -0.3104 +vn -0.1225 -0.8988 -0.4210 +vn -0.3865 -0.9132 -0.1296 +vn 0.0781 -0.9449 -0.3178 +vn -0.1997 -0.8955 -0.3977 +vn -0.3800 -0.9232 -0.0574 +vn -0.1521 -0.9167 -0.3696 +vn -0.1548 -0.9089 -0.3872 +vn -0.1897 -0.8888 -0.4172 +vn -0.0895 -0.8857 -0.4555 +vn -0.1535 -0.8462 -0.5102 +vn -0.0476 -0.8351 -0.5480 +vn -0.0621 -0.7840 -0.6176 +vn -0.0170 -0.7936 -0.6082 +vn -0.1535 -0.6949 -0.7026 +vn -0.0532 -0.7304 -0.6810 +vn -0.1273 -0.9048 -0.4063 +vn -0.1548 -0.8819 -0.4453 +vn -0.2175 -0.8408 -0.4957 +vn -0.2075 -0.7686 -0.6052 +vn -0.2077 -0.6644 -0.7179 +vn -0.2052 -0.8902 -0.4067 +vn -0.1788 -0.8674 -0.4644 +vn -0.2052 -0.8159 -0.5406 +vn -0.2994 -0.7471 -0.5934 +vn -0.2826 -0.6501 -0.7053 +vn -0.3242 -0.8492 -0.4169 +vn -0.3321 -0.8300 -0.4481 +vn -0.2820 -0.7784 -0.5608 +vn -0.3269 -0.7137 -0.6195 +vn -0.3536 -0.6243 -0.6965 +vn -0.0099 -0.9202 -0.3912 +vn -0.1006 -0.6335 -0.7672 +vn -0.0492 -0.6626 -0.7474 +vn 0.0130 -0.7378 -0.6749 +vn -0.3754 -0.5250 -0.7639 +vn -0.3437 -0.5348 -0.7719 +vn -0.3901 -0.6125 -0.6875 +vn -0.3401 -0.8283 -0.4453 +vn 0.0181 -0.8707 -0.4915 +vn -0.2048 -0.6033 -0.7707 +vn -0.3679 -0.6860 -0.6278 +vn 0.0100 -0.8313 -0.5557 +vn -0.2266 -0.5814 -0.7814 +vn -0.3581 -0.7557 -0.5483 +vn 0.0133 -0.7963 -0.6047 +vn -0.2469 -0.5614 -0.7899 +vn -0.4150 -0.8030 -0.4279 +vn -0.1535 -0.5650 -0.8107 +vn -0.2085 -0.5266 -0.8242 +vn -0.2722 -0.4416 -0.8549 +vn -0.2235 -0.4789 -0.8489 +vn -0.2807 -0.3585 -0.8904 +vn -0.1991 -0.3787 -0.9039 +vn -0.2994 -0.3464 -0.8891 +vn -0.2746 -0.3791 -0.8837 +vn -0.3516 -0.3561 -0.8658 +vn -0.3019 -0.3534 -0.8854 +vn -0.2772 -0.4938 -0.8242 +vn -0.2942 -0.4093 -0.8637 +vn -0.3020 -0.3470 -0.8879 +vn -0.3098 -0.3210 -0.8950 +vn -0.3725 -0.3377 -0.8644 +vn -0.2883 -0.4645 -0.8373 +vn -0.3291 -0.3855 -0.8620 +vn -0.3251 -0.3358 -0.8841 +vn -0.3131 -0.3013 -0.9007 +vn -0.3791 -0.3195 -0.8685 +vn -0.3314 -0.4230 -0.8433 +vn -0.3587 -0.3559 -0.8629 +vn -0.3709 -0.3161 -0.8732 +vn -0.3390 -0.2858 -0.8963 +vn -0.2808 -0.3823 -0.8803 +vn -0.0757 -0.5988 -0.7973 +vn -0.1522 -0.3072 -0.9394 +vn -0.0941 -0.2954 -0.9507 +vn -0.1393 -0.3394 -0.9303 +vn -0.6752 0.7347 -0.0660 +vn -0.5392 -0.2043 -0.8171 +vn -0.2548 -0.3521 -0.9006 +vn -0.3632 -0.4287 -0.8272 +vn -0.1069 -0.4981 -0.8605 +vn -0.2352 -0.3403 -0.9104 +vn -0.3654 -0.2867 -0.8856 +vn -0.1292 -0.4108 -0.9025 +vn -0.2898 -0.3668 -0.8840 +vn -0.3957 -0.3097 -0.8646 +vn -0.1969 -0.4065 -0.8922 +vn -0.3475 -0.3549 -0.8679 +vn -0.3817 -0.3309 -0.8630 +vn 0.4214 -0.7509 0.5085 +vn 0.3315 -0.8854 0.3260 +vn 0.3286 -0.9152 0.2335 +vn 0.3871 -0.8460 0.3668 +vn 0.2697 -0.9577 0.1002 +vn 0.3576 -0.9058 0.2271 +vn 0.2175 -0.9757 0.0252 +vn 0.3588 -0.9291 0.0899 +vn 0.2437 -0.9687 -0.0466 +vn 0.3630 -0.9310 -0.0387 +vn 0.2561 -0.9498 0.1799 +vn 0.2213 -0.9660 0.1336 +vn 0.2391 -0.9706 0.0262 +vn 0.2093 -0.9775 -0.0274 +vn 0.1800 -0.9822 -0.0539 +vn 0.2166 -0.9728 0.0828 +vn 0.1556 -0.9858 0.0631 +vn 0.1461 -0.9893 0.0036 +vn 0.1742 -0.9831 -0.0563 +vn 0.1693 -0.9820 -0.0835 +vn 0.1321 -0.9910 0.0217 +vn 0.1070 -0.9942 -0.0119 +vn 0.0788 -0.9962 -0.0372 +vn 0.0662 -0.9962 -0.0558 +vn 0.0659 -0.9930 -0.0976 +vn 0.4445 -0.6324 0.6344 +vn 0.4395 -0.7446 0.5024 +vn 0.4189 -0.7360 0.5318 +vn 0.3595 -0.9312 -0.0611 +vn 0.3861 -0.9205 -0.0602 +vn 0.3741 -0.9270 -0.0274 +vn 0.0496 -0.9914 -0.1212 +vn 0.1536 -0.9874 0.0374 +vn 0.4170 -0.8146 0.4031 +vn 0.2818 -0.9565 -0.0759 +vn 0.2391 -0.9662 0.0965 +vn 0.4228 -0.8618 0.2802 +vn 0.1804 -0.9818 -0.0589 +vn 0.3061 -0.9364 0.1717 +vn 0.3937 -0.9126 0.1099 +vn 0.1402 -0.9867 -0.0826 +vn 0.3477 -0.8856 0.3080 +vn 0.3672 -0.9234 -0.1121 +vn 0.3159 -0.9405 -0.1254 +vn 0.3259 -0.9203 -0.2165 +vn 0.3613 -0.9146 -0.1816 +vn 0.2857 -0.9369 -0.2015 +vn 0.3287 -0.9271 -0.1799 +vn 0.2678 -0.9343 -0.2355 +vn 0.3050 -0.9299 -0.2056 +vn 0.2451 -0.9206 -0.3039 +vn 0.2972 -0.9182 -0.2617 +vn 0.2016 -0.9732 -0.1104 +vn 0.2262 -0.9462 -0.2313 +vn 0.2290 -0.9288 -0.2914 +vn 0.1458 -0.9501 -0.2759 +vn 0.1312 -0.9421 -0.3087 +vn 0.1310 -0.9821 -0.1355 +vn 0.1309 -0.9579 -0.2556 +vn 0.1222 -0.9402 -0.3178 +vn 0.1086 -0.9361 -0.3344 +vn 0.0747 -0.9453 -0.3175 +vn 0.0410 -0.9912 -0.1255 +vn 0.0784 -0.9639 -0.2543 +vn 0.0851 -0.9384 -0.3348 +vn 0.0896 -0.9368 -0.3382 +vn 0.1080 -0.9386 -0.3276 +vn 0.4055 -0.9075 -0.1098 +vn 0.2904 -0.9049 -0.3112 +vn 0.3450 -0.8938 -0.2864 +vn 0.3627 -0.8876 -0.2839 +vn 0.1022 -0.9429 -0.3171 +vn 0.3553 -0.9244 -0.1385 +vn 0.2130 -0.9180 -0.3346 +vn 0.2870 -0.9469 -0.1453 +vn 0.1389 -0.9292 -0.3425 +vn 0.2791 -0.9379 -0.2061 +vn 0.0778 -0.9418 -0.3271 +vn 0.2693 -0.8738 -0.4049 +vn 0.2082 -0.8845 -0.4175 +vn 0.2115 -0.8492 -0.4839 +vn 0.2492 -0.8416 -0.4792 +vn 0.1951 -0.8304 -0.5219 +vn 0.3108 -0.7726 -0.5536 +vn 0.2684 -0.7447 -0.6111 +vn 0.3609 -0.6934 -0.6236 +vn 0.3036 -0.6867 -0.6605 +vn 0.4045 -0.6264 -0.6663 +vn 0.1525 -0.9030 -0.4017 +vn 0.2072 -0.8440 -0.4947 +vn 0.1365 -0.8342 -0.5344 +vn 0.1461 -0.7821 -0.6058 +vn 0.1667 -0.7337 -0.6587 +vn 0.1140 -0.9155 -0.3858 +vn 0.1220 -0.8672 -0.4828 +vn 0.1274 -0.8172 -0.5621 +vn 0.0828 -0.7990 -0.5957 +vn 0.1117 -0.7447 -0.6579 +vn 0.0922 -0.9152 -0.3923 +vn 0.0510 -0.8748 -0.4818 +vn 0.0798 -0.8209 -0.5655 +vn 0.0624 -0.7951 -0.6033 +vn 0.0574 -0.7502 -0.6587 +vn 0.3002 -0.8773 -0.3744 +vn 0.4409 -0.5686 -0.6945 +vn 0.4674 -0.5390 -0.7007 +vn 0.4046 -0.6187 -0.6735 +vn 0.0178 -0.6778 -0.7350 +vn 0.3306 -0.8050 -0.4927 +vn 0.3464 -0.6011 -0.7202 +vn 0.3573 -0.7484 -0.5588 +vn 0.1855 -0.6502 -0.7367 +vn 0.3830 -0.6765 -0.6291 +vn 0.0925 -0.6749 -0.7321 +vn 0.4499 -0.4597 -0.7657 +vn 0.2946 -0.5404 -0.7882 +vn 0.3450 -0.3828 -0.8570 +vn 0.3800 -0.3863 -0.8405 +vn 0.3231 -0.3564 -0.8767 +vn 0.3337 -0.3883 -0.8590 +vn 0.2370 -0.3382 -0.9107 +vn 0.2998 -0.3039 -0.9043 +vn 0.2534 -0.1720 -0.9519 +vn 0.2969 -0.1386 -0.9448 +vn 0.1650 -0.5888 -0.7913 +vn 0.2231 -0.4707 -0.8536 +vn 0.2291 -0.3826 -0.8951 +vn 0.1796 -0.3395 -0.9233 +vn 0.1337 -0.2669 -0.9544 +vn 0.0986 -0.6034 -0.7913 +vn 0.1061 -0.5098 -0.8537 +vn 0.0980 -0.4150 -0.9045 +vn 0.0625 -0.3657 -0.9286 +vn 0.0477 -0.2977 -0.9535 +vn 0.0265 -0.6029 -0.7974 +vn -0.0130 -0.5180 -0.8553 +vn -0.0455 -0.4280 -0.9026 +vn -0.0799 -0.3988 -0.9135 +vn -0.0072 -0.3141 -0.9494 +vn 0.4973 -0.4383 -0.7488 +vn 0.1107 -0.3377 -0.9347 +vn -0.2958 -0.7954 -0.5291 +vn 0.2839 -0.2050 -0.9367 +vn -0.0463 -0.3020 -0.9522 +vn 0.3303 -0.5006 -0.8002 +vn 0.2904 -0.0970 -0.9520 +vn 0.3262 -0.3896 -0.8613 +vn 0.1014 -0.2535 -0.9620 +vn 0.3050 -0.3963 -0.8660 +vn 0.0316 -0.2924 -0.9558 +vn 0.0138 -0.0828 0.9965 +vn 0.0092 -0.0685 0.9976 +vn 0.0036 -0.0675 0.9977 +vn 0.0132 -0.0752 0.9971 +vn -0.8464 0.3186 0.4267 +vn -0.8162 0.3976 0.4192 +vn -0.8184 0.3902 0.4220 +vn -0.8462 0.3105 0.4331 +vn -0.3347 0.7643 0.5511 +vn -0.2554 0.8109 0.5264 +vn -0.2595 0.8018 0.5383 +vn -0.3420 0.7503 0.5657 +vn 0.4648 0.4711 0.7497 +vn 0.4099 0.4189 0.8103 +vn 0.4154 0.4557 0.7873 +vn 0.4697 0.4817 0.7398 +vn -0.7695 0.4189 0.4821 +vn -0.7682 0.4079 0.4934 +vn 0.2441 0.2466 0.9379 +vn 0.2425 0.3048 0.9210 +vn -0.6557 0.5342 0.5335 +vn -0.6598 0.5118 0.5501 +vn 0.0575 0.1383 0.9887 +vn 0.0419 0.1995 0.9790 +vn -0.5088 0.6686 0.5422 +vn -0.5181 0.6480 0.5584 +vn -0.0212 -0.0147 0.9997 +vn -0.0291 0.0232 0.9993 +vn -0.9804 0.1952 0.0254 +vn -0.9720 0.2320 0.0368 +vn -0.9721 0.2320 0.0350 +vn -0.9794 0.2003 0.0268 +vn -0.8555 0.3179 0.4086 +vn -0.8549 0.3203 0.4082 +vn -0.9742 0.1819 0.1337 +vn -0.9739 0.1752 0.1446 +vn -0.9568 0.2032 0.2078 +vn -0.9599 0.1861 0.2097 +vn -0.8772 0.3718 0.3037 +vn -0.8795 0.3598 0.3115 +vn -0.8366 0.5365 0.1103 +vn -0.8830 0.4583 0.1020 +vn -0.8805 0.4620 0.1060 +vn -0.8385 0.5338 0.1100 +vn -0.9337 0.3495 0.0775 +vn -0.9314 0.3563 0.0745 +vn -0.9231 0.3811 0.0514 +vn -0.9220 0.3833 0.0545 +vn -0.9209 0.3877 0.0391 +vn -0.9202 0.3894 0.0400 +vn -0.9361 0.3515 0.0148 +vn -0.9358 0.3521 0.0149 +vn 0.1424 0.8876 -0.4381 +vn 0.0161 0.9279 -0.3724 +vn -0.0377 0.9189 -0.3926 +vn 0.0854 0.8834 -0.4607 +vn -0.5535 0.8306 0.0613 +vn -0.6186 0.7832 -0.0628 +vn -0.6100 0.7902 -0.0592 +vn -0.6037 0.7956 0.0514 +vn -0.6393 0.7687 -0.0205 +vn -0.7131 0.7006 -0.0241 +vn -0.8451 0.5344 0.0134 +vn -0.8439 0.5363 0.0141 +vn -0.1681 0.9341 -0.3149 +vn -0.1982 0.9260 -0.3214 +vn -0.6709 0.7415 -0.0003 +vn -0.6658 0.7462 0.0013 +vn -0.3585 0.9053 -0.2279 +vn -0.4144 0.8809 -0.2289 +vn -0.7759 0.6306 -0.0206 +vn -0.7706 0.6368 -0.0242 +vn -0.5325 0.8363 -0.1311 +vn -0.5729 0.8094 -0.1288 +vn -0.7811 0.6213 0.0627 +vn -0.7799 0.6226 0.0638 +vn 0.3722 0.7193 0.5865 +vn 0.4683 0.6444 0.6045 +vn 0.4491 0.6635 0.5984 +vn 0.3596 0.7329 0.5775 +vn -0.2308 0.3835 0.8942 +vn -0.3751 0.4350 0.8186 +vn -0.3503 0.4195 0.8375 +vn -0.2045 0.3667 0.9076 +vn 0.7784 0.3927 0.4898 +vn 0.8316 0.3149 0.4576 +vn 0.8294 0.3184 0.4589 +vn 0.7718 0.4038 0.4912 +vn -0.0349 -0.0934 0.9950 +vn -0.0416 -0.0879 0.9953 +vn 0.6160 0.5097 0.6007 +vn 0.6083 0.5231 0.5969 +vn -0.0451 -0.0909 0.9948 +vn -0.0292 -0.1068 0.9938 +vn 0.6702 0.5116 0.5377 +vn 0.6688 0.5161 0.5351 +vn -0.1163 0.0833 0.9897 +vn -0.0738 0.0447 0.9963 +vn 0.7370 0.4443 0.5093 +vn 0.7307 0.4538 0.5100 +vn -0.1609 0.2886 0.9438 +vn -0.1239 0.2610 0.9573 +vn 0.8403 0.3623 0.4033 +vn 0.8432 0.3641 0.3954 +vn 0.9310 0.3290 0.1580 +vn 0.8852 0.4494 0.1198 +vn 0.8858 0.4463 0.1274 +vn 0.9366 0.3153 0.1526 +vn 0.9048 0.3116 0.2901 +vn 0.8954 0.3315 0.2971 +vn 0.9829 0.0951 0.1575 +vn 0.9799 0.1049 0.1697 +vn 0.9714 0.1963 0.1337 +vn 0.9745 0.1833 0.1296 +vn 0.9270 0.3750 0.0099 +vn 0.9247 0.3806 0.0138 +vn 0.8662 0.4789 0.1427 +vn 0.8606 0.4954 0.1182 +vn 0.8631 0.4901 0.1219 +vn 0.8674 0.4783 0.1370 +vn 0.9348 0.3553 -0.0001 +vn 0.9340 0.3572 0.0006 +vn 0.9440 0.3299 -0.0005 +vn 0.9447 0.3279 -0.0020 +vn 0.9092 0.4147 0.0379 +vn 0.9125 0.4077 0.0338 +vn 0.8218 0.5633 0.0864 +vn 0.8225 0.5620 0.0879 +vn 0.6795 0.7210 -0.1355 +vn 0.4979 0.6436 -0.5813 +vn 0.4444 0.6461 -0.6205 +vn 0.6777 0.7285 -0.1000 +vn 0.4832 0.7878 -0.3820 +vn 0.3797 0.7767 -0.5025 +vn 0.2693 0.8498 -0.4531 +vn 0.2523 0.8519 -0.4588 +vn 0.8101 0.5856 0.0292 +vn 0.8098 0.5856 0.0348 +vn 0.4745 0.8313 -0.2894 +vn 0.4488 0.8317 -0.3268 +vn 0.7908 0.6103 -0.0462 +vn 0.7900 0.6116 -0.0441 +vn 0.4224 0.8364 -0.3493 +vn 0.4557 0.8359 -0.3061 +vn 0.7363 0.6719 -0.0795 +vn 0.7386 0.6695 -0.0796 +vn 0.3382 0.8288 -0.4458 +vn 0.3633 0.8336 -0.4160 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_01 +s 1 +f 651/326/799 652/327/800 653/328/801 654/329/802 +f 655/330/803 651/326/799 654/329/802 656/331/804 +f 657/332/805 655/330/803 656/331/804 658/333/806 +f 659/334/807 657/332/805 658/333/806 660/335/808 +f 661/336/809 662/337/810 652/327/800 651/326/799 +f 663/338/811 661/336/809 651/326/799 655/330/803 +f 664/339/812 663/338/811 655/330/803 657/332/805 +f 665/340/813 664/339/812 657/332/805 659/334/807 +f 666/341/814 667/342/815 662/337/810 661/336/809 +f 668/343/816 666/341/814 661/336/809 663/338/811 +f 669/344/817 668/343/816 663/338/811 664/339/812 +f 670/345/818 669/344/817 664/339/812 665/340/813 +f 671/346/819 672/347/820 667/342/815 666/341/814 +f 673/348/821 671/346/819 666/341/814 668/343/816 +f 674/349/822 673/348/821 668/343/816 669/344/817 +f 675/350/823 674/349/822 669/344/817 670/345/818 +f 653/328/801 676/351/824 677/352/825 678/353/826 +f 679/354/827 680/355/828 681/356/829 660/335/808 +f 675/350/823 682/357/830 683/358/831 684/359/832 +f 685/360/833 686/361/834 687/362/835 672/347/820 +f 654/329/802 653/328/801 678/353/826 688/363/836 +f 660/335/808 681/356/829 689/364/837 659/334/807 +f 674/349/822 675/350/823 684/359/832 690/365/838 +f 672/347/820 687/362/835 691/366/839 667/342/815 +f 656/331/804 654/329/802 688/363/836 692/367/840 +f 659/334/807 689/364/837 693/368/841 665/340/813 +f 673/348/821 674/349/822 690/365/838 694/369/842 +f 667/342/815 691/366/839 695/370/843 662/337/810 +f 658/333/806 656/331/804 692/367/840 696/371/844 +f 665/340/813 693/368/841 697/372/845 670/345/818 +f 671/346/819 673/348/821 694/369/842 698/373/846 +f 662/337/810 695/370/843 699/374/847 652/327/800 +f 660/335/808 658/333/806 696/371/844 679/354/827 +f 670/345/818 697/372/845 682/357/830 675/350/823 +f 672/347/820 671/346/819 698/373/846 685/360/833 +f 652/327/800 699/374/847 676/351/824 653/328/801 +f 700/375/848 701/376/849 702/377/850 703/378/851 +f 704/379/852 700/375/848 703/378/851 705/380/853 +f 706/381/854 704/379/852 705/380/853 707/382/855 +f 708/383/856 706/381/854 707/382/855 709/384/857 +f 710/385/858 711/386/859 701/376/849 700/375/848 +f 712/387/860 710/385/858 700/375/848 704/379/852 +f 713/388/861 712/387/860 704/379/852 706/381/854 +f 714/389/862 713/388/861 706/381/854 708/383/856 +f 715/390/863 716/391/864 711/386/859 710/385/858 +f 717/392/865 715/390/863 710/385/858 712/387/860 +f 718/393/866 717/392/865 712/387/860 713/388/861 +f 719/394/867 718/393/866 713/388/861 714/389/862 +f 720/395/868 721/396/869 716/391/864 715/390/863 +f 722/397/870 720/395/868 715/390/863 717/392/865 +f 723/398/871 722/397/870 717/392/865 718/393/866 +f 724/399/872 723/398/871 718/393/866 719/394/867 +f 702/377/850 681/356/829 680/355/828 725/400/873 +f 726/401/874 727/402/875 728/403/876 709/384/857 +f 724/399/872 729/404/877 730/405/878 731/406/879 +f 732/407/880 683/358/831 682/357/830 721/396/869 +f 703/378/851 702/377/850 725/400/873 733/408/881 +f 709/384/857 728/403/876 734/409/882 708/383/856 +f 723/398/871 724/399/872 731/406/879 735/410/883 +f 721/396/869 682/357/830 697/372/845 716/391/864 +f 705/380/853 703/378/851 733/408/881 736/411/884 +f 708/383/856 734/409/882 737/412/885 714/389/862 +f 722/397/870 723/398/871 735/410/883 738/413/886 +f 716/391/864 697/372/845 693/368/841 711/386/859 +f 707/382/855 705/380/853 736/411/884 739/414/887 +f 714/389/862 737/412/885 740/415/888 719/394/867 +f 720/395/868 722/397/870 738/413/886 741/416/889 +f 711/386/859 693/368/841 689/364/837 701/376/849 +f 709/384/857 707/382/855 739/414/887 726/401/874 +f 719/394/867 740/415/888 729/404/877 724/399/872 +f 721/396/869 720/395/868 741/416/889 732/407/880 +f 701/376/849 689/364/837 681/356/829 702/377/850 +f 742/417/890 743/418/891 744/419/892 745/420/893 +f 746/421/894 742/417/890 745/420/893 747/422/895 +f 748/423/896 746/421/894 747/422/895 749/424/897 +f 750/425/898 748/423/896 749/424/897 751/426/899 +f 752/427/900 753/428/901 743/418/891 742/417/890 +f 754/429/902 752/427/900 742/417/890 746/421/894 +f 755/430/903 754/429/902 746/421/894 748/423/896 +f 756/431/904 755/430/903 748/423/896 750/425/898 +f 757/432/905 758/433/906 753/428/901 752/427/900 +f 759/434/907 757/432/905 752/427/900 754/429/902 +f 760/435/908 759/434/907 754/429/902 755/430/903 +f 761/436/909 760/435/908 755/430/903 756/431/904 +f 762/437/910 763/438/911 758/433/906 757/432/905 +f 764/439/912 762/437/910 757/432/905 759/434/907 +f 765/440/913 764/439/912 759/434/907 760/435/908 +f 766/441/914 765/440/913 760/435/908 761/436/909 +f 744/419/892 728/403/876 727/402/875 767/442/915 +f 768/443/916 769/444/917 770/445/918 751/426/899 +f 766/441/914 771/446/919 772/447/920 773/448/921 +f 774/449/922 730/405/878 729/404/877 763/438/911 +f 745/420/893 744/419/892 767/442/915 775/450/923 +f 751/426/899 770/445/918 776/451/924 750/425/898 +f 765/440/913 766/441/914 773/448/921 777/452/925 +f 763/438/911 729/404/877 740/415/888 758/433/906 +f 747/422/895 745/420/893 775/450/923 778/453/926 +f 750/425/898 776/451/924 779/454/927 756/431/904 +f 764/439/912 765/440/913 777/452/925 780/455/928 +f 758/433/906 740/415/888 737/412/885 753/428/901 +f 749/424/897 747/422/895 778/453/926 781/456/929 +f 756/431/904 779/454/927 782/457/930 761/436/909 +f 762/437/910 764/439/912 780/455/928 783/458/931 +f 753/428/901 737/412/885 734/409/882 743/418/891 +f 751/426/899 749/424/897 781/456/929 768/443/916 +f 761/436/909 782/457/930 771/446/919 766/441/914 +f 763/438/911 762/437/910 783/458/931 774/449/922 +f 743/418/891 734/409/882 728/403/876 744/419/892 +f 784/459/932 785/460/933 786/461/934 787/462/935 +f 788/463/936 784/459/932 787/462/935 789/464/937 +f 790/465/938 788/463/936 789/464/937 791/466/939 +f 792/467/940 790/465/938 791/466/939 793/468/941 +f 794/469/942 795/470/943 785/460/933 784/459/932 +f 796/471/944 794/469/942 784/459/932 788/463/936 +f 797/472/945 796/471/944 788/463/936 790/465/938 +f 798/473/946 797/472/945 790/465/938 792/467/940 +f 799/474/947 800/475/948 795/470/943 794/469/942 +f 801/476/949 799/474/947 794/469/942 796/471/944 +f 802/477/950 801/476/949 796/471/944 797/472/945 +f 803/478/951 802/477/950 797/472/945 798/473/946 +f 804/479/952 805/480/953 800/475/948 799/474/947 +f 806/481/954 804/479/952 799/474/947 801/476/949 +f 807/482/955 806/481/954 801/476/949 802/477/950 +f 808/483/956 807/482/955 802/477/950 803/478/951 +f 786/461/934 770/445/918 769/444/917 809/484/957 +f 810/485/958 811/486/959 812/487/960 793/468/941 +f 808/483/956 813/488/961 814/489/962 815/490/963 +f 816/491/964 772/447/920 771/446/919 805/480/953 +f 787/462/935 786/461/934 809/484/957 817/492/965 +f 793/468/941 812/487/960 818/493/966 792/467/940 +f 807/482/955 808/483/956 815/490/963 819/494/967 +f 805/480/953 771/446/919 782/457/930 800/475/948 +f 789/464/937 787/462/935 817/492/965 820/495/968 +f 792/467/940 818/493/966 821/496/969 798/473/946 +f 806/481/954 807/482/955 819/494/967 822/497/970 +f 800/475/948 782/457/930 779/454/927 795/470/943 +f 791/466/939 789/464/937 820/495/968 823/498/971 +f 798/473/946 821/496/969 824/499/972 803/478/951 +f 804/479/952 806/481/954 822/497/970 825/500/973 +f 795/470/943 779/454/927 776/451/924 785/460/933 +f 793/468/941 791/466/939 823/498/971 810/485/958 +f 803/478/951 824/499/972 813/488/961 808/483/956 +f 805/480/953 804/479/952 825/500/973 816/491/964 +f 785/460/933 776/451/924 770/445/918 786/461/934 +f 826/501/974 827/502/975 828/503/976 829/504/977 +f 830/505/978 826/501/974 829/504/977 831/506/979 +f 832/507/980 830/505/978 831/506/979 833/508/981 +f 834/509/982 832/507/980 833/508/981 835/510/983 +f 836/511/984 837/512/985 827/502/975 826/501/974 +f 838/513/986 836/511/984 826/501/974 830/505/978 +f 839/514/987 838/513/986 830/505/978 832/507/980 +f 840/515/988 839/514/987 832/507/980 834/509/982 +f 841/516/989 842/517/990 837/512/985 836/511/984 +f 843/518/991 841/516/989 836/511/984 838/513/986 +f 844/519/992 843/518/991 838/513/986 839/514/987 +f 845/520/993 844/519/992 839/514/987 840/515/988 +f 846/521/994 847/522/995 842/517/990 841/516/989 +f 848/523/996 846/521/994 841/516/989 843/518/991 +f 849/524/997 848/523/996 843/518/991 844/519/992 +f 850/525/998 849/524/997 844/519/992 845/520/993 +f 828/503/976 851/526/999 852/527/1000 853/528/1001 +f 854/529/1002 855/530/1003 856/531/1004 835/510/983 +f 850/525/998 857/532/1005 680/355/828 679/354/827 +f 678/353/826 677/352/825 858/533/1006 847/522/995 +f 829/504/977 828/503/976 853/528/1001 859/534/1007 +f 835/510/983 856/531/1004 860/535/1008 834/509/982 +f 849/524/997 850/525/998 679/354/827 696/371/844 +f 847/522/995 858/533/1006 861/536/1009 842/517/990 +f 831/506/979 829/504/977 859/534/1007 862/537/1010 +f 834/509/982 860/535/1008 863/538/1011 840/515/988 +f 848/523/996 849/524/997 696/371/844 692/367/840 +f 842/517/990 861/536/1009 864/539/1012 837/512/985 +f 833/508/981 831/506/979 862/537/1010 865/540/1013 +f 840/515/988 863/538/1011 866/541/1014 845/520/993 +f 846/521/994 848/523/996 692/367/840 688/363/836 +f 837/512/985 864/539/1012 867/542/1015 827/502/975 +f 835/510/983 833/508/981 865/540/1013 854/529/1002 +f 845/520/993 866/541/1014 857/532/1005 850/525/998 +f 847/522/995 846/521/994 688/363/836 678/353/826 +f 827/502/975 867/542/1015 851/526/999 828/503/976 +f 868/543/1016 869/544/1017 870/545/1018 871/546/1019 +f 872/547/1020 868/543/1016 871/546/1019 873/548/1021 +f 874/549/1022 872/547/1020 873/548/1021 875/550/1023 +f 876/551/1024 874/549/1022 875/550/1023 877/552/1025 +f 878/553/1026 879/554/1027 869/544/1017 868/543/1016 +f 880/555/1028 878/553/1026 868/543/1016 872/547/1020 +f 881/556/1029 880/555/1028 872/547/1020 874/549/1022 +f 882/557/1030 881/556/1029 874/549/1022 876/551/1024 +f 883/558/1031 884/559/1032 879/554/1027 878/553/1026 +f 885/560/1033 883/558/1031 878/553/1026 880/555/1028 +f 886/561/1034 885/560/1033 880/555/1028 881/556/1029 +f 887/562/1035 886/561/1034 881/556/1029 882/557/1030 +f 888/563/1036 889/564/1037 884/559/1032 883/558/1031 +f 890/565/1038 888/563/1036 883/558/1031 885/560/1033 +f 891/566/1039 890/565/1038 885/560/1033 886/561/1034 +f 892/567/1040 891/566/1039 886/561/1034 887/562/1035 +f 870/545/1018 856/531/1004 855/530/1003 893/568/1041 +f 894/569/1042 895/570/1043 896/571/1044 877/552/1025 +f 892/567/1040 897/572/1045 727/402/875 726/401/874 +f 725/400/873 680/355/828 857/532/1005 889/564/1037 +f 871/546/1019 870/545/1018 893/568/1041 898/573/1046 +f 877/552/1025 896/571/1044 899/574/1047 876/551/1024 +f 891/566/1039 892/567/1040 726/401/874 739/414/887 +f 889/564/1037 857/532/1005 866/541/1014 884/559/1032 +f 873/548/1021 871/546/1019 898/573/1046 900/575/1048 +f 876/551/1024 899/574/1047 901/576/1049 882/557/1030 +f 890/565/1038 891/566/1039 739/414/887 736/411/884 +f 884/559/1032 866/541/1014 863/538/1011 879/554/1027 +f 875/550/1023 873/548/1021 900/575/1048 902/577/1050 +f 882/557/1030 901/576/1049 903/578/1051 887/562/1035 +f 888/563/1036 890/565/1038 736/411/884 733/408/881 +f 879/554/1027 863/538/1011 860/535/1008 869/544/1017 +f 877/552/1025 875/550/1023 902/577/1050 894/569/1042 +f 887/562/1035 903/578/1051 897/572/1045 892/567/1040 +f 889/564/1037 888/563/1036 733/408/881 725/400/873 +f 869/544/1017 860/535/1008 856/531/1004 870/545/1018 +f 904/579/1052 905/580/1053 906/581/1054 907/582/1055 +f 908/583/1056 904/579/1052 907/582/1055 909/584/1057 +f 910/585/1058 908/583/1056 909/584/1057 911/586/1059 +f 912/587/1060 910/585/1058 911/586/1059 913/588/1061 +f 914/589/1062 915/590/1063 905/580/1053 904/579/1052 +f 916/591/1064 914/589/1062 904/579/1052 908/583/1056 +f 917/592/1065 916/591/1064 908/583/1056 910/585/1058 +f 918/593/1066 917/592/1065 910/585/1058 912/587/1060 +f 919/594/1067 920/595/1068 915/590/1063 914/589/1062 +f 921/596/1069 919/594/1067 914/589/1062 916/591/1064 +f 922/597/1070 921/596/1069 916/591/1064 917/592/1065 +f 923/598/1071 922/597/1070 917/592/1065 918/593/1066 +f 924/599/1072 925/600/1073 920/595/1068 919/594/1067 +f 926/601/1074 924/599/1072 919/594/1067 921/596/1069 +f 927/602/1075 926/601/1074 921/596/1069 922/597/1070 +f 928/603/1076 927/602/1075 922/597/1070 923/598/1071 +f 906/581/1054 896/571/1044 895/570/1043 929/604/1077 +f 930/605/1078 931/606/1079 932/607/1080 913/588/1061 +f 928/603/1076 933/608/1081 769/444/917 768/443/916 +f 767/442/915 727/402/875 897/572/1045 925/600/1073 +f 907/582/1055 906/581/1054 929/604/1077 934/609/1082 +f 913/588/1061 932/607/1080 935/610/1083 912/587/1060 +f 927/602/1075 928/603/1076 768/443/916 781/456/929 +f 925/600/1073 897/572/1045 903/578/1051 920/595/1068 +f 909/584/1057 907/582/1055 934/609/1082 936/611/1084 +f 912/587/1060 935/610/1083 937/612/1085 918/593/1066 +f 926/601/1074 927/602/1075 781/456/929 778/453/926 +f 920/595/1068 903/578/1051 901/576/1049 915/590/1063 +f 911/586/1059 909/584/1057 936/611/1084 938/613/1086 +f 918/593/1066 937/612/1085 939/614/1087 923/598/1071 +f 924/599/1072 926/601/1074 778/453/926 775/450/923 +f 915/590/1063 901/576/1049 899/574/1047 905/580/1053 +f 913/588/1061 911/586/1059 938/613/1086 930/605/1078 +f 923/598/1071 939/614/1087 933/608/1081 928/603/1076 +f 925/600/1073 924/599/1072 775/450/923 767/442/915 +f 905/580/1053 899/574/1047 896/571/1044 906/581/1054 +f 940/615/1088 941/616/1089 942/617/1090 943/618/1091 +f 944/619/1092 940/615/1088 943/618/1091 945/620/1093 +f 946/621/1094 944/619/1092 945/620/1093 947/622/1095 +f 948/623/1096 946/621/1094 947/622/1095 949/624/1097 +f 950/625/1098 951/626/1099 941/616/1089 940/615/1088 +f 952/627/1100 950/625/1098 940/615/1088 944/619/1092 +f 953/628/1101 952/627/1100 944/619/1092 946/621/1094 +f 954/629/1102 953/628/1101 946/621/1094 948/623/1096 +f 955/630/1103 956/631/1104 951/626/1099 950/625/1098 +f 957/632/1105 955/630/1103 950/625/1098 952/627/1100 +f 958/633/1106 957/632/1105 952/627/1100 953/628/1101 +f 959/634/1107 958/633/1106 953/628/1101 954/629/1102 +f 960/635/1108 961/636/1109 956/631/1104 955/630/1103 +f 962/637/1110 960/635/1108 955/630/1103 957/632/1105 +f 963/638/1111 962/637/1110 957/632/1105 958/633/1106 +f 964/639/1112 963/638/1111 958/633/1106 959/634/1107 +f 942/617/1090 932/607/1080 931/606/1079 965/640/1113 +f 966/641/1114 967/642/1115 968/643/1116 949/624/1097 +f 964/639/1112 969/644/1117 811/486/959 810/485/958 +f 809/484/957 769/444/917 933/608/1081 961/636/1109 +f 943/618/1091 942/617/1090 965/640/1113 970/645/1118 +f 949/624/1097 968/643/1116 971/646/1119 948/623/1096 +f 963/638/1111 964/639/1112 810/485/958 823/498/971 +f 961/636/1109 933/608/1081 939/614/1087 956/631/1104 +f 945/620/1093 943/618/1091 970/645/1118 972/647/1120 +f 948/623/1096 971/646/1119 973/648/1121 954/629/1102 +f 962/637/1110 963/638/1111 823/498/971 820/495/968 +f 956/631/1104 939/614/1087 937/612/1085 951/626/1099 +f 947/622/1095 945/620/1093 972/647/1120 974/649/1122 +f 954/629/1102 973/648/1121 975/650/1123 959/634/1107 +f 960/635/1108 962/637/1110 820/495/968 817/492/965 +f 951/626/1099 937/612/1085 935/610/1083 941/616/1089 +f 949/624/1097 947/622/1095 974/649/1122 966/641/1114 +f 959/634/1107 975/650/1123 969/644/1117 964/639/1112 +f 961/636/1109 960/635/1108 817/492/965 809/484/957 +f 941/616/1089 935/610/1083 932/607/1080 942/617/1090 +f 976/328/1124 977/327/1125 978/326/1126 979/329/1127 +f 979/329/1127 978/326/1126 980/330/1128 981/331/1129 +f 981/331/1129 980/330/1128 982/332/1130 983/333/1131 +f 983/333/1131 982/332/1130 984/334/1132 985/335/1133 +f 977/327/1125 986/337/1134 987/336/1135 978/326/1126 +f 978/326/1126 987/336/1135 988/338/1136 980/330/1128 +f 980/330/1128 988/338/1136 989/339/1137 982/332/1130 +f 982/332/1130 989/339/1137 990/340/1138 984/334/1132 +f 986/337/1134 991/342/1139 992/341/1140 987/336/1135 +f 987/336/1135 992/341/1140 993/343/1141 988/338/1136 +f 988/338/1136 993/343/1141 994/344/1142 989/339/1137 +f 989/339/1137 994/344/1142 995/345/1143 990/340/1138 +f 991/342/1139 996/347/1144 997/346/1145 992/341/1140 +f 992/341/1140 997/346/1145 998/348/1146 993/343/1141 +f 993/343/1141 998/348/1146 999/349/1147 994/344/1142 +f 994/344/1142 999/349/1147 1000/350/1148 995/345/1143 +f 1001/352/1149 1002/351/1150 976/328/1124 1003/353/1151 +f 1004/356/1152 1005/355/1153 1006/354/1154 985/335/1133 +f 1007/358/1155 1008/357/1156 1000/350/1148 1009/359/1157 +f 1010/362/1158 1011/361/1159 1012/360/1160 996/347/1144 +f 1003/353/1151 976/328/1124 979/329/1127 1013/363/1161 +f 1014/364/1162 1004/356/1152 985/335/1133 984/334/1132 +f 1009/359/1157 1000/350/1148 999/349/1147 1015/365/1163 +f 1016/366/1164 1010/362/1158 996/347/1144 991/342/1139 +f 1013/363/1161 979/329/1127 981/331/1129 1017/367/1165 +f 1018/368/1166 1014/364/1162 984/334/1132 990/340/1138 +f 1015/365/1163 999/349/1147 998/348/1146 1019/369/1167 +f 1020/370/1168 1016/366/1164 991/342/1139 986/337/1134 +f 1017/367/1165 981/331/1129 983/333/1131 1021/371/1169 +f 1022/372/1170 1018/368/1166 990/340/1138 995/345/1143 +f 1019/369/1167 998/348/1146 997/346/1145 1023/373/1171 +f 1024/374/1172 1020/370/1168 986/337/1134 977/327/1125 +f 1021/371/1169 983/333/1131 985/335/1133 1006/354/1154 +f 1008/357/1156 1022/372/1170 995/345/1143 1000/350/1148 +f 1023/373/1171 997/346/1145 996/347/1144 1012/360/1160 +f 1002/351/1150 1024/374/1172 977/327/1125 976/328/1124 +f 1025/377/1173 1026/376/1174 1027/375/1175 1028/378/1176 +f 1028/378/1176 1027/375/1175 1029/379/1177 1030/380/1178 +f 1030/380/1178 1029/379/1177 1031/381/1179 1032/382/1180 +f 1032/382/1180 1031/381/1179 1033/383/1181 1034/384/1182 +f 1026/376/1174 1035/386/1183 1036/385/1184 1027/375/1175 +f 1027/375/1175 1036/385/1184 1037/387/1185 1029/379/1177 +f 1029/379/1177 1037/387/1185 1038/388/1186 1031/381/1179 +f 1031/381/1179 1038/388/1186 1039/389/1187 1033/383/1181 +f 1035/386/1183 1040/391/1188 1041/390/1189 1036/385/1184 +f 1036/385/1184 1041/390/1189 1042/392/1190 1037/387/1185 +f 1037/387/1185 1042/392/1190 1043/393/1191 1038/388/1186 +f 1038/388/1186 1043/393/1191 1044/394/1192 1039/389/1187 +f 1040/391/1188 1045/396/1193 1046/395/1194 1041/390/1189 +f 1041/390/1189 1046/395/1194 1047/397/1195 1042/392/1190 +f 1042/392/1190 1047/397/1195 1048/398/1196 1043/393/1191 +f 1043/393/1191 1048/398/1196 1049/399/1197 1044/394/1192 +f 1005/355/1153 1004/356/1152 1025/377/1173 1050/400/1198 +f 1051/403/1199 1052/402/1200 1053/401/1201 1034/384/1182 +f 1054/405/1202 1055/404/1203 1049/399/1197 1056/406/1204 +f 1008/357/1156 1007/358/1155 1057/407/1205 1045/396/1193 +f 1050/400/1198 1025/377/1173 1028/378/1176 1058/408/1206 +f 1059/409/1207 1051/403/1199 1034/384/1182 1033/383/1181 +f 1056/406/1204 1049/399/1197 1048/398/1196 1060/410/1208 +f 1022/372/1170 1008/357/1156 1045/396/1193 1040/391/1188 +f 1058/408/1206 1028/378/1176 1030/380/1178 1061/411/1209 +f 1062/412/1210 1059/409/1207 1033/383/1181 1039/389/1187 +f 1060/410/1208 1048/398/1196 1047/397/1195 1063/413/1211 +f 1018/368/1166 1022/372/1170 1040/391/1188 1035/386/1183 +f 1061/411/1209 1030/380/1178 1032/382/1180 1064/414/1212 +f 1065/415/1213 1062/412/1210 1039/389/1187 1044/394/1192 +f 1063/413/1211 1047/397/1195 1046/395/1194 1066/416/1214 +f 1014/364/1162 1018/368/1166 1035/386/1183 1026/376/1174 +f 1064/414/1212 1032/382/1180 1034/384/1182 1053/401/1201 +f 1055/404/1203 1065/415/1213 1044/394/1192 1049/399/1197 +f 1066/416/1214 1046/395/1194 1045/396/1193 1057/407/1205 +f 1004/356/1152 1014/364/1162 1026/376/1174 1025/377/1173 +f 1067/419/1215 1068/418/1216 1069/417/1217 1070/420/1218 +f 1070/420/1218 1069/417/1217 1071/421/1219 1072/422/1220 +f 1072/422/1220 1071/421/1219 1073/423/1221 1074/424/1222 +f 1074/424/1222 1073/423/1221 1075/425/1223 1076/426/1224 +f 1068/418/1216 1077/428/1225 1078/427/1226 1069/417/1217 +f 1069/417/1217 1078/427/1226 1079/429/1227 1071/421/1219 +f 1071/421/1219 1079/429/1227 1080/430/1228 1073/423/1221 +f 1073/423/1221 1080/430/1228 1081/431/1229 1075/425/1223 +f 1077/428/1225 1082/433/1230 1083/432/1231 1078/427/1226 +f 1078/427/1226 1083/432/1231 1084/434/1232 1079/429/1227 +f 1079/429/1227 1084/434/1232 1085/435/1233 1080/430/1228 +f 1080/430/1228 1085/435/1233 1086/436/1234 1081/431/1229 +f 1082/433/1230 1087/438/1235 1088/437/1236 1083/432/1231 +f 1083/432/1231 1088/437/1236 1089/439/1237 1084/434/1232 +f 1084/434/1232 1089/439/1237 1090/440/1238 1085/435/1233 +f 1085/435/1233 1090/440/1238 1091/441/1239 1086/436/1234 +f 1052/402/1200 1051/403/1199 1067/419/1215 1092/442/1240 +f 1093/445/1241 1094/444/1242 1095/443/1243 1076/426/1224 +f 1096/447/1244 1097/446/1245 1091/441/1239 1098/448/1246 +f 1055/404/1203 1054/405/1202 1099/449/1247 1087/438/1235 +f 1092/442/1240 1067/419/1215 1070/420/1218 1100/450/1248 +f 1101/451/1249 1093/445/1241 1076/426/1224 1075/425/1223 +f 1098/448/1246 1091/441/1239 1090/440/1238 1102/452/1250 +f 1065/415/1213 1055/404/1203 1087/438/1235 1082/433/1230 +f 1100/450/1248 1070/420/1218 1072/422/1220 1103/453/1251 +f 1104/454/1252 1101/451/1249 1075/425/1223 1081/431/1229 +f 1102/452/1250 1090/440/1238 1089/439/1237 1105/455/1253 +f 1062/412/1210 1065/415/1213 1082/433/1230 1077/428/1225 +f 1103/453/1251 1072/422/1220 1074/424/1222 1106/456/1254 +f 1107/457/1255 1104/454/1252 1081/431/1229 1086/436/1234 +f 1105/455/1253 1089/439/1237 1088/437/1236 1108/458/1256 +f 1059/409/1207 1062/412/1210 1077/428/1225 1068/418/1216 +f 1106/456/1254 1074/424/1222 1076/426/1224 1095/443/1243 +f 1097/446/1245 1107/457/1255 1086/436/1234 1091/441/1239 +f 1108/458/1256 1088/437/1236 1087/438/1235 1099/449/1247 +f 1051/403/1199 1059/409/1207 1068/418/1216 1067/419/1215 +f 1109/461/1257 1110/460/1258 1111/459/1259 1112/462/1260 +f 1112/462/1260 1111/459/1259 1113/463/1261 1114/464/1262 +f 1114/464/1262 1113/463/1261 1115/465/1263 1116/466/1264 +f 1116/466/1264 1115/465/1263 1117/467/1265 1118/468/1266 +f 1110/460/1258 1119/470/1267 1120/469/1268 1111/459/1259 +f 1111/459/1259 1120/469/1268 1121/471/1269 1113/463/1261 +f 1113/463/1261 1121/471/1269 1122/472/1270 1115/465/1263 +f 1115/465/1263 1122/472/1270 1123/473/1271 1117/467/1265 +f 1119/470/1267 1124/475/1272 1125/474/1273 1120/469/1268 +f 1120/469/1268 1125/474/1273 1126/476/1274 1121/471/1269 +f 1121/471/1269 1126/476/1274 1127/477/1275 1122/472/1270 +f 1122/472/1270 1127/477/1275 1128/478/1276 1123/473/1271 +f 1124/475/1272 1129/480/1277 1130/479/1278 1125/474/1273 +f 1125/474/1273 1130/479/1278 1131/481/1279 1126/476/1274 +f 1126/476/1274 1131/481/1279 1132/482/1280 1127/477/1275 +f 1127/477/1275 1132/482/1280 1133/483/1281 1128/478/1276 +f 1094/444/1242 1093/445/1241 1109/461/1257 1134/484/1282 +f 1135/487/1283 1136/486/1284 1137/485/1285 1118/468/1266 +f 1138/489/1286 1139/488/1287 1133/483/1281 1140/490/1288 +f 1097/446/1245 1096/447/1244 1141/491/1289 1129/480/1277 +f 1134/484/1282 1109/461/1257 1112/462/1260 1142/492/1290 +f 1143/493/1291 1135/487/1283 1118/468/1266 1117/467/1265 +f 1140/490/1288 1133/483/1281 1132/482/1280 1144/494/1292 +f 1107/457/1255 1097/446/1245 1129/480/1277 1124/475/1272 +f 1142/492/1290 1112/462/1260 1114/464/1262 1145/495/1293 +f 1146/496/1294 1143/493/1291 1117/467/1265 1123/473/1271 +f 1144/494/1292 1132/482/1280 1131/481/1279 1147/497/1295 +f 1104/454/1252 1107/457/1255 1124/475/1272 1119/470/1267 +f 1145/495/1293 1114/464/1262 1116/466/1264 1148/498/1296 +f 1149/499/1297 1146/496/1294 1123/473/1271 1128/478/1276 +f 1147/497/1295 1131/481/1279 1130/479/1278 1150/500/1298 +f 1101/451/1249 1104/454/1252 1119/470/1267 1110/460/1258 +f 1148/498/1296 1116/466/1264 1118/468/1266 1137/485/1285 +f 1139/488/1287 1149/499/1297 1128/478/1276 1133/483/1281 +f 1150/500/1298 1130/479/1278 1129/480/1277 1141/491/1289 +f 1093/445/1241 1101/451/1249 1110/460/1258 1109/461/1257 +f 1151/503/1299 1152/502/1300 1153/501/1301 1154/504/1302 +f 1154/504/1302 1153/501/1301 1155/505/1303 1156/506/1304 +f 1156/506/1304 1155/505/1303 1157/507/1305 1158/508/1306 +f 1158/508/1306 1157/507/1305 1159/509/1307 1160/510/1308 +f 1152/502/1300 1161/512/1309 1162/511/1310 1153/501/1301 +f 1153/501/1301 1162/511/1310 1163/513/1311 1155/505/1303 +f 1155/505/1303 1163/513/1311 1164/514/1312 1157/507/1305 +f 1157/507/1305 1164/514/1312 1165/515/1313 1159/509/1307 +f 1161/512/1309 1166/517/1314 1167/516/1315 1162/511/1310 +f 1162/511/1310 1167/516/1315 1168/518/1316 1163/513/1311 +f 1163/513/1311 1168/518/1316 1169/519/1317 1164/514/1312 +f 1164/514/1312 1169/519/1317 1170/520/1318 1165/515/1313 +f 1166/517/1314 1171/522/1319 1172/521/1320 1167/516/1315 +f 1167/516/1315 1172/521/1320 1173/523/1321 1168/518/1316 +f 1168/518/1316 1173/523/1321 1174/524/1322 1169/519/1317 +f 1169/519/1317 1174/524/1322 1175/525/1323 1170/520/1318 +f 1176/527/1324 1177/526/1325 1151/503/1299 1178/528/1326 +f 1179/531/1327 1180/530/1328 1181/529/1329 1160/510/1308 +f 1005/355/1153 1182/532/1330 1175/525/1323 1006/354/1154 +f 1183/533/1331 1001/352/1149 1003/353/1151 1171/522/1319 +f 1178/528/1326 1151/503/1299 1154/504/1302 1184/534/1332 +f 1185/535/1333 1179/531/1327 1160/510/1308 1159/509/1307 +f 1006/354/1154 1175/525/1323 1174/524/1322 1021/371/1169 +f 1186/536/1334 1183/533/1331 1171/522/1319 1166/517/1314 +f 1184/534/1332 1154/504/1302 1156/506/1304 1187/537/1335 +f 1188/538/1336 1185/535/1333 1159/509/1307 1165/515/1313 +f 1021/371/1169 1174/524/1322 1173/523/1321 1017/367/1165 +f 1189/539/1337 1186/536/1334 1166/517/1314 1161/512/1309 +f 1187/537/1335 1156/506/1304 1158/508/1306 1190/540/1338 +f 1191/541/1339 1188/538/1336 1165/515/1313 1170/520/1318 +f 1017/367/1165 1173/523/1321 1172/521/1320 1013/363/1161 +f 1192/542/1340 1189/539/1337 1161/512/1309 1152/502/1300 +f 1190/540/1338 1158/508/1306 1160/510/1308 1181/529/1329 +f 1182/532/1330 1191/541/1339 1170/520/1318 1175/525/1323 +f 1013/363/1161 1172/521/1320 1171/522/1319 1003/353/1151 +f 1177/526/1325 1192/542/1340 1152/502/1300 1151/503/1299 +f 1193/545/1341 1194/544/1342 1195/543/1343 1196/546/1344 +f 1196/546/1344 1195/543/1343 1197/547/1345 1198/548/1346 +f 1198/548/1346 1197/547/1345 1199/549/1347 1200/550/1348 +f 1200/550/1348 1199/549/1347 1201/551/1349 1202/552/1350 +f 1194/544/1342 1203/554/1351 1204/553/1352 1195/543/1343 +f 1195/543/1343 1204/553/1352 1205/555/1353 1197/547/1345 +f 1197/547/1345 1205/555/1353 1206/556/1354 1199/549/1347 +f 1199/549/1347 1206/556/1354 1207/557/1355 1201/551/1349 +f 1203/554/1351 1208/559/1356 1209/558/1357 1204/553/1352 +f 1204/553/1352 1209/558/1357 1210/560/1358 1205/555/1353 +f 1205/555/1353 1210/560/1358 1211/561/1359 1206/556/1354 +f 1206/556/1354 1211/561/1359 1212/562/1360 1207/557/1355 +f 1208/559/1356 1213/564/1361 1214/563/1362 1209/558/1357 +f 1209/558/1357 1214/563/1362 1215/565/1363 1210/560/1358 +f 1210/560/1358 1215/565/1363 1216/566/1364 1211/561/1359 +f 1211/561/1359 1216/566/1364 1217/567/1365 1212/562/1360 +f 1180/530/1328 1179/531/1327 1193/545/1341 1218/568/1366 +f 1219/571/1367 1220/570/1368 1221/569/1369 1202/552/1350 +f 1052/402/1200 1222/572/1370 1217/567/1365 1053/401/1201 +f 1182/532/1330 1005/355/1153 1050/400/1198 1213/564/1361 +f 1218/568/1366 1193/545/1341 1196/546/1344 1223/573/1371 +f 1224/574/1372 1219/571/1367 1202/552/1350 1201/551/1349 +f 1053/401/1201 1217/567/1365 1216/566/1364 1064/414/1212 +f 1191/541/1339 1182/532/1330 1213/564/1361 1208/559/1356 +f 1223/573/1371 1196/546/1344 1198/548/1346 1225/575/1373 +f 1226/576/1374 1224/574/1372 1201/551/1349 1207/557/1355 +f 1064/414/1212 1216/566/1364 1215/565/1363 1061/411/1209 +f 1188/538/1336 1191/541/1339 1208/559/1356 1203/554/1351 +f 1225/575/1373 1198/548/1346 1200/550/1348 1227/577/1375 +f 1228/578/1376 1226/576/1374 1207/557/1355 1212/562/1360 +f 1061/411/1209 1215/565/1363 1214/563/1362 1058/408/1206 +f 1185/535/1333 1188/538/1336 1203/554/1351 1194/544/1342 +f 1227/577/1375 1200/550/1348 1202/552/1350 1221/569/1369 +f 1222/572/1370 1228/578/1376 1212/562/1360 1217/567/1365 +f 1058/408/1206 1214/563/1362 1213/564/1361 1050/400/1198 +f 1179/531/1327 1185/535/1333 1194/544/1342 1193/545/1341 +f 1229/581/1377 1230/580/1378 1231/579/1379 1232/582/1380 +f 1232/582/1380 1231/579/1379 1233/583/1381 1234/584/1382 +f 1234/584/1382 1233/583/1381 1235/585/1383 1236/586/1384 +f 1236/586/1384 1235/585/1383 1237/587/1385 1238/588/1386 +f 1230/580/1378 1239/590/1387 1240/589/1388 1231/579/1379 +f 1231/579/1379 1240/589/1388 1241/591/1389 1233/583/1381 +f 1233/583/1381 1241/591/1389 1242/592/1390 1235/585/1383 +f 1235/585/1383 1242/592/1390 1243/593/1391 1237/587/1385 +f 1239/590/1387 1244/595/1392 1245/594/1393 1240/589/1388 +f 1240/589/1388 1245/594/1393 1246/596/1394 1241/591/1389 +f 1241/591/1389 1246/596/1394 1247/597/1395 1242/592/1390 +f 1242/592/1390 1247/597/1395 1248/598/1396 1243/593/1391 +f 1244/595/1392 1249/600/1397 1250/599/1398 1245/594/1393 +f 1245/594/1393 1250/599/1398 1251/601/1399 1246/596/1394 +f 1246/596/1394 1251/601/1399 1252/602/1400 1247/597/1395 +f 1247/597/1395 1252/602/1400 1253/603/1401 1248/598/1396 +f 1220/570/1368 1219/571/1367 1229/581/1377 1254/604/1402 +f 1255/607/1403 1256/606/1404 1257/605/1405 1238/588/1386 +f 1094/444/1242 1258/608/1406 1253/603/1401 1095/443/1243 +f 1222/572/1370 1052/402/1200 1092/442/1240 1249/600/1397 +f 1254/604/1402 1229/581/1377 1232/582/1380 1259/609/1407 +f 1260/610/1408 1255/607/1403 1238/588/1386 1237/587/1385 +f 1095/443/1243 1253/603/1401 1252/602/1400 1106/456/1254 +f 1228/578/1376 1222/572/1370 1249/600/1397 1244/595/1392 +f 1259/609/1407 1232/582/1380 1234/584/1382 1261/611/1409 +f 1262/612/1410 1260/610/1408 1237/587/1385 1243/593/1391 +f 1106/456/1254 1252/602/1400 1251/601/1399 1103/453/1251 +f 1226/576/1374 1228/578/1376 1244/595/1392 1239/590/1387 +f 1261/611/1409 1234/584/1382 1236/586/1384 1263/613/1411 +f 1264/614/1412 1262/612/1410 1243/593/1391 1248/598/1396 +f 1103/453/1251 1251/601/1399 1250/599/1398 1100/450/1248 +f 1224/574/1372 1226/576/1374 1239/590/1387 1230/580/1378 +f 1263/613/1411 1236/586/1384 1238/588/1386 1257/605/1405 +f 1258/608/1406 1264/614/1412 1248/598/1396 1253/603/1401 +f 1100/450/1248 1250/599/1398 1249/600/1397 1092/442/1240 +f 1219/571/1367 1224/574/1372 1230/580/1378 1229/581/1377 +f 1265/617/1413 1266/616/1414 1267/615/1415 1268/618/1416 +f 1268/618/1416 1267/615/1415 1269/619/1417 1270/620/1418 +f 1270/620/1418 1269/619/1417 1271/621/1419 1272/622/1420 +f 1272/622/1420 1271/621/1419 1273/623/1421 1274/624/1422 +f 1266/616/1414 1275/626/1423 1276/625/1424 1267/615/1415 +f 1267/615/1415 1276/625/1424 1277/627/1425 1269/619/1417 +f 1269/619/1417 1277/627/1425 1278/628/1426 1271/621/1419 +f 1271/621/1419 1278/628/1426 1279/629/1427 1273/623/1421 +f 1275/626/1423 1280/631/1428 1281/630/1429 1276/625/1424 +f 1276/625/1424 1281/630/1429 1282/632/1430 1277/627/1425 +f 1277/627/1425 1282/632/1430 1283/633/1431 1278/628/1426 +f 1278/628/1426 1283/633/1431 1284/634/1432 1279/629/1427 +f 1280/631/1428 1285/636/1433 1286/635/1434 1281/630/1429 +f 1281/630/1429 1286/635/1434 1287/637/1435 1282/632/1430 +f 1282/632/1430 1287/637/1435 1288/638/1436 1283/633/1431 +f 1283/633/1431 1288/638/1436 1289/639/1437 1284/634/1432 +f 1256/606/1404 1255/607/1403 1265/617/1413 1290/640/1438 +f 1291/643/1439 1292/642/1440 1293/641/1441 1274/624/1422 +f 1136/486/1284 1294/644/1442 1289/639/1437 1137/485/1285 +f 1258/608/1406 1094/444/1242 1134/484/1282 1285/636/1433 +f 1290/640/1438 1265/617/1413 1268/618/1416 1295/645/1443 +f 1296/646/1444 1291/643/1439 1274/624/1422 1273/623/1421 +f 1137/485/1285 1289/639/1437 1288/638/1436 1148/498/1296 +f 1264/614/1412 1258/608/1406 1285/636/1433 1280/631/1428 +f 1295/645/1443 1268/618/1416 1270/620/1418 1297/647/1445 +f 1298/648/1446 1296/646/1444 1273/623/1421 1279/629/1427 +f 1148/498/1296 1288/638/1436 1287/637/1435 1145/495/1293 +f 1262/612/1410 1264/614/1412 1280/631/1428 1275/626/1423 +f 1297/647/1445 1270/620/1418 1272/622/1420 1299/649/1447 +f 1300/650/1448 1298/648/1446 1279/629/1427 1284/634/1432 +f 1145/495/1293 1287/637/1435 1286/635/1434 1142/492/1290 +f 1260/610/1408 1262/612/1410 1275/626/1423 1266/616/1414 +f 1299/649/1447 1272/622/1420 1274/624/1422 1293/641/1441 +f 1294/644/1442 1300/650/1448 1284/634/1432 1289/639/1437 +f 1142/492/1290 1286/635/1434 1285/636/1433 1134/484/1282 +f 1255/607/1403 1260/610/1408 1266/616/1414 1265/617/1413 +s 2 +f 1002/351/1449 1001/352/1450 677/352/1451 676/351/1452 +s 4 +f 1007/358/1453 1009/359/1454 684/359/1455 683/358/1456 +f 1012/360/1457 1011/361/1458 686/361/1459 685/360/1460 +s 2 +f 1011/361/1461 1010/362/1462 687/362/1463 686/361/1464 +s 4 +f 1009/359/1454 1015/365/1465 690/365/1466 684/359/1455 +s 2 +f 1010/362/1462 1016/366/1467 691/366/1468 687/362/1463 +s 4 +f 1015/365/1465 1019/369/1469 694/369/1470 690/365/1466 +s 2 +f 1016/366/1467 1020/370/1471 695/370/1472 691/366/1468 +s 4 +f 1019/369/1469 1023/373/1473 698/373/1474 694/369/1470 +s 2 +f 1020/370/1471 1024/374/1475 699/374/1476 695/370/1472 +s 4 +f 1023/373/1473 1012/360/1457 685/360/1460 698/373/1474 +s 2 +f 1024/374/1475 1002/351/1449 676/351/1452 699/374/1476 +s 4 +f 1054/405/1477 1056/406/1478 731/406/1479 730/405/1480 +f 1057/407/1481 1007/358/1453 683/358/1456 732/407/1482 +f 1056/406/1478 1060/410/1483 735/410/1484 731/406/1479 +f 1060/410/1483 1063/413/1485 738/413/1486 735/410/1484 +f 1063/413/1485 1066/416/1487 741/416/1488 738/413/1486 +f 1066/416/1487 1057/407/1481 732/407/1482 741/416/1488 +f 1096/447/1489 1098/448/1490 773/448/1491 772/447/1492 +f 1099/449/1493 1054/405/1477 730/405/1480 774/449/1494 +f 1098/448/1490 1102/452/1495 777/452/1496 773/448/1491 +f 1102/452/1495 1105/455/1497 780/455/1498 777/452/1496 +f 1105/455/1497 1108/458/1499 783/458/1500 780/455/1498 +f 1108/458/1499 1099/449/1493 774/449/1494 783/458/1500 +f 1136/486/1501 1135/487/1502 812/487/1503 811/486/1504 +f 1138/489/1505 1140/490/1506 815/490/1507 814/489/1508 +f 1139/488/1509 1138/489/1505 814/489/1508 813/488/1510 +f 1141/491/1511 1096/447/1489 772/447/1492 816/491/1512 +f 1135/487/1502 1143/493/1513 818/493/1514 812/487/1503 +f 1140/490/1506 1144/494/1515 819/494/1516 815/490/1507 +f 1143/493/1513 1146/496/1517 821/496/1518 818/493/1514 +f 1144/494/1515 1147/497/1519 822/497/1520 819/494/1516 +f 1146/496/1517 1149/499/1521 824/499/1522 821/496/1518 +f 1147/497/1519 1150/500/1523 825/500/1524 822/497/1520 +f 1149/499/1521 1139/488/1509 813/488/1510 824/499/1522 +f 1150/500/1523 1141/491/1511 816/491/1512 825/500/1524 +f 1176/527/1525 1178/528/1526 853/528/1527 852/527/1528 +s 2 +f 1177/526/1529 1176/527/1530 852/527/1531 851/526/1532 +s 4 +f 1181/529/1533 1180/530/1534 855/530/1535 854/529/1536 +s 2 +f 1001/352/1450 1183/533/1537 858/533/1538 677/352/1451 +s 4 +f 1178/528/1526 1184/534/1539 859/534/1540 853/528/1527 +s 2 +f 1183/533/1537 1186/536/1541 861/536/1542 858/533/1538 +s 4 +f 1184/534/1539 1187/537/1543 862/537/1544 859/534/1540 +s 2 +f 1186/536/1541 1189/539/1545 864/539/1546 861/536/1542 +s 4 +f 1187/537/1543 1190/540/1547 865/540/1548 862/537/1544 +s 2 +f 1189/539/1545 1192/542/1549 867/542/1550 864/539/1546 +s 4 +f 1190/540/1547 1181/529/1533 854/529/1536 865/540/1548 +s 2 +f 1192/542/1549 1177/526/1529 851/526/1532 867/542/1550 +s 4 +f 1180/530/1534 1218/568/1551 893/568/1552 855/530/1535 +f 1221/569/1553 1220/570/1554 895/570/1555 894/569/1556 +f 1218/568/1551 1223/573/1557 898/573/1558 893/568/1552 +f 1223/573/1557 1225/575/1559 900/575/1560 898/573/1558 +f 1225/575/1559 1227/577/1561 902/577/1562 900/575/1560 +f 1227/577/1561 1221/569/1553 894/569/1556 902/577/1562 +f 1220/570/1554 1254/604/1563 929/604/1564 895/570/1555 +f 1257/605/1565 1256/606/1566 931/606/1567 930/605/1568 +f 1254/604/1563 1259/609/1569 934/609/1570 929/604/1564 +f 1259/609/1569 1261/611/1571 936/611/1572 934/609/1570 +f 1261/611/1571 1263/613/1573 938/613/1574 936/611/1572 +f 1263/613/1573 1257/605/1565 930/605/1568 938/613/1574 +f 1256/606/1566 1290/640/1575 965/640/1576 931/606/1567 +f 1293/641/1577 1292/642/1578 967/642/1579 966/641/1580 +f 1292/642/1578 1291/643/1581 968/643/1582 967/642/1579 +f 1294/644/1583 1136/486/1501 811/486/1504 969/644/1584 +f 1290/640/1575 1295/645/1585 970/645/1586 965/640/1576 +f 1291/643/1581 1296/646/1587 971/646/1588 968/643/1582 +f 1295/645/1585 1297/647/1589 972/647/1590 970/645/1586 +f 1296/646/1587 1298/648/1591 973/648/1592 971/646/1588 +f 1297/647/1589 1299/649/1593 974/649/1594 972/647/1590 +f 1298/648/1591 1300/650/1595 975/650/1596 973/648/1592 +f 1299/649/1593 1293/641/1577 966/641/1580 974/649/1594 +f 1300/650/1595 1294/644/1583 969/644/1584 975/650/1596 +# 648 polygons + +# +# object lotu_petal_02 +# + +v 0.1784 0.2729 -0.1131 +v 0.1052 0.2667 -0.1026 +v 0.0703 0.2583 -0.0343 +v 0.1397 0.2607 -0.0298 +v 0.2598 0.2786 -0.1176 +v 0.2179 0.2646 -0.0241 +v 0.3493 0.2820 -0.1115 +v 0.3045 0.2677 -0.0144 +v 0.4468 0.2879 -0.0977 +v 0.3986 0.2782 0.0080 +v 0.2070 0.2848 -0.1954 +v 0.1337 0.2829 -0.1800 +v 0.2904 0.2952 -0.2105 +v 0.3818 0.3023 -0.2085 +v 0.4804 0.3120 -0.2027 +v 0.2315 0.3199 -0.2815 +v 0.1596 0.3091 -0.2553 +v 0.3125 0.3286 -0.3022 +v 0.4038 0.3385 -0.3048 +v 0.5024 0.3432 -0.3103 +v 0.2557 0.3625 -0.3652 +v 0.1795 0.3551 -0.3248 +v 0.3380 0.3679 -0.3906 +v 0.4273 0.3740 -0.4015 +v 0.5251 0.3796 -0.4174 +v 0.0103 0.2536 -0.0354 +v -0.0132 0.2538 0.0256 +v 0.0447 0.2577 0.0304 +v 0.3708 0.2737 0.1174 +v 0.4713 0.2866 0.1495 +v 0.5000 0.2892 0.0329 +v 0.6316 0.3870 -0.4336 +v 0.6415 0.4388 -0.5503 +v 0.5341 0.4237 -0.5235 +v 0.1986 0.4106 -0.3893 +v 0.1259 0.3959 -0.3308 +v 0.1097 0.3422 -0.2725 +v 0.1127 0.2573 0.0479 +v 0.5505 0.3043 -0.0854 +v 0.4366 0.4248 -0.4963 +v 0.0903 0.3066 -0.2135 +v 0.1905 0.2601 0.0678 +v 0.5857 0.3176 -0.2034 +v 0.3533 0.4251 -0.4789 +v 0.0683 0.2790 -0.1548 +v 0.2763 0.2574 0.0880 +v 0.6102 0.3493 -0.3208 +v 0.2722 0.4155 -0.4411 +v 0.0402 0.2623 -0.0947 +v 0.7653 0.3297 -0.0520 +v 0.6565 0.3142 -0.0798 +v 0.6110 0.3062 0.0475 +v 0.7286 0.3196 0.0733 +v 0.8877 0.3698 -0.0162 +v 0.8471 0.3613 0.1142 +v 1.0111 0.4257 0.0247 +v 0.9723 0.4119 0.1585 +v 1.1488 0.4722 0.0699 +v 1.1121 0.4591 0.2109 +v 0.8109 0.3607 -0.1796 +v 0.6961 0.3416 -0.2045 +v 0.9313 0.4021 -0.1484 +v 1.0581 0.4404 -0.1060 +v 1.1899 0.4798 -0.0673 +v 0.8386 0.4019 -0.3082 +v 0.7242 0.3655 -0.3243 +v 0.9600 0.4454 -0.2772 +v 1.0850 0.4796 -0.2359 +v 1.2208 0.5209 -0.2025 +v 0.8604 0.4512 -0.4296 +v 0.7438 0.4231 -0.4373 +v 0.9801 0.4850 -0.4064 +v 1.1079 0.5132 -0.3703 +v 1.2461 0.5518 -0.3367 +v 0.5743 0.2897 0.1719 +v 1.0763 0.4525 0.3489 +v 1.2236 0.5043 0.3859 +v 1.2638 0.5060 0.2461 +v 1.3863 0.6046 -0.3158 +v 1.3981 0.6388 -0.4530 +v 1.2510 0.5965 -0.4761 +v 0.7537 0.4758 -0.5536 +v 0.6858 0.3232 0.1977 +v 1.3000 0.5240 0.1059 +v 1.1182 0.5662 -0.5038 +v 0.8071 0.3534 0.2398 +v 1.3365 0.5419 -0.0354 +v 0.9912 0.5365 -0.5375 +v 0.9332 0.4087 0.2884 +v 1.3646 0.5682 -0.1804 +v 0.8696 0.5045 -0.5551 +v 1.6570 0.6808 0.2176 +v 1.4743 0.5932 0.1460 +v 1.4371 0.5857 0.2800 +v 1.6283 0.6735 0.3495 +v 1.8394 0.8023 0.2862 +v 1.8184 0.7946 0.4128 +v 2.0139 0.9532 0.3477 +v 1.9984 0.9347 0.4717 +v 2.1850 1.1029 0.4223 +v 2.1617 1.0875 0.5328 +v 1.6885 0.6932 0.0829 +v 1.4961 0.6085 0.0112 +v 1.8615 0.8129 0.1579 +v 2.0299 0.9632 0.2217 +v 2.2030 1.1117 0.3080 +v 1.7057 0.7077 -0.0500 +v 1.5213 0.6316 -0.1239 +v 1.8946 0.8310 0.0297 +v 2.0623 0.9845 0.0997 +v 2.2323 1.1270 0.1883 +v 1.7256 0.7438 -0.1825 +v 1.5483 0.6642 -0.2572 +v 1.9045 0.8634 -0.0993 +v 2.0805 1.0028 -0.0182 +v 2.2364 1.1596 0.0719 +v 1.3986 0.5783 0.4136 +v 2.1254 1.0936 0.6355 +v 2.2434 1.2315 0.6702 +v 2.2907 1.2244 0.5703 +v 2.3469 1.2943 0.1576 +v 2.3325 1.3259 0.0487 +v 2.2285 1.1914 -0.0430 +v 1.5606 0.7098 -0.3891 +v 1.5977 0.6701 0.4777 +v 2.3158 1.2325 0.4672 +v 2.0780 1.0189 -0.1382 +v 1.7960 0.7991 0.5310 +v 2.3382 1.2355 0.3653 +v 1.9124 0.8946 -0.2280 +v 1.9757 0.9381 0.5872 +v 2.3522 1.2586 0.2630 +v 1.7364 0.7930 -0.3149 +v 2.5078 1.4717 0.5582 +v 2.4200 1.3465 0.5208 +v 2.3865 1.3474 0.6112 +v 2.4816 1.4727 0.6361 +v 2.5697 1.6024 0.6179 +v 2.5545 1.6030 0.6841 +v 2.6084 1.7341 0.6683 +v 2.5975 1.7322 0.7214 +v 2.6401 1.8494 0.7095 +v 2.6358 1.8497 0.7471 +v 2.5280 1.4779 0.4775 +v 2.4367 1.3617 0.4283 +v 2.5836 1.6033 0.5480 +v 2.6203 1.7305 0.6098 +v 2.6445 1.8470 0.6669 +v 2.5389 1.4881 0.3959 +v 2.4455 1.3685 0.3338 +v 2.5985 1.6071 0.4768 +v 2.6312 1.7268 0.5505 +v 2.6468 1.8380 0.6237 +v 2.5314 1.5008 0.3137 +v 2.4433 1.3957 0.2363 +v 2.6014 1.6151 0.4063 +v 2.6305 1.7243 0.4945 +v 2.6475 1.8253 0.5843 +v 2.3557 1.3569 0.7020 +v 2.6273 1.8506 0.7755 +v 2.6469 1.9594 0.7830 +v 2.6546 1.9553 0.7643 +v 2.6658 1.9214 0.6814 +v 2.6635 1.9012 0.6629 +v 2.6459 1.8117 0.5509 +v 2.4268 1.4316 0.1304 +v 2.4511 1.4880 0.7137 +v 2.6608 1.9512 0.7448 +v 2.6274 1.7208 0.4446 +v 2.5306 1.6092 0.7433 +v 2.6637 1.9452 0.7243 +v 2.5930 1.6193 0.3382 +v 2.5824 1.7310 0.7648 +v 2.6643 1.9349 0.7030 +v 2.5156 1.5212 0.2287 +v 0.0160 0.3207 0.3885 +v -0.0336 0.3187 0.3317 +v -0.0533 0.3565 0.4121 +v -0.0240 0.3554 0.4755 +v 0.0674 0.3276 0.4450 +v 0.0171 0.3608 0.5434 +v 0.1249 0.3392 0.5005 +v 0.0802 0.3783 0.6074 +v 0.1960 0.3447 0.5596 +v 0.1627 0.3881 0.6707 +v 0.0393 0.2949 0.2981 +v -0.0116 0.2903 0.2524 +v 0.1063 0.2985 0.3465 +v 0.1803 0.3029 0.4002 +v 0.2571 0.3081 0.4461 +v 0.0680 0.2732 0.2111 +v 0.0101 0.2689 0.1750 +v 0.1361 0.2737 0.2508 +v 0.2095 0.2795 0.2936 +v 0.2978 0.2896 0.3372 +v 0.0945 0.2630 0.1281 +v 0.0314 0.2624 0.0993 +v 0.1661 0.2663 0.1559 +v 0.2437 0.2687 0.1885 +v 0.3346 0.2700 0.2286 +v -0.0910 0.3582 0.3365 +v -0.1035 0.4064 0.4019 +v -0.0847 0.4069 0.4850 +v 0.1422 0.4431 0.7935 +v 0.2334 0.4628 0.8623 +v 0.2576 0.4072 0.7370 +v 0.4312 0.2756 0.2689 +v -0.0247 0.2606 0.0867 +v -0.0635 0.4083 0.5654 +v 0.2830 0.3556 0.6219 +v -0.0392 0.2695 0.1488 +v -0.0138 0.4136 0.6442 +v 0.3367 0.3253 0.5045 +v -0.0567 0.2880 0.2104 +v 0.0614 0.4290 0.7193 +v 0.3958 0.2945 0.3850 +v -0.0716 0.3208 0.2757 +v 0.4966 0.4035 0.7391 +v 0.3849 0.3725 0.6871 +v 0.3592 0.4173 0.8099 +v 0.4693 0.4338 0.8744 +v 0.6198 0.4342 0.7798 +v 0.5921 0.4718 0.9139 +v 0.7482 0.4647 0.8322 +v 0.7189 0.5150 0.9632 +v 0.8919 0.5062 0.8730 +v 0.8518 0.5532 1.0075 +v 0.5283 0.3622 0.5979 +v 0.4288 0.3420 0.5576 +v 0.6459 0.4059 0.6402 +v 0.7796 0.4403 0.6923 +v 0.9267 0.4827 0.7448 +v 0.5956 0.3328 0.4590 +v 0.4938 0.3137 0.4275 +v 0.7048 0.3798 0.5025 +v 0.8250 0.4327 0.5540 +v 0.9599 0.4606 0.6113 +v 0.6445 0.3160 0.3214 +v 0.5357 0.2889 0.2997 +v 0.7649 0.3583 0.3707 +v 0.8920 0.4080 0.4197 +v 1.0263 0.4556 0.4784 +v 0.3380 0.4681 0.9313 +v 0.8065 0.5972 1.1435 +v 0.9529 0.6529 1.1811 +v 1.0011 0.6052 1.0508 +v 1.1763 0.4971 0.5260 +v 0.4421 0.4856 1.0025 +v 1.0521 0.5547 0.9231 +v 0.5582 0.5223 1.0458 +v 1.0831 0.5159 0.7990 +v 0.6799 0.5591 1.1021 +v 1.1205 0.5003 0.6651 +v 1.4008 0.7477 0.9900 +v 1.2146 0.6430 0.9705 +v 1.1727 0.6838 1.1004 +v 1.3515 0.7810 1.1165 +v 1.5778 0.8656 1.0245 +v 1.5329 0.9201 1.1492 +v 1.7674 1.0099 1.0529 +v 1.7256 1.0500 1.1622 +v 1.9465 1.1741 1.0709 +v 1.8981 1.1993 1.1804 +v 1.4554 0.7111 0.8659 +v 1.2650 0.6069 0.8349 +v 1.6322 0.8311 0.9031 +v 1.8194 0.9926 0.9361 +v 1.9926 1.1395 0.9580 +v 1.5122 0.6910 0.7322 +v 1.3093 0.5876 0.6924 +v 1.6994 0.8169 0.7764 +v 1.8796 0.9693 0.8159 +v 2.0410 1.1127 0.8468 +v 1.5544 0.6814 0.6017 +v 1.3505 0.5793 0.5490 +v 1.7578 0.8036 0.6499 +v 1.9279 0.9485 0.7032 +v 2.0812 1.1018 0.7367 +v 1.1202 0.7254 1.2258 +v 1.8347 1.2283 1.2796 +v 1.9859 1.3549 1.2581 +v 2.0392 1.3303 1.1613 +v 2.2151 1.2415 0.7705 +v 1.2960 0.8170 1.2471 +v 2.0960 1.2891 1.0607 +v 1.4810 0.9483 1.2630 +v 2.1408 1.2543 0.9702 +v 1.6668 1.0851 1.2723 +v 2.1788 1.2424 0.8694 +v 2.3051 1.5325 1.0187 +v 2.2078 1.4055 1.0480 +v 2.1540 1.4314 1.1366 +v 2.2606 1.5503 1.0927 +v 2.4033 1.6541 0.9926 +v 2.3654 1.6639 1.0551 +v 2.4943 1.7642 0.9569 +v 2.4649 1.7690 1.0039 +v 2.5518 1.8576 0.9186 +v 2.5333 1.8564 0.9507 +v 2.3463 1.5210 0.9415 +v 2.2523 1.3938 0.9619 +v 2.4383 1.6406 0.9287 +v 2.5169 1.7510 0.9071 +v 2.5713 1.8549 0.8810 +v 2.3863 1.5110 0.8646 +v 2.2897 1.3810 0.8775 +v 2.4767 1.6285 0.8630 +v 2.5396 1.7433 0.8560 +v 2.5913 1.8541 0.8407 +v 2.4243 1.4986 0.7900 +v 2.3274 1.3697 0.7902 +v 2.5062 1.6205 0.7996 +v 2.5654 1.7354 0.8071 +v 2.6125 1.8512 0.8034 +v 2.1037 1.4568 1.2376 +v 2.5166 1.8527 0.9811 +v 2.5835 1.9293 0.9047 +v 2.5964 1.9353 0.8790 +v 2.6391 1.9596 0.8016 +v 2.2167 1.5656 1.1697 +v 2.6094 1.9431 0.8589 +v 2.3268 1.6737 1.1133 +v 2.6218 1.9512 0.8400 +v 2.4337 1.7703 1.0514 +v 2.6295 1.9563 0.8206 +v 0.0721 0.2312 -0.0387 +v 0.1050 0.2393 -0.1098 +v 0.1798 0.2459 -0.1180 +v 0.1421 0.2339 -0.0324 +v 0.2621 0.2517 -0.1234 +v 0.2204 0.2379 -0.0279 +v 0.3519 0.2552 -0.1172 +v 0.3064 0.2410 -0.0182 +v 0.4486 0.2618 -0.1045 +v 0.4004 0.2515 0.0052 +v 0.1290 0.2571 -0.1863 +v 0.2027 0.2584 -0.2028 +v 0.2877 0.2696 -0.2162 +v 0.3804 0.2766 -0.2170 +v 0.4804 0.2851 -0.2107 +v 0.1508 0.2852 -0.2660 +v 0.2256 0.2961 -0.2921 +v 0.3110 0.3040 -0.3104 +v 0.4041 0.3115 -0.3164 +v 0.5040 0.3167 -0.3192 +v 0.1678 0.3365 -0.3412 +v 0.2487 0.3422 -0.3760 +v 0.3345 0.3459 -0.4016 +v 0.4246 0.3515 -0.4123 +v 0.5230 0.3536 -0.4295 +v -0.0118 0.2268 0.0253 +v 0.0118 0.2264 -0.0404 +v 0.0458 0.2307 0.0290 +v 0.5020 0.2628 0.0288 +v 0.4730 0.2598 0.1481 +v 0.3707 0.2473 0.1158 +v 0.6412 0.4146 -0.5595 +v 0.6309 0.3619 -0.4459 +v 0.5323 0.3994 -0.5361 +v 0.0968 0.3248 -0.2877 +v 0.1140 0.3814 -0.3477 +v 0.1861 0.3912 -0.4081 +v 0.1140 0.2302 0.0474 +v 0.5525 0.2780 -0.0884 +v 0.4333 0.4012 -0.5088 +v 0.0811 0.2821 -0.2264 +v 0.1911 0.2330 0.0649 +v 0.5884 0.2899 -0.2095 +v 0.3430 0.4039 -0.4923 +v 0.0628 0.2533 -0.1642 +v 0.2778 0.2304 0.0864 +v 0.6113 0.3233 -0.3298 +v 0.2634 0.3963 -0.4568 +v 0.0388 0.2359 -0.1022 +v 0.6129 0.2801 0.0428 +v 0.6612 0.2869 -0.0836 +v 0.7710 0.3035 -0.0526 +v 0.7314 0.2933 0.0744 +v 0.8916 0.3457 -0.0192 +v 0.8572 0.3353 0.1120 +v 1.0202 0.3996 0.0216 +v 0.9830 0.3873 0.1547 +v 1.1600 0.4473 0.0661 +v 1.1201 0.4326 0.2077 +v 0.7011 0.3155 -0.2074 +v 0.8171 0.3352 -0.1823 +v 0.9413 0.3775 -0.1520 +v 1.0690 0.4147 -0.1097 +v 1.2025 0.4544 -0.0736 +v 0.7253 0.3418 -0.3326 +v 0.8464 0.3782 -0.3139 +v 0.9679 0.4194 -0.2839 +v 1.0963 0.4543 -0.2393 +v 1.2326 0.4977 -0.2098 +v 0.7462 0.3986 -0.4487 +v 0.8653 0.4267 -0.4392 +v 0.9893 0.4614 -0.4131 +v 1.1187 0.4873 -0.3777 +v 1.2566 0.5271 -0.3466 +v 0.5801 0.2625 0.1707 +v 1.2734 0.4814 0.2437 +v 1.2329 0.4806 0.3866 +v 1.0838 0.4265 0.3472 +v 1.4097 0.6160 -0.4620 +v 1.4026 0.5806 -0.3255 +v 1.2626 0.5710 -0.4851 +v 0.7560 0.4501 -0.5641 +v 0.6922 0.2973 0.2021 +v 1.3091 0.4995 0.1028 +v 1.1267 0.5413 -0.5110 +v 0.8135 0.3275 0.2439 +v 1.3470 0.5158 -0.0429 +v 0.9984 0.5110 -0.5419 +v 0.9410 0.3831 0.2891 +v 1.3781 0.5441 -0.1872 +v 0.8752 0.4797 -0.5635 +v 1.4485 0.5606 0.2827 +v 1.4846 0.5680 0.1476 +v 1.6728 0.6567 0.2140 +v 1.6397 0.6502 0.3492 +v 1.8571 0.7813 0.2830 +v 1.8360 0.7714 0.4117 +v 2.0295 0.9349 0.3455 +v 2.0163 0.9152 0.4704 +v 2.2009 1.0829 0.4207 +v 2.1776 1.0680 0.5316 +v 1.5114 0.5839 0.0108 +v 1.7035 0.6682 0.0796 +v 1.8781 0.7893 0.1535 +v 2.0480 0.9445 0.2180 +v 2.2189 1.0911 0.3029 +v 1.5369 0.6068 -0.1278 +v 1.7217 0.6843 -0.0565 +v 1.9129 0.8106 0.0241 +v 2.0789 0.9654 0.0932 +v 2.2500 1.1108 0.1840 +v 1.5616 0.6406 -0.2638 +v 1.7392 0.7230 -0.1898 +v 1.9213 0.8405 -0.1032 +v 2.0997 0.9845 -0.0265 +v 2.2566 1.1437 0.0627 +v 1.4076 0.5539 0.4172 +v 2.3097 1.2043 0.5702 +v 2.2629 1.2092 0.6721 +v 2.1418 1.0734 0.6373 +v 2.3552 1.3095 0.0423 +v 2.3681 1.2765 0.1514 +v 2.2497 1.1758 -0.0532 +v 1.5726 0.6869 -0.3959 +v 1.6074 0.6487 0.4810 +v 2.3350 1.2122 0.4669 +v 2.0961 1.0018 -0.1457 +v 1.8101 0.7770 0.5319 +v 2.3579 1.2172 0.3615 +v 1.9304 0.8739 -0.2317 +v 1.9935 0.9162 0.5901 +v 2.3747 1.2382 0.2587 +v 1.7524 0.7719 -0.3236 +v 2.4088 1.3309 0.6197 +v 2.4410 1.3265 0.5276 +v 2.5300 1.4562 0.5633 +v 2.5014 1.4602 0.6442 +v 2.5941 1.5952 0.6197 +v 2.5783 1.5945 0.6886 +v 2.6336 1.7271 0.6678 +v 2.6228 1.7245 0.7235 +v 2.6650 1.8416 0.7094 +v 2.6598 1.8407 0.7493 +v 2.4576 1.3412 0.4328 +v 2.5513 1.4641 0.4812 +v 2.6085 1.5933 0.5471 +v 2.6470 1.7229 0.6075 +v 2.6696 1.8387 0.6654 +v 2.4673 1.3509 0.3339 +v 2.5624 1.4733 0.3977 +v 2.6233 1.5980 0.4734 +v 2.6574 1.7178 0.5466 +v 2.6734 1.8306 0.6213 +v 2.4655 1.3783 0.2325 +v 2.5535 1.4861 0.3110 +v 2.6284 1.6043 0.4013 +v 2.6575 1.7208 0.4891 +v 2.6747 1.8190 0.5809 +v 2.3772 1.3413 0.7105 +v 2.6783 1.9501 0.7676 +v 2.6716 1.9546 0.7886 +v 2.6490 1.8438 0.7814 +v 2.6899 1.8953 0.6576 +v 2.6921 1.9117 0.6790 +v 2.6728 1.8047 0.5484 +v 2.4509 1.4134 0.1266 +v 2.4697 1.4718 0.7226 +v 2.6858 1.9423 0.7461 +v 2.6546 1.7151 0.4390 +v 2.5521 1.5938 0.7519 +v 2.6889 1.9341 0.7242 +v 2.6183 1.6101 0.3325 +v 2.6080 1.7255 0.7708 +v 2.6902 1.9240 0.7020 +v 2.5370 1.5091 0.2242 +v -0.0704 0.3387 0.4259 +v -0.0429 0.2949 0.3429 +v 0.0094 0.2961 0.3970 +v -0.0377 0.3326 0.4882 +v 0.0637 0.3005 0.4542 +v 0.0091 0.3368 0.5514 +v 0.1227 0.3133 0.5106 +v 0.0756 0.3543 0.6148 +v 0.1915 0.3194 0.5673 +v 0.1591 0.3632 0.6813 +v -0.0169 0.2647 0.2622 +v 0.0345 0.2691 0.3058 +v 0.1051 0.2731 0.3561 +v 0.1798 0.2763 0.4070 +v 0.2578 0.2823 0.4547 +v 0.0039 0.2426 0.1794 +v 0.0652 0.2462 0.2145 +v 0.1359 0.2467 0.2574 +v 0.2104 0.2532 0.2985 +v 0.3001 0.2626 0.3410 +v 0.0284 0.2357 0.1000 +v 0.0900 0.2365 0.1282 +v 0.1627 0.2395 0.1580 +v 0.2426 0.2416 0.1899 +v 0.3357 0.2432 0.2295 +v -0.1220 0.3867 0.4129 +v -0.1049 0.3364 0.3500 +v -0.1032 0.3875 0.4966 +v 0.2547 0.3819 0.7468 +v 0.2335 0.4379 0.8697 +v 0.1364 0.4190 0.8008 +v 0.4359 0.2484 0.2686 +v -0.0274 0.2338 0.0903 +v -0.0773 0.3880 0.5752 +v 0.2831 0.3306 0.6316 +v -0.0458 0.2431 0.1557 +v -0.0226 0.3895 0.6512 +v 0.3398 0.3001 0.5103 +v -0.0646 0.2630 0.2219 +v 0.0533 0.4051 0.7273 +v 0.3983 0.2679 0.3896 +v -0.0836 0.2993 0.2856 +v 0.3584 0.3916 0.8219 +v 0.3835 0.3464 0.6954 +v 0.4986 0.3783 0.7451 +v 0.4729 0.4082 0.8834 +v 0.6201 0.4078 0.7859 +v 0.5962 0.4482 0.9268 +v 0.7541 0.4396 0.8389 +v 0.7239 0.4893 0.9747 +v 0.8992 0.4820 0.8851 +v 0.8610 0.5270 1.0190 +v 0.4289 0.3157 0.5628 +v 0.5304 0.3360 0.6030 +v 0.6508 0.3798 0.6428 +v 0.7814 0.4154 0.6949 +v 0.9326 0.4554 0.7530 +v 0.4997 0.2874 0.4323 +v 0.6002 0.3073 0.4626 +v 0.7077 0.3560 0.5052 +v 0.8277 0.4067 0.5595 +v 0.9638 0.4334 0.6162 +v 0.5384 0.2629 0.3015 +v 0.6507 0.2900 0.3243 +v 0.7709 0.3331 0.3728 +v 0.8989 0.3824 0.4234 +v 1.0329 0.4291 0.4821 +v 0.3387 0.4424 0.9383 +v 1.0099 0.5806 1.0614 +v 0.9618 0.6301 1.1920 +v 0.8112 0.5727 1.1549 +v 1.1823 0.4723 0.5282 +v 0.4454 0.4616 1.0123 +v 1.0619 0.5303 0.9354 +v 0.5645 0.4972 1.0576 +v 1.0904 0.4918 0.8078 +v 0.6881 0.5339 1.1130 +v 1.1254 0.4757 0.6666 +v 1.1854 0.6591 1.1128 +v 1.2254 0.6214 0.9827 +v 1.4149 0.7245 0.9995 +v 1.3683 0.7606 1.1283 +v 1.5963 0.8457 1.0353 +v 1.5488 0.8966 1.1618 +v 1.7801 0.9929 1.0652 +v 1.7395 1.0345 1.1758 +v 1.9620 1.1589 1.0797 +v 1.9104 1.1828 1.1918 +v 1.2743 0.5855 0.8380 +v 1.4683 0.6858 0.8726 +v 1.6493 0.8088 0.9119 +v 1.8310 0.9750 0.9433 +v 2.0071 1.1204 0.9672 +v 1.3153 0.5661 0.6952 +v 1.5233 0.6666 0.7359 +v 1.7142 0.7925 0.7821 +v 1.8936 0.9502 0.8251 +v 2.0580 1.0919 0.8523 +v 1.3587 0.5549 0.5506 +v 1.5624 0.6569 0.6058 +v 1.7728 0.7824 0.6541 +v 1.9425 0.9290 0.7086 +v 2.1000 1.0803 0.7410 +v 1.1282 0.7020 1.2390 +v 2.0550 1.3120 1.1708 +v 2.0048 1.3369 1.2723 +v 1.8506 1.2113 1.2943 +v 2.2324 1.2235 0.7730 +v 1.3112 0.7964 1.2584 +v 2.1130 1.2706 1.0743 +v 1.4980 0.9276 1.2782 +v 2.1602 1.2406 0.9810 +v 1.6821 1.0691 1.2857 +v 2.1966 1.2247 0.8761 +v 2.1728 1.4178 1.1479 +v 2.2258 1.3933 1.0594 +v 2.3243 1.5237 1.0304 +v 2.2789 1.5383 1.1073 +v 2.4230 1.6460 1.0043 +v 2.3828 1.6536 1.0683 +v 2.5170 1.7566 0.9712 +v 2.4849 1.7629 1.0172 +v 2.5747 1.8519 0.9321 +v 2.5574 1.8489 0.9677 +v 2.2710 1.3796 0.9726 +v 2.3690 1.5086 0.9510 +v 2.4602 1.6315 0.9393 +v 2.5391 1.7466 0.9196 +v 2.5949 1.8516 0.8909 +v 2.3095 1.3644 0.8872 +v 2.4062 1.4958 0.8739 +v 2.4964 1.6144 0.8716 +v 2.5627 1.7337 0.8666 +v 2.6126 1.8471 0.8484 +v 2.3499 1.3530 0.8000 +v 2.4440 1.4839 0.7996 +v 2.5272 1.6057 0.8109 +v 2.5885 1.7279 0.8162 +v 2.6344 1.8449 0.8120 +v 2.1229 1.4373 1.2495 +v 2.6195 1.9246 0.8850 +v 2.6060 1.9105 0.9046 +v 2.5398 1.8431 0.9944 +v 2.6630 1.9513 0.8091 +v 2.2342 1.5542 1.1832 +v 2.6324 1.9330 0.8663 +v 2.3452 1.6651 1.1268 +v 2.6454 1.9422 0.8476 +v 2.4513 1.7613 1.0610 +v 2.6550 1.9461 0.8287 +# 650 vertices + +vn 0.1330 0.9906 0.0322 +vn 0.1439 0.9894 0.0173 +vn 0.0546 0.9974 0.0471 +vn 0.0826 0.9963 0.0223 +vn 0.1545 0.9879 0.0163 +vn 0.0893 0.9956 0.0266 +vn 0.1648 0.9860 0.0249 +vn 0.1004 0.9938 0.0484 +vn 0.1305 0.9878 0.0851 +vn 0.0654 0.9912 0.1152 +vn 0.2524 0.9667 -0.0419 +vn 0.2708 0.9557 -0.1152 +vn 0.2547 0.9670 0.0076 +vn 0.2588 0.9658 0.0153 +vn 0.2392 0.9709 0.0113 +vn 0.3936 0.9101 -0.1295 +vn 0.4129 0.8694 -0.2712 +vn 0.3617 0.9306 -0.0553 +vn 0.3354 0.9415 -0.0342 +vn 0.2990 0.9531 -0.0466 +vn 0.4795 0.8263 -0.2954 +vn 0.5176 0.7177 -0.4658 +vn 0.4506 0.8750 -0.1770 +vn 0.3879 0.9150 -0.1112 +vn 0.3460 0.9343 -0.0865 +vn 0.0332 0.9971 0.0684 +vn -0.0593 0.9949 0.0816 +vn -0.0292 0.9989 0.0356 +vn 0.0144 0.9924 0.1226 +vn 0.0619 0.9949 0.0791 +vn 0.0589 0.9911 0.1195 +vn 0.3677 0.9282 0.0567 +vn 0.4156 0.9069 0.0688 +vn 0.3860 0.9151 -0.1165 +vn 0.5283 0.6219 -0.5780 +vn 0.5399 0.6058 -0.5844 +vn 0.4887 0.7450 -0.4541 +vn -0.0132 0.9998 0.0153 +vn 0.1117 0.9876 0.1107 +vn 0.4480 0.8620 -0.2372 +vn 0.4213 0.8130 -0.4019 +vn -0.0045 0.9999 0.0090 +vn 0.1842 0.9787 0.0910 +vn 0.5064 0.8177 -0.2735 +vn 0.2931 0.9407 -0.1706 +vn -0.0068 0.9979 0.0642 +vn 0.3035 0.9527 0.0148 +vn 0.5215 0.7660 -0.3760 +vn 0.1591 0.9872 -0.0053 +vn 0.1360 0.9676 0.2126 +vn 0.1378 0.9849 0.1051 +vn 0.0769 0.9903 0.1160 +vn 0.0338 0.9726 0.2302 +vn 0.1112 0.9350 0.3368 +vn 0.0391 0.9420 0.3332 +vn 0.0709 0.9357 0.3455 +vn 0.0549 0.9401 0.3365 +vn 0.0752 0.9449 0.3186 +vn 0.0680 0.9529 0.2956 +vn 0.2520 0.9411 0.2253 +vn 0.2009 0.9663 0.1611 +vn 0.2547 0.9236 0.2866 +vn 0.1972 0.9361 0.2913 +vn 0.1545 0.9354 0.3180 +vn 0.3213 0.9117 0.2561 +vn 0.3303 0.9334 0.1401 +vn 0.3020 0.9135 0.2725 +vn 0.2735 0.9257 0.2612 +vn 0.2655 0.9243 0.2743 +vn 0.4054 0.8956 0.1835 +vn 0.4291 0.8937 0.1310 +vn 0.3625 0.9058 0.2193 +vn 0.3273 0.9190 0.2196 +vn 0.2869 0.9191 0.2699 +vn 0.0531 0.9882 0.1439 +vn -0.0040 0.9538 0.3003 +vn 0.0115 0.9366 0.3501 +vn 0.0611 0.9365 0.3453 +vn 0.2868 0.9007 0.3262 +vn 0.3065 0.8951 0.3239 +vn 0.3641 0.9066 0.2132 +vn 0.4318 0.8920 0.1337 +vn 0.0029 0.9649 0.2628 +vn 0.1192 0.9361 0.3311 +vn 0.3971 0.8985 0.1869 +vn 0.0062 0.9499 0.3125 +vn 0.1466 0.9205 0.3622 +vn 0.4016 0.8939 0.1991 +vn 0.0029 0.9451 0.3267 +vn 0.2426 0.9142 0.3247 +vn 0.4214 0.8938 0.1532 +vn 0.0844 0.8757 0.4754 +vn 0.1003 0.9160 0.3884 +vn 0.0442 0.9139 0.4036 +vn 0.0586 0.8838 0.4643 +vn 0.1153 0.8034 0.5842 +vn 0.0712 0.8202 0.5676 +vn 0.1672 0.7627 0.6248 +vn 0.1092 0.7737 0.6240 +vn 0.1339 0.7397 0.6594 +vn 0.0269 0.7215 0.6919 +vn 0.1294 0.8715 0.4730 +vn 0.1590 0.9138 0.3737 +vn 0.1191 0.7949 0.5949 +vn 0.1382 0.7624 0.6322 +vn 0.1331 0.7470 0.6513 +vn 0.2260 0.8614 0.4548 +vn 0.2177 0.9018 0.3732 +vn 0.2052 0.7836 0.5864 +vn 0.1735 0.7424 0.6471 +vn 0.2412 0.6948 0.6776 +vn 0.3242 0.8283 0.4569 +vn 0.3100 0.8738 0.3747 +vn 0.3019 0.7709 0.5608 +vn 0.2616 0.7024 0.6620 +vn 0.3748 0.6065 0.7012 +vn 0.0105 0.9170 0.3987 +vn -0.1286 0.6898 0.7125 +vn -0.1238 0.6711 0.7309 +vn -0.0526 0.6788 0.7324 +vn 0.4453 0.5463 0.7094 +vn 0.4540 0.5158 0.7265 +vn 0.3963 0.5774 0.7138 +vn 0.3485 0.8556 0.3829 +vn -0.0318 0.8808 0.4724 +vn 0.0812 0.6976 0.7119 +vn 0.2958 0.7036 0.6461 +vn -0.0234 0.8280 0.5602 +vn 0.1552 0.6889 0.7080 +vn 0.3235 0.7723 0.5468 +vn -0.0612 0.7598 0.6473 +vn 0.3245 0.6296 0.7059 +vn 0.3835 0.8105 0.4428 +vn 0.0052 0.5526 0.8334 +vn 0.0522 0.6469 0.7608 +vn -0.0963 0.6350 0.7665 +vn -0.1041 0.5690 0.8157 +vn 0.0424 0.4318 0.9010 +vn -0.0581 0.4645 0.8837 +vn 0.0613 0.3287 0.9424 +vn 0.0064 0.3625 0.9320 +vn 0.1360 0.2819 0.9497 +vn 0.0492 0.2860 0.9570 +vn 0.1249 0.5492 0.8263 +vn 0.1651 0.6380 0.7522 +vn 0.0712 0.4186 0.9054 +vn 0.0610 0.3113 0.9483 +vn 0.1394 0.2711 0.9524 +vn 0.2747 0.5240 0.8062 +vn 0.2858 0.5969 0.7497 +vn 0.1734 0.3828 0.9074 +vn 0.1629 0.2617 0.9513 +vn 0.1436 0.2651 0.9535 +vn 0.4240 0.4761 0.7705 +vn 0.4466 0.5345 0.7175 +vn 0.3242 0.3268 0.8877 +vn 0.2814 0.2006 0.9384 +vn 0.1910 0.2330 0.9535 +vn -0.1156 0.6295 0.7683 +vn -0.1223 0.2727 0.9543 +vn -0.1506 0.2002 0.9681 +vn -0.1147 0.2030 0.9724 +vn -0.0869 0.4216 0.9026 +vn -0.7347 0.4505 -0.5073 +vn 0.2328 0.1961 0.9526 +vn 0.4927 0.5118 0.7038 +vn -0.1578 0.5656 0.8094 +vn -0.0132 0.2361 0.9716 +vn 0.3157 0.2020 0.9271 +vn -0.1662 0.4842 0.8590 +vn 0.0681 0.2664 0.9614 +vn 0.3945 0.3689 0.8416 +vn -0.1015 0.3931 0.9139 +vn 0.0795 0.2949 0.9522 +vn 0.4868 0.4652 0.7393 +vn -0.3069 0.9394 -0.1530 +vn -0.3600 0.8895 -0.2814 +vn -0.3881 0.7934 -0.4690 +vn -0.3448 0.8754 -0.3389 +vn -0.2890 0.9556 -0.0580 +vn -0.3690 0.9178 -0.1464 +vn -0.3002 0.9534 -0.0285 +vn -0.3820 0.9228 -0.0509 +vn -0.3002 0.9535 -0.0281 +vn -0.3894 0.9205 -0.0323 +vn -0.2610 0.9628 -0.0698 +vn -0.3071 0.9440 -0.1204 +vn -0.2451 0.9687 -0.0399 +vn -0.2427 0.9700 -0.0103 +vn -0.2378 0.9710 0.0244 +vn -0.1717 0.9851 -0.0111 +vn -0.1773 0.9838 -0.0276 +vn -0.1597 0.9871 -0.0063 +vn -0.1709 0.9848 0.0302 +vn -0.1703 0.9847 0.0365 +vn -0.0883 0.9959 0.0199 +vn -0.0814 0.9966 0.0082 +vn -0.0832 0.9964 0.0144 +vn -0.0798 0.9963 0.0326 +vn -0.0535 0.9976 0.0438 +vn -0.4410 0.7584 -0.4800 +vn -0.4251 0.6621 -0.6172 +vn -0.3593 0.7423 -0.5655 +vn -0.4052 0.9141 -0.0170 +vn -0.3971 0.9166 -0.0465 +vn -0.3919 0.9199 -0.0110 +vn -0.0535 0.9960 0.0711 +vn -0.1082 0.9930 0.0469 +vn -0.3975 0.8335 -0.3837 +vn -0.3105 0.9502 0.0268 +vn -0.1786 0.9834 -0.0327 +vn -0.4275 0.8916 -0.1492 +vn -0.2472 0.9653 0.0843 +vn -0.3263 0.9373 -0.1224 +vn -0.4140 0.9067 -0.0808 +vn -0.1955 0.9768 0.0874 +vn -0.3907 0.8668 -0.3098 +vn -0.2346 0.9515 0.1990 +vn -0.2972 0.9498 0.0974 +vn -0.3439 0.9390 0.0091 +vn -0.2950 0.9447 0.1430 +vn -0.1997 0.9565 0.2129 +vn -0.3021 0.9212 0.2451 +vn -0.2352 0.9440 0.2314 +vn -0.3119 0.9187 0.2422 +vn -0.2547 0.9359 0.2432 +vn -0.3086 0.9144 0.2621 +vn -0.2319 0.9439 0.2351 +vn -0.2232 0.9669 0.1237 +vn -0.1836 0.9450 0.2708 +vn -0.1215 0.9672 0.2230 +vn -0.1525 0.9626 0.2241 +vn -0.1871 0.9494 0.2522 +vn -0.1999 0.9665 0.1608 +vn -0.2083 0.9180 0.3374 +vn -0.1419 0.9543 0.2631 +vn -0.0979 0.9721 0.2130 +vn -0.0588 0.9653 0.2544 +vn -0.0868 0.9779 0.1901 +vn -0.1073 0.9386 0.3279 +vn -0.1125 0.9439 0.3105 +vn -0.0731 0.9603 0.2692 +vn -0.3799 0.9248 -0.0220 +vn -0.3055 0.9091 0.2833 +vn -0.3293 0.8760 0.3525 +vn -0.3332 0.8758 0.3492 +vn -0.0271 0.9413 0.3366 +vn -0.3530 0.9227 0.1548 +vn -0.3055 0.8833 0.3556 +vn -0.3202 0.9173 0.2366 +vn -0.1798 0.9288 0.3240 +vn -0.2894 0.9293 0.2297 +vn -0.0869 0.9438 0.3188 +vn -0.2768 0.8053 0.5243 +vn -0.2767 0.8432 0.4610 +vn -0.2968 0.8461 0.4426 +vn -0.2773 0.7964 0.5375 +vn -0.3035 0.7536 0.5831 +vn -0.3050 0.7490 0.5881 +vn -0.2622 0.7294 0.6319 +vn -0.3160 0.7118 0.6272 +vn -0.2733 0.6986 0.6613 +vn -0.3243 0.6487 0.6885 +vn -0.2375 0.8220 0.5177 +vn -0.1965 0.8661 0.4597 +vn -0.2532 0.7667 0.5900 +vn -0.2340 0.7315 0.6404 +vn -0.2526 0.7163 0.6504 +vn -0.1358 0.8567 0.4975 +vn -0.0916 0.8938 0.4391 +vn -0.1938 0.7861 0.5870 +vn -0.2251 0.7268 0.6489 +vn -0.1848 0.7171 0.6720 +vn -0.0886 0.8743 0.4772 +vn -0.0530 0.9025 0.4274 +vn -0.1125 0.8165 0.5663 +vn -0.1765 0.7322 0.6578 +vn -0.1400 0.7001 0.7002 +vn -0.3093 0.8490 0.4285 +vn -0.3647 0.6308 0.6849 +vn -0.3095 0.6230 0.7183 +vn -0.3531 0.5799 0.7342 +vn -0.0782 0.6858 0.7236 +vn -0.2756 0.7997 0.5334 +vn -0.3506 0.5907 0.7267 +vn -0.2807 0.7542 0.5936 +vn -0.2440 0.6475 0.7219 +vn -0.3476 0.6942 0.6302 +vn -0.1232 0.6786 0.7241 +vn -0.2961 0.4638 0.8350 +vn -0.3007 0.5165 0.8018 +vn -0.3189 0.5255 0.7888 +vn -0.3100 0.4656 0.8289 +vn -0.2951 0.4593 0.8378 +vn -0.3175 0.4521 0.8336 +vn -0.2699 0.3736 0.8874 +vn -0.2960 0.3761 0.8780 +vn -0.2298 0.2830 0.9312 +vn -0.2105 0.3256 0.9218 +vn -0.2491 0.4973 0.8310 +vn -0.2293 0.5265 0.8187 +vn -0.2853 0.4579 0.8420 +vn -0.2176 0.3987 0.8909 +vn -0.2017 0.2911 0.9352 +vn -0.2365 0.5184 0.8218 +vn -0.1899 0.5542 0.8104 +vn -0.2481 0.4712 0.8464 +vn -0.2294 0.3738 0.8987 +vn -0.2196 0.2732 0.9366 +vn -0.1883 0.5430 0.8183 +vn -0.1430 0.5979 0.7887 +vn -0.2052 0.4821 0.8518 +vn -0.1962 0.3815 0.9033 +vn -0.2322 0.2589 0.9376 +vn -0.2854 0.5720 0.7690 +vn -0.1608 0.4440 0.8815 +vn -0.0934 0.4127 0.9061 +vn -0.1874 0.2968 0.9364 +vn -0.1524 0.2241 0.9626 +vn -0.2995 0.4569 0.8376 +vn -0.2099 0.2608 0.9423 +vn -0.3342 0.4390 0.8340 +vn -0.0605 0.3369 0.9396 +vn -0.2791 0.4523 0.8471 +vn -0.1265 0.2747 0.9532 +vn -0.0514 -0.9974 -0.0511 +vn -0.1528 -0.9882 -0.0089 +vn -0.1348 -0.9902 -0.0362 +vn -0.0798 -0.9965 -0.0263 +vn -0.1597 -0.9871 -0.0137 +vn -0.0894 -0.9957 -0.0262 +vn -0.1649 -0.9860 -0.0262 +vn -0.1000 -0.9938 -0.0495 +vn -0.1279 -0.9880 -0.0865 +vn -0.0650 -0.9910 -0.1171 +vn -0.2798 -0.9528 0.1182 +vn -0.2634 -0.9635 0.0485 +vn -0.2576 -0.9662 -0.0055 +vn -0.2564 -0.9665 -0.0079 +vn -0.2379 -0.9713 -0.0064 +vn -0.4180 -0.8716 0.2561 +vn -0.4103 -0.9009 0.1416 +vn -0.3710 -0.9257 0.0740 +vn -0.3418 -0.9383 0.0529 +vn -0.2961 -0.9544 0.0389 +vn -0.5152 -0.7334 0.4434 +vn -0.4829 -0.8282 0.2846 +vn -0.4494 -0.8740 0.1847 +vn -0.3978 -0.9068 0.1395 +vn -0.3521 -0.9307 0.0993 +vn 0.0600 -0.9947 -0.0833 +vn -0.0368 -0.9973 -0.0640 +vn 0.0297 -0.9989 -0.0367 +vn -0.0587 -0.9911 -0.1196 +vn -0.0661 -0.9950 -0.0742 +vn -0.0141 -0.9921 -0.1245 +vn -0.4269 -0.9027 -0.0533 +vn -0.3738 -0.9260 -0.0535 +vn -0.3914 -0.9123 0.1208 +vn -0.4978 -0.7043 0.5062 +vn -0.5175 -0.5628 0.6446 +vn -0.5265 -0.6569 0.5397 +vn 0.0150 -0.9998 -0.0158 +vn -0.1093 -0.9882 -0.1069 +vn -0.4350 -0.8690 0.2358 +vn -0.4170 -0.8280 0.3748 +vn 0.0025 -1.0000 -0.0083 +vn -0.1833 -0.9783 -0.0969 +vn -0.4928 -0.8257 0.2744 +vn -0.2908 -0.9448 0.1511 +vn 0.0066 -0.9976 -0.0688 +vn -0.3060 -0.9517 -0.0245 +vn -0.5074 -0.7857 0.3539 +vn -0.1738 -0.9845 0.0241 +vn -0.0743 -0.9902 -0.1183 +vn -0.1385 -0.9849 -0.1038 +vn -0.1294 -0.9660 -0.2240 +vn -0.0395 -0.9728 -0.2282 +vn -0.1150 -0.9366 -0.3309 +vn -0.0478 -0.9431 -0.3291 +vn -0.0717 -0.9383 -0.3382 +vn -0.0530 -0.9398 -0.3375 +vn -0.0718 -0.9441 -0.3216 +vn -0.0678 -0.9524 -0.2971 +vn -0.2110 -0.9639 -0.1626 +vn -0.2539 -0.9411 -0.2235 +vn -0.2461 -0.9270 -0.2832 +vn -0.1970 -0.9383 -0.2843 +vn -0.1587 -0.9353 -0.3163 +vn -0.3321 -0.9322 -0.1439 +vn -0.3234 -0.9139 -0.2455 +vn -0.3030 -0.9158 -0.2635 +vn -0.2696 -0.9260 -0.2642 +vn -0.2666 -0.9245 -0.2723 +vn -0.4215 -0.8965 -0.1366 +vn -0.4009 -0.8972 -0.1851 +vn -0.3665 -0.9065 -0.2096 +vn -0.3287 -0.9202 -0.2124 +vn -0.2836 -0.9198 -0.2712 +vn -0.0525 -0.9879 -0.1459 +vn -0.0603 -0.9365 -0.3455 +vn -0.0091 -0.9358 -0.3524 +vn 0.0030 -0.9530 -0.3029 +vn -0.3212 -0.8899 -0.3239 +vn -0.2921 -0.8990 -0.3262 +vn -0.3639 -0.9055 -0.2182 +vn -0.4311 -0.8924 -0.1331 +vn -0.0042 -0.9652 -0.2616 +vn -0.1137 -0.9362 -0.3327 +vn -0.4027 -0.8989 -0.1728 +vn -0.0002 -0.9493 -0.3144 +vn -0.1425 -0.9210 -0.3625 +vn -0.3995 -0.8950 -0.1985 +vn -0.0023 -0.9456 -0.3254 +vn -0.2431 -0.9152 -0.3213 +vn -0.4205 -0.8936 -0.1567 +vn -0.0394 -0.9146 -0.4024 +vn -0.0965 -0.9182 -0.3841 +vn -0.0750 -0.8754 -0.4775 +vn -0.0446 -0.8842 -0.4649 +vn -0.1138 -0.7995 -0.5898 +vn -0.0686 -0.8201 -0.5681 +vn -0.1693 -0.7595 -0.6281 +vn -0.1240 -0.7703 -0.6255 +vn -0.1344 -0.7437 -0.6549 +vn -0.0336 -0.7233 -0.6897 +vn -0.1520 -0.9152 -0.3733 +vn -0.1308 -0.8716 -0.4725 +vn -0.1201 -0.7913 -0.5995 +vn -0.1351 -0.7580 -0.6381 +vn -0.1355 -0.7522 -0.6448 +vn -0.2234 -0.9001 -0.3740 +vn -0.2371 -0.8583 -0.4551 +vn -0.2069 -0.7793 -0.5915 +vn -0.1708 -0.7381 -0.6527 +vn -0.2426 -0.7014 -0.6701 +vn -0.3147 -0.8697 -0.3802 +vn -0.3303 -0.8265 -0.4559 +vn -0.3059 -0.7695 -0.5606 +vn -0.2624 -0.7002 -0.6640 +vn -0.3637 -0.6125 -0.7018 +vn -0.0025 -0.9156 -0.4020 +vn 0.0419 -0.6902 -0.7224 +vn 0.1291 -0.6728 -0.7284 +vn 0.1102 -0.6969 -0.7086 +vn -0.4499 -0.5242 -0.7230 +vn -0.4462 -0.5536 -0.7032 +vn -0.3928 -0.5810 -0.7128 +vn -0.3594 -0.8504 -0.3843 +vn 0.0339 -0.8815 -0.4709 +vn -0.0860 -0.7066 -0.7024 +vn -0.3076 -0.6979 -0.6468 +vn 0.0280 -0.8306 -0.5561 +vn -0.1486 -0.6955 -0.7030 +vn -0.3263 -0.7713 -0.5465 +vn 0.0611 -0.7582 -0.6491 +vn -0.3205 -0.6355 -0.7024 +vn -0.3750 -0.8127 -0.4461 +vn 0.1044 -0.6290 -0.7704 +vn -0.0465 -0.6464 -0.7616 +vn 0.0084 -0.5410 -0.8410 +vn 0.1134 -0.5557 -0.8236 +vn -0.0357 -0.4293 -0.9025 +vn 0.0338 -0.4629 -0.8858 +vn -0.0591 -0.3292 -0.9424 +vn -0.0200 -0.3586 -0.9333 +vn -0.1309 -0.2855 -0.9494 +vn -0.0232 -0.2824 -0.9590 +vn -0.1693 -0.6381 -0.7511 +vn -0.1226 -0.5390 -0.8333 +vn -0.0702 -0.4161 -0.9066 +vn -0.0536 -0.3128 -0.9483 +vn -0.1208 -0.2830 -0.9515 +vn -0.2837 -0.5939 -0.7529 +vn -0.2712 -0.5236 -0.8076 +vn -0.1636 -0.3831 -0.9091 +vn -0.1680 -0.2663 -0.9491 +vn -0.1289 -0.2730 -0.9533 +vn -0.4394 -0.5277 -0.7270 +vn -0.4316 -0.4752 -0.7667 +vn -0.3228 -0.3291 -0.8874 +vn -0.2764 -0.2046 -0.9390 +vn -0.1948 -0.2253 -0.9546 +vn 0.1145 -0.6258 -0.7715 +vn 0.1043 -0.2121 -0.9717 +vn 0.0972 -0.2194 -0.9708 +vn 0.1278 -0.2679 -0.9549 +vn -0.0589 -0.3706 -0.9269 +vn 0.0376 -0.4016 -0.9150 +vn -0.2340 -0.2001 -0.9514 +vn -0.4804 -0.5124 -0.7118 +vn 0.1434 -0.5630 -0.8139 +vn 0.0584 -0.2397 -0.9691 +vn -0.3079 -0.2018 -0.9298 +vn 0.1427 -0.4899 -0.8600 +vn -0.0437 -0.2832 -0.9581 +vn -0.4199 -0.3625 -0.8320 +vn 0.0985 -0.3783 -0.9204 +vn -0.0516 -0.3195 -0.9462 +vn -0.4918 -0.4534 -0.7433 +vn 0.3796 -0.7941 0.4746 +vn 0.3608 -0.8907 0.2766 +vn 0.3029 -0.9394 0.1605 +vn 0.3481 -0.8726 0.3425 +vn 0.2883 -0.9555 0.0623 +vn 0.3833 -0.9129 0.1401 +vn 0.3112 -0.9500 0.0243 +vn 0.3847 -0.9214 0.0548 +vn 0.3033 -0.9525 0.0262 +vn 0.3905 -0.9198 0.0385 +vn 0.3105 -0.9431 0.1187 +vn 0.2658 -0.9617 0.0672 +vn 0.2420 -0.9694 0.0413 +vn 0.2372 -0.9714 0.0080 +vn 0.2429 -0.9695 -0.0325 +vn 0.1736 -0.9845 0.0241 +vn 0.1659 -0.9860 0.0131 +vn 0.1626 -0.9867 0.0031 +vn 0.1702 -0.9848 -0.0333 +vn 0.1680 -0.9851 -0.0366 +vn 0.0824 -0.9965 -0.0131 +vn 0.0864 -0.9961 -0.0174 +vn 0.0795 -0.9968 -0.0118 +vn 0.0787 -0.9963 -0.0346 +vn 0.0502 -0.9978 -0.0425 +vn 0.4190 -0.6780 0.6039 +vn 0.4320 -0.7711 0.4677 +vn 0.3654 -0.7460 0.5567 +vn 0.3961 -0.9181 0.0161 +vn 0.4104 -0.9102 0.0555 +vn 0.4170 -0.9086 0.0225 +vn 0.0508 -0.9960 -0.0731 +vn 0.1099 -0.9925 -0.0531 +vn 0.4110 -0.8284 0.3806 +vn 0.3059 -0.9517 -0.0254 +vn 0.1810 -0.9832 0.0253 +vn 0.4253 -0.8923 0.1513 +vn 0.2487 -0.9647 -0.0864 +vn 0.3415 -0.9322 0.1197 +vn 0.4145 -0.9061 0.0849 +vn 0.1966 -0.9764 -0.0899 +vn 0.3890 -0.8642 0.3190 +vn 0.3486 -0.9372 -0.0091 +vn 0.2940 -0.9507 -0.0986 +vn 0.2315 -0.9517 -0.2018 +vn 0.2954 -0.9440 -0.1472 +vn 0.1959 -0.9570 -0.2140 +vn 0.2993 -0.9232 -0.2410 +vn 0.2269 -0.9475 -0.2254 +vn 0.3048 -0.9228 -0.2357 +vn 0.2529 -0.9369 -0.2412 +vn 0.3103 -0.9134 -0.2636 +vn 0.2206 -0.9678 -0.1210 +vn 0.2294 -0.9437 -0.2385 +vn 0.1783 -0.9453 -0.2733 +vn 0.1205 -0.9686 -0.2174 +vn 0.1522 -0.9629 -0.2228 +vn 0.1996 -0.9660 -0.1643 +vn 0.1908 -0.9456 -0.2636 +vn 0.2073 -0.9184 -0.3371 +vn 0.1420 -0.9569 -0.2535 +vn 0.0957 -0.9724 -0.2128 +vn 0.0872 -0.9777 -0.1912 +vn 0.0597 -0.9652 -0.2546 +vn 0.1156 -0.9372 -0.3290 +vn 0.1133 -0.9458 -0.3042 +vn 0.0703 -0.9597 -0.2723 +vn 0.3920 -0.9197 0.0214 +vn 0.3385 -0.8729 -0.3513 +vn 0.3396 -0.8732 -0.3495 +vn 0.3186 -0.9029 -0.2886 +vn 0.0293 -0.9395 -0.3412 +vn 0.3556 -0.9222 -0.1517 +vn 0.2970 -0.8829 -0.3638 +vn 0.3153 -0.9213 -0.2274 +vn 0.1699 -0.9265 -0.3359 +vn 0.2942 -0.9278 -0.2292 +vn 0.0844 -0.9407 -0.3286 +vn 0.2960 -0.8467 -0.4420 +vn 0.2581 -0.8504 -0.4585 +vn 0.2756 -0.8065 -0.5230 +vn 0.2804 -0.7947 -0.5383 +vn 0.2960 -0.7498 -0.5917 +vn 0.3006 -0.7454 -0.5950 +vn 0.2548 -0.7243 -0.6407 +vn 0.3111 -0.7032 -0.6393 +vn 0.2776 -0.7029 -0.6549 +vn 0.3107 -0.6601 -0.6840 +vn 0.1792 -0.8721 -0.4554 +vn 0.2274 -0.8315 -0.5069 +vn 0.2537 -0.7599 -0.5985 +vn 0.2383 -0.7262 -0.6448 +vn 0.2626 -0.7150 -0.6480 +vn 0.0955 -0.8940 -0.4378 +vn 0.1227 -0.8659 -0.4850 +vn 0.1811 -0.7878 -0.5888 +vn 0.2335 -0.7223 -0.6510 +vn 0.1930 -0.7157 -0.6712 +vn 0.0623 -0.9012 -0.4290 +vn 0.0800 -0.8781 -0.4717 +vn 0.1038 -0.8183 -0.5653 +vn 0.1798 -0.7317 -0.6575 +vn 0.1342 -0.7031 -0.6983 +vn 0.3224 -0.8451 -0.4264 +vn 0.3466 -0.5855 -0.7328 +vn 0.2769 -0.6438 -0.7134 +vn 0.3334 -0.6511 -0.6818 +vn 0.0893 -0.6857 -0.7224 +vn 0.2804 -0.8006 -0.5296 +vn 0.3511 -0.5942 -0.7236 +vn 0.2822 -0.7502 -0.5980 +vn 0.2397 -0.6498 -0.7214 +vn 0.3371 -0.6895 -0.6411 +vn 0.1218 -0.6828 -0.7204 +vn 0.2975 -0.5373 -0.7892 +vn 0.3062 -0.5058 -0.8064 +vn 0.3006 -0.4609 -0.8350 +vn 0.3027 -0.4634 -0.8329 +vn 0.2983 -0.4636 -0.8343 +vn 0.3191 -0.4485 -0.8349 +vn 0.2740 -0.3762 -0.8851 +vn 0.3411 -0.3582 -0.8691 +vn 0.1736 -0.3238 -0.9301 +vn 0.2160 -0.3029 -0.9282 +vn 0.2397 -0.5220 -0.8186 +vn 0.2608 -0.4912 -0.8310 +vn 0.2954 -0.4487 -0.8435 +vn 0.2136 -0.3942 -0.8939 +vn 0.1664 -0.3127 -0.9352 +vn 0.2052 -0.5493 -0.8101 +vn 0.2355 -0.5174 -0.8227 +vn 0.2588 -0.4673 -0.8454 +vn 0.2308 -0.3667 -0.9012 +vn 0.2093 -0.2846 -0.9355 +vn 0.1433 -0.5986 -0.7881 +vn 0.1869 -0.5416 -0.8196 +vn 0.2164 -0.4745 -0.8532 +vn 0.1884 -0.3723 -0.9088 +vn 0.2201 -0.2578 -0.9408 +vn 0.2578 -0.5851 -0.7689 +vn 0.2864 -0.1144 -0.9512 +vn -0.3208 -0.7982 -0.5098 +vn 0.1923 -0.4642 -0.8646 +vn 0.0956 -0.2602 -0.9608 +vn 0.3123 -0.4280 -0.8481 +vn 0.2438 -0.2053 -0.9479 +vn 0.3368 -0.4327 -0.8363 +vn 0.1520 -0.2923 -0.9442 +vn 0.3285 -0.4113 -0.8503 +vn 0.0682 -0.3209 -0.9447 +vn -0.1194 0.0119 0.9928 +vn -0.0068 -0.0323 0.9995 +vn 0.0067 -0.0405 0.9992 +vn -0.1229 0.0351 0.9918 +vn -0.8192 0.3577 0.4482 +vn -0.7597 0.4628 0.4568 +vn -0.7632 0.4534 0.4604 +vn -0.8281 0.3495 0.4383 +vn -0.3454 0.7614 0.5487 +vn -0.2604 0.8111 0.5237 +vn -0.2659 0.7996 0.5384 +vn -0.3522 0.7491 0.5611 +vn 0.4174 0.4713 0.7770 +vn 0.3443 0.4932 0.7989 +vn 0.3530 0.5147 0.7813 +vn 0.4176 0.4715 0.7767 +vn -0.7677 0.4877 0.4156 +vn -0.7712 0.4768 0.4218 +vn 0.1715 0.3673 0.9141 +vn 0.1857 0.4067 0.8945 +vn -0.6374 0.6145 0.4649 +vn -0.6744 0.5918 0.4415 +vn 0.0064 0.2647 0.9643 +vn 0.0129 0.3035 0.9528 +vn -0.4762 0.6919 0.5427 +vn -0.4853 0.6776 0.5526 +vn -0.1137 0.1365 0.9841 +vn -0.1227 0.1752 0.9769 +vn -0.9027 0.4071 0.1393 +vn -0.9170 0.3572 0.1774 +vn -0.9151 0.3644 0.1727 +vn -0.9031 0.4055 0.1413 +vn -0.8579 0.3668 0.3598 +vn -0.8617 0.3632 0.3543 +vn -0.9431 0.3126 0.1129 +vn -0.9395 0.3238 0.1114 +vn -0.9685 0.2147 0.1259 +vn -0.9690 0.2126 0.1259 +vn -0.9116 0.3215 0.2563 +vn -0.9174 0.3082 0.2519 +vn -0.8486 0.5195 0.1000 +vn -0.8117 0.5361 0.2320 +vn -0.8112 0.5393 0.2260 +vn -0.8533 0.5134 0.0916 +vn -0.9253 0.3750 0.0559 +vn -0.9248 0.3763 0.0565 +vn -0.8742 0.4591 0.1578 +vn -0.8693 0.4655 0.1662 +vn -0.9332 0.3582 0.0287 +vn -0.9328 0.3593 0.0285 +vn -0.8786 0.4714 0.0762 +vn -0.8789 0.4708 0.0760 +vn -0.0217 0.9817 -0.1895 +vn -0.2244 0.9508 -0.2135 +vn -0.1844 0.9656 -0.1836 +vn -0.0258 0.9737 -0.2264 +vn -0.6125 0.7823 0.1137 +vn -0.6617 0.7482 0.0481 +vn -0.6614 0.7486 0.0469 +vn -0.6556 0.7493 0.0937 +vn -0.6117 0.7908 -0.0215 +vn -0.6308 0.7709 -0.0884 +vn -0.8588 0.5117 -0.0225 +vn -0.8589 0.5117 -0.0215 +vn -0.3226 0.9046 -0.2787 +vn -0.2657 0.9329 -0.2430 +vn -0.6506 0.7438 0.1535 +vn -0.6478 0.7469 0.1498 +vn -0.4240 0.8649 -0.2684 +vn -0.3968 0.8773 -0.2701 +vn -0.7117 0.6965 0.0914 +vn -0.7058 0.7013 0.1002 +vn -0.4917 0.8484 -0.1962 +vn -0.5031 0.8358 -0.2198 +vn -0.7789 0.6271 -0.0005 +vn -0.7721 0.6354 0.0087 +vn 0.3218 0.7219 0.6126 +vn 0.3351 0.7198 0.6079 +vn 0.3232 0.7288 0.6036 +vn 0.3232 0.7204 0.6136 +vn -0.1903 0.3025 0.9339 +vn -0.3136 0.4070 0.8579 +vn -0.2788 0.3869 0.8789 +vn -0.1736 0.2891 0.9414 +vn 0.8342 0.3493 0.4268 +vn 0.9128 0.2299 0.3375 +vn 0.9081 0.2406 0.3427 +vn 0.8289 0.3633 0.4254 +vn 0.0197 0.0792 0.9967 +vn 0.0349 0.0525 0.9980 +vn 0.5069 0.6170 0.6020 +vn 0.4733 0.6463 0.5985 +vn -0.0425 0.1588 0.9864 +vn -0.0340 0.1478 0.9884 +vn 0.7271 0.4241 0.5398 +vn 0.7194 0.4432 0.5348 +vn -0.0607 0.1726 0.9831 +vn -0.0455 0.1574 0.9865 +vn 0.7671 0.4228 0.4825 +vn 0.7663 0.4274 0.4796 +vn -0.1884 0.2797 0.9414 +vn -0.1721 0.2664 0.9484 +vn 0.9220 0.2065 0.3275 +vn 0.9229 0.2064 0.3250 +vn 0.9354 0.3287 0.1301 +vn 0.9515 0.2909 0.1003 +vn 0.9518 0.2907 0.0982 +vn 0.9360 0.3274 0.1291 +vn 0.9280 0.2679 0.2591 +vn 0.9269 0.2622 0.2684 +vn 0.9375 0.2823 0.2037 +vn 0.9367 0.2867 0.2009 +vn 0.9538 0.2517 0.1640 +vn 0.9536 0.2473 0.1718 +vn 0.9256 0.3633 0.1063 +vn 0.9253 0.3642 0.1061 +vn 0.9002 0.4274 0.0832 +vn 0.8993 0.4373 -0.0104 +vn 0.8974 0.4413 -0.0037 +vn 0.9001 0.4270 0.0865 +vn 0.9522 0.3045 0.0245 +vn 0.9517 0.3061 0.0219 +vn 0.9251 0.3686 0.0910 +vn 0.9269 0.3646 0.0888 +vn 0.9165 0.3846 0.1099 +vn 0.9168 0.3845 0.1075 +vn 0.8742 0.4637 -0.1442 +vn 0.8693 0.4685 -0.1574 +vn 0.6904 0.7122 -0.1269 +vn 0.5078 0.6397 -0.5770 +vn 0.4626 0.6331 -0.6207 +vn 0.6898 0.7184 -0.0900 +vn 0.4993 0.7935 -0.3480 +vn 0.4243 0.7808 -0.4585 +vn 0.1875 0.9440 -0.2714 +vn 0.1410 0.9365 -0.3209 +vn 0.7906 0.6122 -0.0109 +vn 0.7942 0.6071 -0.0246 +vn 0.4433 0.8384 -0.3172 +vn 0.4245 0.8377 -0.3436 +vn 0.7584 0.6514 0.0204 +vn 0.7598 0.6497 0.0251 +vn 0.3475 0.8839 -0.3131 +vn 0.3539 0.8797 -0.3176 +vn 0.7429 0.6575 -0.1255 +vn 0.7446 0.6561 -0.1229 +vn 0.2424 0.9136 -0.3266 +vn 0.2344 0.9128 -0.3345 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_02 +s 1 +f 1301/651/1597 1302/652/1598 1303/653/1599 1304/654/1600 +f 1305/655/1601 1301/651/1597 1304/654/1600 1306/656/1602 +f 1307/657/1603 1305/655/1601 1306/656/1602 1308/658/1604 +f 1309/659/1605 1307/657/1603 1308/658/1604 1310/660/1606 +f 1311/661/1607 1312/662/1608 1302/652/1598 1301/651/1597 +f 1313/663/1609 1311/661/1607 1301/651/1597 1305/655/1601 +f 1314/664/1610 1313/663/1609 1305/655/1601 1307/657/1603 +f 1315/665/1611 1314/664/1610 1307/657/1603 1309/659/1605 +f 1316/666/1612 1317/667/1613 1312/662/1608 1311/661/1607 +f 1318/668/1614 1316/666/1612 1311/661/1607 1313/663/1609 +f 1319/669/1615 1318/668/1614 1313/663/1609 1314/664/1610 +f 1320/670/1616 1319/669/1615 1314/664/1610 1315/665/1611 +f 1321/671/1617 1322/672/1618 1317/667/1613 1316/666/1612 +f 1323/673/1619 1321/671/1617 1316/666/1612 1318/668/1614 +f 1324/674/1620 1323/673/1619 1318/668/1614 1319/669/1615 +f 1325/675/1621 1324/674/1620 1319/669/1615 1320/670/1616 +f 1303/653/1599 1326/676/1622 1327/677/1623 1328/678/1624 +f 1329/679/1625 1330/680/1626 1331/681/1627 1310/660/1606 +f 1325/675/1621 1332/682/1628 1333/683/1629 1334/684/1630 +f 1335/685/1631 1336/686/1632 1337/687/1633 1322/672/1618 +f 1304/654/1600 1303/653/1599 1328/678/1624 1338/688/1634 +f 1310/660/1606 1331/681/1627 1339/689/1635 1309/659/1605 +f 1324/674/1620 1325/675/1621 1334/684/1630 1340/690/1636 +f 1322/672/1618 1337/687/1633 1341/691/1637 1317/667/1613 +f 1306/656/1602 1304/654/1600 1338/688/1634 1342/692/1638 +f 1309/659/1605 1339/689/1635 1343/693/1639 1315/665/1611 +f 1323/673/1619 1324/674/1620 1340/690/1636 1344/694/1640 +f 1317/667/1613 1341/691/1637 1345/695/1641 1312/662/1608 +f 1308/658/1604 1306/656/1602 1342/692/1638 1346/696/1642 +f 1315/665/1611 1343/693/1639 1347/697/1643 1320/670/1616 +f 1321/671/1617 1323/673/1619 1344/694/1640 1348/698/1644 +f 1312/662/1608 1345/695/1641 1349/699/1645 1302/652/1598 +f 1310/660/1606 1308/658/1604 1346/696/1642 1329/679/1625 +f 1320/670/1616 1347/697/1643 1332/682/1628 1325/675/1621 +f 1322/672/1618 1321/671/1617 1348/698/1644 1335/685/1631 +f 1302/652/1598 1349/699/1645 1326/676/1622 1303/653/1599 +f 1350/700/1646 1351/701/1647 1352/702/1648 1353/703/1649 +f 1354/704/1650 1350/700/1646 1353/703/1649 1355/705/1651 +f 1356/706/1652 1354/704/1650 1355/705/1651 1357/707/1653 +f 1358/708/1654 1356/706/1652 1357/707/1653 1359/709/1655 +f 1360/710/1656 1361/711/1657 1351/701/1647 1350/700/1646 +f 1362/712/1658 1360/710/1656 1350/700/1646 1354/704/1650 +f 1363/713/1659 1362/712/1658 1354/704/1650 1356/706/1652 +f 1364/714/1660 1363/713/1659 1356/706/1652 1358/708/1654 +f 1365/715/1661 1366/716/1662 1361/711/1657 1360/710/1656 +f 1367/717/1663 1365/715/1661 1360/710/1656 1362/712/1658 +f 1368/718/1664 1367/717/1663 1362/712/1658 1363/713/1659 +f 1369/719/1665 1368/718/1664 1363/713/1659 1364/714/1660 +f 1370/720/1666 1371/721/1667 1366/716/1662 1365/715/1661 +f 1372/722/1668 1370/720/1666 1365/715/1661 1367/717/1663 +f 1373/723/1669 1372/722/1668 1367/717/1663 1368/718/1664 +f 1374/724/1670 1373/723/1669 1368/718/1664 1369/719/1665 +f 1352/702/1648 1331/681/1627 1330/680/1626 1375/725/1671 +f 1376/726/1672 1377/727/1673 1378/728/1674 1359/709/1655 +f 1374/724/1670 1379/729/1675 1380/730/1676 1381/731/1677 +f 1382/732/1678 1333/683/1629 1332/682/1628 1371/721/1667 +f 1353/703/1649 1352/702/1648 1375/725/1671 1383/733/1679 +f 1359/709/1655 1378/728/1674 1384/734/1680 1358/708/1654 +f 1373/723/1669 1374/724/1670 1381/731/1677 1385/735/1681 +f 1371/721/1667 1332/682/1628 1347/697/1643 1366/716/1662 +f 1355/705/1651 1353/703/1649 1383/733/1679 1386/736/1682 +f 1358/708/1654 1384/734/1680 1387/737/1683 1364/714/1660 +f 1372/722/1668 1373/723/1669 1385/735/1681 1388/738/1684 +f 1366/716/1662 1347/697/1643 1343/693/1639 1361/711/1657 +f 1357/707/1653 1355/705/1651 1386/736/1682 1389/739/1685 +f 1364/714/1660 1387/737/1683 1390/740/1686 1369/719/1665 +f 1370/720/1666 1372/722/1668 1388/738/1684 1391/741/1687 +f 1361/711/1657 1343/693/1639 1339/689/1635 1351/701/1647 +f 1359/709/1655 1357/707/1653 1389/739/1685 1376/726/1672 +f 1369/719/1665 1390/740/1686 1379/729/1675 1374/724/1670 +f 1371/721/1667 1370/720/1666 1391/741/1687 1382/732/1678 +f 1351/701/1647 1339/689/1635 1331/681/1627 1352/702/1648 +f 1392/742/1688 1393/743/1689 1394/744/1690 1395/745/1691 +f 1396/746/1692 1392/742/1688 1395/745/1691 1397/747/1693 +f 1398/748/1694 1396/746/1692 1397/747/1693 1399/749/1695 +f 1400/750/1696 1398/748/1694 1399/749/1695 1401/751/1697 +f 1402/752/1698 1403/753/1699 1393/743/1689 1392/742/1688 +f 1404/754/1700 1402/752/1698 1392/742/1688 1396/746/1692 +f 1405/755/1701 1404/754/1700 1396/746/1692 1398/748/1694 +f 1406/756/1702 1405/755/1701 1398/748/1694 1400/750/1696 +f 1407/757/1703 1408/758/1704 1403/753/1699 1402/752/1698 +f 1409/759/1705 1407/757/1703 1402/752/1698 1404/754/1700 +f 1410/760/1706 1409/759/1705 1404/754/1700 1405/755/1701 +f 1411/761/1707 1410/760/1706 1405/755/1701 1406/756/1702 +f 1412/762/1708 1413/763/1709 1408/758/1704 1407/757/1703 +f 1414/764/1710 1412/762/1708 1407/757/1703 1409/759/1705 +f 1415/765/1711 1414/764/1710 1409/759/1705 1410/760/1706 +f 1416/766/1712 1415/765/1711 1410/760/1706 1411/761/1707 +f 1394/744/1690 1378/728/1674 1377/727/1673 1417/767/1713 +f 1418/768/1714 1419/769/1715 1420/770/1716 1401/751/1697 +f 1416/766/1712 1421/771/1717 1422/772/1718 1423/773/1719 +f 1424/774/1720 1380/730/1676 1379/729/1675 1413/763/1709 +f 1395/745/1691 1394/744/1690 1417/767/1713 1425/775/1721 +f 1401/751/1697 1420/770/1716 1426/776/1722 1400/750/1696 +f 1415/765/1711 1416/766/1712 1423/773/1719 1427/777/1723 +f 1413/763/1709 1379/729/1675 1390/740/1686 1408/758/1704 +f 1397/747/1693 1395/745/1691 1425/775/1721 1428/778/1724 +f 1400/750/1696 1426/776/1722 1429/779/1725 1406/756/1702 +f 1414/764/1710 1415/765/1711 1427/777/1723 1430/780/1726 +f 1408/758/1704 1390/740/1686 1387/737/1683 1403/753/1699 +f 1399/749/1695 1397/747/1693 1428/778/1724 1431/781/1727 +f 1406/756/1702 1429/779/1725 1432/782/1728 1411/761/1707 +f 1412/762/1708 1414/764/1710 1430/780/1726 1433/783/1729 +f 1403/753/1699 1387/737/1683 1384/734/1680 1393/743/1689 +f 1401/751/1697 1399/749/1695 1431/781/1727 1418/768/1714 +f 1411/761/1707 1432/782/1728 1421/771/1717 1416/766/1712 +f 1413/763/1709 1412/762/1708 1433/783/1729 1424/774/1720 +f 1393/743/1689 1384/734/1680 1378/728/1674 1394/744/1690 +f 1434/784/1730 1435/785/1731 1436/786/1732 1437/787/1733 +f 1438/788/1734 1434/784/1730 1437/787/1733 1439/789/1735 +f 1440/790/1736 1438/788/1734 1439/789/1735 1441/791/1737 +f 1442/792/1738 1440/790/1736 1441/791/1737 1443/793/1739 +f 1444/794/1740 1445/795/1741 1435/785/1731 1434/784/1730 +f 1446/796/1742 1444/794/1740 1434/784/1730 1438/788/1734 +f 1447/797/1743 1446/796/1742 1438/788/1734 1440/790/1736 +f 1448/798/1744 1447/797/1743 1440/790/1736 1442/792/1738 +f 1449/799/1745 1450/800/1746 1445/795/1741 1444/794/1740 +f 1451/801/1747 1449/799/1745 1444/794/1740 1446/796/1742 +f 1452/802/1748 1451/801/1747 1446/796/1742 1447/797/1743 +f 1453/803/1749 1452/802/1748 1447/797/1743 1448/798/1744 +f 1454/804/1750 1455/805/1751 1450/800/1746 1449/799/1745 +f 1456/806/1752 1454/804/1750 1449/799/1745 1451/801/1747 +f 1457/807/1753 1456/806/1752 1451/801/1747 1452/802/1748 +f 1458/808/1754 1457/807/1753 1452/802/1748 1453/803/1749 +f 1436/786/1732 1420/770/1716 1419/769/1715 1459/809/1755 +f 1460/810/1756 1461/811/1757 1462/812/1758 1443/793/1739 +f 1458/808/1754 1463/813/1759 1464/814/1760 1465/815/1761 +f 1466/816/1762 1422/772/1718 1421/771/1717 1455/805/1751 +f 1437/787/1733 1436/786/1732 1459/809/1755 1467/817/1763 +f 1443/793/1739 1462/812/1758 1468/818/1764 1442/792/1738 +f 1457/807/1753 1458/808/1754 1465/815/1761 1469/819/1765 +f 1455/805/1751 1421/771/1717 1432/782/1728 1450/800/1746 +f 1439/789/1735 1437/787/1733 1467/817/1763 1470/820/1766 +f 1442/792/1738 1468/818/1764 1471/821/1767 1448/798/1744 +f 1456/806/1752 1457/807/1753 1469/819/1765 1472/822/1768 +f 1450/800/1746 1432/782/1728 1429/779/1725 1445/795/1741 +f 1441/791/1737 1439/789/1735 1470/820/1766 1473/823/1769 +f 1448/798/1744 1471/821/1767 1474/824/1770 1453/803/1749 +f 1454/804/1750 1456/806/1752 1472/822/1768 1475/825/1771 +f 1445/795/1741 1429/779/1725 1426/776/1722 1435/785/1731 +f 1443/793/1739 1441/791/1737 1473/823/1769 1460/810/1756 +f 1453/803/1749 1474/824/1770 1463/813/1759 1458/808/1754 +f 1455/805/1751 1454/804/1750 1475/825/1771 1466/816/1762 +f 1435/785/1731 1426/776/1722 1420/770/1716 1436/786/1732 +f 1476/826/1772 1477/827/1773 1478/828/1774 1479/829/1775 +f 1480/830/1776 1476/826/1772 1479/829/1775 1481/831/1777 +f 1482/832/1778 1480/830/1776 1481/831/1777 1483/833/1779 +f 1484/834/1780 1482/832/1778 1483/833/1779 1485/835/1781 +f 1486/836/1782 1487/837/1783 1477/827/1773 1476/826/1772 +f 1488/838/1784 1486/836/1782 1476/826/1772 1480/830/1776 +f 1489/839/1785 1488/838/1784 1480/830/1776 1482/832/1778 +f 1490/840/1786 1489/839/1785 1482/832/1778 1484/834/1780 +f 1491/841/1787 1492/842/1788 1487/837/1783 1486/836/1782 +f 1493/843/1789 1491/841/1787 1486/836/1782 1488/838/1784 +f 1494/844/1790 1493/843/1789 1488/838/1784 1489/839/1785 +f 1495/845/1791 1494/844/1790 1489/839/1785 1490/840/1786 +f 1496/846/1792 1497/847/1793 1492/842/1788 1491/841/1787 +f 1498/848/1794 1496/846/1792 1491/841/1787 1493/843/1789 +f 1499/849/1795 1498/848/1794 1493/843/1789 1494/844/1790 +f 1500/850/1796 1499/849/1795 1494/844/1790 1495/845/1791 +f 1478/828/1774 1501/851/1797 1502/852/1798 1503/853/1799 +f 1504/854/1800 1505/855/1801 1506/856/1802 1485/835/1781 +f 1500/850/1796 1507/857/1803 1330/680/1626 1329/679/1625 +f 1328/678/1624 1327/677/1623 1508/858/1804 1497/847/1793 +f 1479/829/1775 1478/828/1774 1503/853/1799 1509/859/1805 +f 1485/835/1781 1506/856/1802 1510/860/1806 1484/834/1780 +f 1499/849/1795 1500/850/1796 1329/679/1625 1346/696/1642 +f 1497/847/1793 1508/858/1804 1511/861/1807 1492/842/1788 +f 1481/831/1777 1479/829/1775 1509/859/1805 1512/862/1808 +f 1484/834/1780 1510/860/1806 1513/863/1809 1490/840/1786 +f 1498/848/1794 1499/849/1795 1346/696/1642 1342/692/1638 +f 1492/842/1788 1511/861/1807 1514/864/1810 1487/837/1783 +f 1483/833/1779 1481/831/1777 1512/862/1808 1515/865/1811 +f 1490/840/1786 1513/863/1809 1516/866/1812 1495/845/1791 +f 1496/846/1792 1498/848/1794 1342/692/1638 1338/688/1634 +f 1487/837/1783 1514/864/1810 1517/867/1813 1477/827/1773 +f 1485/835/1781 1483/833/1779 1515/865/1811 1504/854/1800 +f 1495/845/1791 1516/866/1812 1507/857/1803 1500/850/1796 +f 1497/847/1793 1496/846/1792 1338/688/1634 1328/678/1624 +f 1477/827/1773 1517/867/1813 1501/851/1797 1478/828/1774 +f 1518/868/1814 1519/869/1815 1520/870/1816 1521/871/1817 +f 1522/872/1818 1518/868/1814 1521/871/1817 1523/873/1819 +f 1524/874/1820 1522/872/1818 1523/873/1819 1525/875/1821 +f 1526/876/1822 1524/874/1820 1525/875/1821 1527/877/1823 +f 1528/878/1824 1529/879/1825 1519/869/1815 1518/868/1814 +f 1530/880/1826 1528/878/1824 1518/868/1814 1522/872/1818 +f 1531/881/1827 1530/880/1826 1522/872/1818 1524/874/1820 +f 1532/882/1828 1531/881/1827 1524/874/1820 1526/876/1822 +f 1533/883/1829 1534/884/1830 1529/879/1825 1528/878/1824 +f 1535/885/1831 1533/883/1829 1528/878/1824 1530/880/1826 +f 1536/886/1832 1535/885/1831 1530/880/1826 1531/881/1827 +f 1537/887/1833 1536/886/1832 1531/881/1827 1532/882/1828 +f 1538/888/1834 1539/889/1835 1534/884/1830 1533/883/1829 +f 1540/890/1836 1538/888/1834 1533/883/1829 1535/885/1831 +f 1541/891/1837 1540/890/1836 1535/885/1831 1536/886/1832 +f 1542/892/1838 1541/891/1837 1536/886/1832 1537/887/1833 +f 1520/870/1816 1506/856/1802 1505/855/1801 1543/893/1839 +f 1544/894/1840 1545/895/1841 1546/896/1842 1527/877/1823 +f 1542/892/1838 1547/897/1843 1377/727/1673 1376/726/1672 +f 1375/725/1671 1330/680/1626 1507/857/1803 1539/889/1835 +f 1521/871/1817 1520/870/1816 1543/893/1839 1548/898/1844 +f 1527/877/1823 1546/896/1842 1549/899/1845 1526/876/1822 +f 1541/891/1837 1542/892/1838 1376/726/1672 1389/739/1685 +f 1539/889/1835 1507/857/1803 1516/866/1812 1534/884/1830 +f 1523/873/1819 1521/871/1817 1548/898/1844 1550/900/1846 +f 1526/876/1822 1549/899/1845 1551/901/1847 1532/882/1828 +f 1540/890/1836 1541/891/1837 1389/739/1685 1386/736/1682 +f 1534/884/1830 1516/866/1812 1513/863/1809 1529/879/1825 +f 1525/875/1821 1523/873/1819 1550/900/1846 1552/902/1848 +f 1532/882/1828 1551/901/1847 1553/903/1849 1537/887/1833 +f 1538/888/1834 1540/890/1836 1386/736/1682 1383/733/1679 +f 1529/879/1825 1513/863/1809 1510/860/1806 1519/869/1815 +f 1527/877/1823 1525/875/1821 1552/902/1848 1544/894/1840 +f 1537/887/1833 1553/903/1849 1547/897/1843 1542/892/1838 +f 1539/889/1835 1538/888/1834 1383/733/1679 1375/725/1671 +f 1519/869/1815 1510/860/1806 1506/856/1802 1520/870/1816 +f 1554/904/1850 1555/905/1851 1556/906/1852 1557/907/1853 +f 1558/908/1854 1554/904/1850 1557/907/1853 1559/909/1855 +f 1560/910/1856 1558/908/1854 1559/909/1855 1561/911/1857 +f 1562/912/1858 1560/910/1856 1561/911/1857 1563/913/1859 +f 1564/914/1860 1565/915/1861 1555/905/1851 1554/904/1850 +f 1566/916/1862 1564/914/1860 1554/904/1850 1558/908/1854 +f 1567/917/1863 1566/916/1862 1558/908/1854 1560/910/1856 +f 1568/918/1864 1567/917/1863 1560/910/1856 1562/912/1858 +f 1569/919/1865 1570/920/1866 1565/915/1861 1564/914/1860 +f 1571/921/1867 1569/919/1865 1564/914/1860 1566/916/1862 +f 1572/922/1868 1571/921/1867 1566/916/1862 1567/917/1863 +f 1573/923/1869 1572/922/1868 1567/917/1863 1568/918/1864 +f 1574/924/1870 1575/925/1871 1570/920/1866 1569/919/1865 +f 1576/926/1872 1574/924/1870 1569/919/1865 1571/921/1867 +f 1577/927/1873 1576/926/1872 1571/921/1867 1572/922/1868 +f 1578/928/1874 1577/927/1873 1572/922/1868 1573/923/1869 +f 1556/906/1852 1546/896/1842 1545/895/1841 1579/929/1875 +f 1580/930/1876 1581/931/1877 1582/932/1878 1563/913/1859 +f 1578/928/1874 1583/933/1879 1419/769/1715 1418/768/1714 +f 1417/767/1713 1377/727/1673 1547/897/1843 1575/925/1871 +f 1557/907/1853 1556/906/1852 1579/929/1875 1584/934/1880 +f 1563/913/1859 1582/932/1878 1585/935/1881 1562/912/1858 +f 1577/927/1873 1578/928/1874 1418/768/1714 1431/781/1727 +f 1575/925/1871 1547/897/1843 1553/903/1849 1570/920/1866 +f 1559/909/1855 1557/907/1853 1584/934/1880 1586/936/1882 +f 1562/912/1858 1585/935/1881 1587/937/1883 1568/918/1864 +f 1576/926/1872 1577/927/1873 1431/781/1727 1428/778/1724 +f 1570/920/1866 1553/903/1849 1551/901/1847 1565/915/1861 +f 1561/911/1857 1559/909/1855 1586/936/1882 1588/938/1884 +f 1568/918/1864 1587/937/1883 1589/939/1885 1573/923/1869 +f 1574/924/1870 1576/926/1872 1428/778/1724 1425/775/1721 +f 1565/915/1861 1551/901/1847 1549/899/1845 1555/905/1851 +f 1563/913/1859 1561/911/1857 1588/938/1884 1580/930/1876 +f 1573/923/1869 1589/939/1885 1583/933/1879 1578/928/1874 +f 1575/925/1871 1574/924/1870 1425/775/1721 1417/767/1713 +f 1555/905/1851 1549/899/1845 1546/896/1842 1556/906/1852 +f 1590/940/1886 1591/941/1887 1592/942/1888 1593/943/1889 +f 1594/944/1890 1590/940/1886 1593/943/1889 1595/945/1891 +f 1596/946/1892 1594/944/1890 1595/945/1891 1597/947/1893 +f 1598/948/1894 1596/946/1892 1597/947/1893 1599/949/1895 +f 1600/950/1896 1601/951/1897 1591/941/1887 1590/940/1886 +f 1602/952/1898 1600/950/1896 1590/940/1886 1594/944/1890 +f 1603/953/1899 1602/952/1898 1594/944/1890 1596/946/1892 +f 1604/954/1900 1603/953/1899 1596/946/1892 1598/948/1894 +f 1605/955/1901 1606/956/1902 1601/951/1897 1600/950/1896 +f 1607/957/1903 1605/955/1901 1600/950/1896 1602/952/1898 +f 1608/958/1904 1607/957/1903 1602/952/1898 1603/953/1899 +f 1609/959/1905 1608/958/1904 1603/953/1899 1604/954/1900 +f 1610/960/1906 1611/961/1907 1606/956/1902 1605/955/1901 +f 1612/962/1908 1610/960/1906 1605/955/1901 1607/957/1903 +f 1613/963/1909 1612/962/1908 1607/957/1903 1608/958/1904 +f 1614/964/1910 1613/963/1909 1608/958/1904 1609/959/1905 +f 1592/942/1888 1582/932/1878 1581/931/1877 1615/965/1911 +f 1616/966/1912 1617/967/1913 1618/968/1914 1599/949/1895 +f 1614/964/1910 1619/969/1915 1461/811/1757 1460/810/1756 +f 1459/809/1755 1419/769/1715 1583/933/1879 1611/961/1907 +f 1593/943/1889 1592/942/1888 1615/965/1911 1620/970/1916 +f 1599/949/1895 1618/968/1914 1621/971/1917 1598/948/1894 +f 1613/963/1909 1614/964/1910 1460/810/1756 1473/823/1769 +f 1611/961/1907 1583/933/1879 1589/939/1885 1606/956/1902 +f 1595/945/1891 1593/943/1889 1620/970/1916 1622/972/1918 +f 1598/948/1894 1621/971/1917 1623/973/1919 1604/954/1900 +f 1612/962/1908 1613/963/1909 1473/823/1769 1470/820/1766 +f 1606/956/1902 1589/939/1885 1587/937/1883 1601/951/1897 +f 1597/947/1893 1595/945/1891 1622/972/1918 1624/974/1920 +f 1604/954/1900 1623/973/1919 1625/975/1921 1609/959/1905 +f 1610/960/1906 1612/962/1908 1470/820/1766 1467/817/1763 +f 1601/951/1897 1587/937/1883 1585/935/1881 1591/941/1887 +f 1599/949/1895 1597/947/1893 1624/974/1920 1616/966/1912 +f 1609/959/1905 1625/975/1921 1619/969/1915 1614/964/1910 +f 1611/961/1907 1610/960/1906 1467/817/1763 1459/809/1755 +f 1591/941/1887 1585/935/1881 1582/932/1878 1592/942/1888 +f 1626/653/1922 1627/652/1923 1628/651/1924 1629/654/1925 +f 1629/654/1925 1628/651/1924 1630/655/1926 1631/656/1927 +f 1631/656/1927 1630/655/1926 1632/657/1928 1633/658/1929 +f 1633/658/1929 1632/657/1928 1634/659/1930 1635/660/1931 +f 1627/652/1923 1636/662/1932 1637/661/1933 1628/651/1924 +f 1628/651/1924 1637/661/1933 1638/663/1934 1630/655/1926 +f 1630/655/1926 1638/663/1934 1639/664/1935 1632/657/1928 +f 1632/657/1928 1639/664/1935 1640/665/1936 1634/659/1930 +f 1636/662/1932 1641/667/1937 1642/666/1938 1637/661/1933 +f 1637/661/1933 1642/666/1938 1643/668/1939 1638/663/1934 +f 1638/663/1934 1643/668/1939 1644/669/1940 1639/664/1935 +f 1639/664/1935 1644/669/1940 1645/670/1941 1640/665/1936 +f 1641/667/1937 1646/672/1942 1647/671/1943 1642/666/1938 +f 1642/666/1938 1647/671/1943 1648/673/1944 1643/668/1939 +f 1643/668/1939 1648/673/1944 1649/674/1945 1644/669/1940 +f 1644/669/1940 1649/674/1945 1650/675/1946 1645/670/1941 +f 1651/677/1947 1652/676/1948 1626/653/1922 1653/678/1949 +f 1654/681/1950 1655/680/1951 1656/679/1952 1635/660/1931 +f 1657/683/1953 1658/682/1954 1650/675/1946 1659/684/1955 +f 1660/687/1956 1661/686/1957 1662/685/1958 1646/672/1942 +f 1653/678/1949 1626/653/1922 1629/654/1925 1663/688/1959 +f 1664/689/1960 1654/681/1950 1635/660/1931 1634/659/1930 +f 1659/684/1955 1650/675/1946 1649/674/1945 1665/690/1961 +f 1666/691/1962 1660/687/1956 1646/672/1942 1641/667/1937 +f 1663/688/1959 1629/654/1925 1631/656/1927 1667/692/1963 +f 1668/693/1964 1664/689/1960 1634/659/1930 1640/665/1936 +f 1665/690/1961 1649/674/1945 1648/673/1944 1669/694/1965 +f 1670/695/1966 1666/691/1962 1641/667/1937 1636/662/1932 +f 1667/692/1963 1631/656/1927 1633/658/1929 1671/696/1967 +f 1672/697/1968 1668/693/1964 1640/665/1936 1645/670/1941 +f 1669/694/1965 1648/673/1944 1647/671/1943 1673/698/1969 +f 1674/699/1970 1670/695/1966 1636/662/1932 1627/652/1923 +f 1671/696/1967 1633/658/1929 1635/660/1931 1656/679/1952 +f 1658/682/1954 1672/697/1968 1645/670/1941 1650/675/1946 +f 1673/698/1969 1647/671/1943 1646/672/1942 1662/685/1958 +f 1652/676/1948 1674/699/1970 1627/652/1923 1626/653/1922 +f 1675/702/1971 1676/701/1972 1677/700/1973 1678/703/1974 +f 1678/703/1974 1677/700/1973 1679/704/1975 1680/705/1976 +f 1680/705/1976 1679/704/1975 1681/706/1977 1682/707/1978 +f 1682/707/1978 1681/706/1977 1683/708/1979 1684/709/1980 +f 1676/701/1972 1685/711/1981 1686/710/1982 1677/700/1973 +f 1677/700/1973 1686/710/1982 1687/712/1983 1679/704/1975 +f 1679/704/1975 1687/712/1983 1688/713/1984 1681/706/1977 +f 1681/706/1977 1688/713/1984 1689/714/1985 1683/708/1979 +f 1685/711/1981 1690/716/1986 1691/715/1987 1686/710/1982 +f 1686/710/1982 1691/715/1987 1692/717/1988 1687/712/1983 +f 1687/712/1983 1692/717/1988 1693/718/1989 1688/713/1984 +f 1688/713/1984 1693/718/1989 1694/719/1990 1689/714/1985 +f 1690/716/1986 1695/721/1991 1696/720/1992 1691/715/1987 +f 1691/715/1987 1696/720/1992 1697/722/1993 1692/717/1988 +f 1692/717/1988 1697/722/1993 1698/723/1994 1693/718/1989 +f 1693/718/1989 1698/723/1994 1699/724/1995 1694/719/1990 +f 1655/680/1951 1654/681/1950 1675/702/1971 1700/725/1996 +f 1701/728/1997 1702/727/1998 1703/726/1999 1684/709/1980 +f 1704/730/2000 1705/729/2001 1699/724/1995 1706/731/2002 +f 1658/682/1954 1657/683/1953 1707/732/2003 1695/721/1991 +f 1700/725/1996 1675/702/1971 1678/703/1974 1708/733/2004 +f 1709/734/2005 1701/728/1997 1684/709/1980 1683/708/1979 +f 1706/731/2002 1699/724/1995 1698/723/1994 1710/735/2006 +f 1672/697/1968 1658/682/1954 1695/721/1991 1690/716/1986 +f 1708/733/2004 1678/703/1974 1680/705/1976 1711/736/2007 +f 1712/737/2008 1709/734/2005 1683/708/1979 1689/714/1985 +f 1710/735/2006 1698/723/1994 1697/722/1993 1713/738/2009 +f 1668/693/1964 1672/697/1968 1690/716/1986 1685/711/1981 +f 1711/736/2007 1680/705/1976 1682/707/1978 1714/739/2010 +f 1715/740/2011 1712/737/2008 1689/714/1985 1694/719/1990 +f 1713/738/2009 1697/722/1993 1696/720/1992 1716/741/2012 +f 1664/689/1960 1668/693/1964 1685/711/1981 1676/701/1972 +f 1714/739/2010 1682/707/1978 1684/709/1980 1703/726/1999 +f 1705/729/2001 1715/740/2011 1694/719/1990 1699/724/1995 +f 1716/741/2012 1696/720/1992 1695/721/1991 1707/732/2003 +f 1654/681/1950 1664/689/1960 1676/701/1972 1675/702/1971 +f 1717/744/2013 1718/743/2014 1719/742/2015 1720/745/2016 +f 1720/745/2016 1719/742/2015 1721/746/2017 1722/747/2018 +f 1722/747/2018 1721/746/2017 1723/748/2019 1724/749/2020 +f 1724/749/2020 1723/748/2019 1725/750/2021 1726/751/2022 +f 1718/743/2014 1727/753/2023 1728/752/2024 1719/742/2015 +f 1719/742/2015 1728/752/2024 1729/754/2025 1721/746/2017 +f 1721/746/2017 1729/754/2025 1730/755/2026 1723/748/2019 +f 1723/748/2019 1730/755/2026 1731/756/2027 1725/750/2021 +f 1727/753/2023 1732/758/2028 1733/757/2029 1728/752/2024 +f 1728/752/2024 1733/757/2029 1734/759/2030 1729/754/2025 +f 1729/754/2025 1734/759/2030 1735/760/2031 1730/755/2026 +f 1730/755/2026 1735/760/2031 1736/761/2032 1731/756/2027 +f 1732/758/2028 1737/763/2033 1738/762/2034 1733/757/2029 +f 1733/757/2029 1738/762/2034 1739/764/2035 1734/759/2030 +f 1734/759/2030 1739/764/2035 1740/765/2036 1735/760/2031 +f 1735/760/2031 1740/765/2036 1741/766/2037 1736/761/2032 +f 1702/727/1998 1701/728/1997 1717/744/2013 1742/767/2038 +f 1743/770/2039 1744/769/2040 1745/768/2041 1726/751/2022 +f 1746/772/2042 1747/771/2043 1741/766/2037 1748/773/2044 +f 1705/729/2001 1704/730/2000 1749/774/2045 1737/763/2033 +f 1742/767/2038 1717/744/2013 1720/745/2016 1750/775/2046 +f 1751/776/2047 1743/770/2039 1726/751/2022 1725/750/2021 +f 1748/773/2044 1741/766/2037 1740/765/2036 1752/777/2048 +f 1715/740/2011 1705/729/2001 1737/763/2033 1732/758/2028 +f 1750/775/2046 1720/745/2016 1722/747/2018 1753/778/2049 +f 1754/779/2050 1751/776/2047 1725/750/2021 1731/756/2027 +f 1752/777/2048 1740/765/2036 1739/764/2035 1755/780/2051 +f 1712/737/2008 1715/740/2011 1732/758/2028 1727/753/2023 +f 1753/778/2049 1722/747/2018 1724/749/2020 1756/781/2052 +f 1757/782/2053 1754/779/2050 1731/756/2027 1736/761/2032 +f 1755/780/2051 1739/764/2035 1738/762/2034 1758/783/2054 +f 1709/734/2005 1712/737/2008 1727/753/2023 1718/743/2014 +f 1756/781/2052 1724/749/2020 1726/751/2022 1745/768/2041 +f 1747/771/2043 1757/782/2053 1736/761/2032 1741/766/2037 +f 1758/783/2054 1738/762/2034 1737/763/2033 1749/774/2045 +f 1701/728/1997 1709/734/2005 1718/743/2014 1717/744/2013 +f 1759/786/2055 1760/785/2056 1761/784/2057 1762/787/2058 +f 1762/787/2058 1761/784/2057 1763/788/2059 1764/789/2060 +f 1764/789/2060 1763/788/2059 1765/790/2061 1766/791/2062 +f 1766/791/2062 1765/790/2061 1767/792/2063 1768/793/2064 +f 1760/785/2056 1769/795/2065 1770/794/2066 1761/784/2057 +f 1761/784/2057 1770/794/2066 1771/796/2067 1763/788/2059 +f 1763/788/2059 1771/796/2067 1772/797/2068 1765/790/2061 +f 1765/790/2061 1772/797/2068 1773/798/2069 1767/792/2063 +f 1769/795/2065 1774/800/2070 1775/799/2071 1770/794/2066 +f 1770/794/2066 1775/799/2071 1776/801/2072 1771/796/2067 +f 1771/796/2067 1776/801/2072 1777/802/2073 1772/797/2068 +f 1772/797/2068 1777/802/2073 1778/803/2074 1773/798/2069 +f 1774/800/2070 1779/805/2075 1780/804/2076 1775/799/2071 +f 1775/799/2071 1780/804/2076 1781/806/2077 1776/801/2072 +f 1776/801/2072 1781/806/2077 1782/807/2078 1777/802/2073 +f 1777/802/2073 1782/807/2078 1783/808/2079 1778/803/2074 +f 1744/769/2040 1743/770/2039 1759/786/2055 1784/809/2080 +f 1785/812/2081 1786/811/2082 1787/810/2083 1768/793/2064 +f 1788/814/2084 1789/813/2085 1783/808/2079 1790/815/2086 +f 1747/771/2043 1746/772/2042 1791/816/2087 1779/805/2075 +f 1784/809/2080 1759/786/2055 1762/787/2058 1792/817/2088 +f 1793/818/2089 1785/812/2081 1768/793/2064 1767/792/2063 +f 1790/815/2086 1783/808/2079 1782/807/2078 1794/819/2090 +f 1757/782/2053 1747/771/2043 1779/805/2075 1774/800/2070 +f 1792/817/2088 1762/787/2058 1764/789/2060 1795/820/2091 +f 1796/821/2092 1793/818/2089 1767/792/2063 1773/798/2069 +f 1794/819/2090 1782/807/2078 1781/806/2077 1797/822/2093 +f 1754/779/2050 1757/782/2053 1774/800/2070 1769/795/2065 +f 1795/820/2091 1764/789/2060 1766/791/2062 1798/823/2094 +f 1799/824/2095 1796/821/2092 1773/798/2069 1778/803/2074 +f 1797/822/2093 1781/806/2077 1780/804/2076 1800/825/2096 +f 1751/776/2047 1754/779/2050 1769/795/2065 1760/785/2056 +f 1798/823/2094 1766/791/2062 1768/793/2064 1787/810/2083 +f 1789/813/2085 1799/824/2095 1778/803/2074 1783/808/2079 +f 1800/825/2096 1780/804/2076 1779/805/2075 1791/816/2087 +f 1743/770/2039 1751/776/2047 1760/785/2056 1759/786/2055 +f 1801/828/2097 1802/827/2098 1803/826/2099 1804/829/2100 +f 1804/829/2100 1803/826/2099 1805/830/2101 1806/831/2102 +f 1806/831/2102 1805/830/2101 1807/832/2103 1808/833/2104 +f 1808/833/2104 1807/832/2103 1809/834/2105 1810/835/2106 +f 1802/827/2098 1811/837/2107 1812/836/2108 1803/826/2099 +f 1803/826/2099 1812/836/2108 1813/838/2109 1805/830/2101 +f 1805/830/2101 1813/838/2109 1814/839/2110 1807/832/2103 +f 1807/832/2103 1814/839/2110 1815/840/2111 1809/834/2105 +f 1811/837/2107 1816/842/2112 1817/841/2113 1812/836/2108 +f 1812/836/2108 1817/841/2113 1818/843/2114 1813/838/2109 +f 1813/838/2109 1818/843/2114 1819/844/2115 1814/839/2110 +f 1814/839/2110 1819/844/2115 1820/845/2116 1815/840/2111 +f 1816/842/2112 1821/847/2117 1822/846/2118 1817/841/2113 +f 1817/841/2113 1822/846/2118 1823/848/2119 1818/843/2114 +f 1818/843/2114 1823/848/2119 1824/849/2120 1819/844/2115 +f 1819/844/2115 1824/849/2120 1825/850/2121 1820/845/2116 +f 1826/852/2122 1827/851/2123 1801/828/2097 1828/853/2124 +f 1829/856/2125 1830/855/2126 1831/854/2127 1810/835/2106 +f 1655/680/1951 1832/857/2128 1825/850/2121 1656/679/1952 +f 1833/858/2129 1651/677/1947 1653/678/1949 1821/847/2117 +f 1828/853/2124 1801/828/2097 1804/829/2100 1834/859/2130 +f 1835/860/2131 1829/856/2125 1810/835/2106 1809/834/2105 +f 1656/679/1952 1825/850/2121 1824/849/2120 1671/696/1967 +f 1836/861/2132 1833/858/2129 1821/847/2117 1816/842/2112 +f 1834/859/2130 1804/829/2100 1806/831/2102 1837/862/2133 +f 1838/863/2134 1835/860/2131 1809/834/2105 1815/840/2111 +f 1671/696/1967 1824/849/2120 1823/848/2119 1667/692/1963 +f 1839/864/2135 1836/861/2132 1816/842/2112 1811/837/2107 +f 1837/862/2133 1806/831/2102 1808/833/2104 1840/865/2136 +f 1841/866/2137 1838/863/2134 1815/840/2111 1820/845/2116 +f 1667/692/1963 1823/848/2119 1822/846/2118 1663/688/1959 +f 1842/867/2138 1839/864/2135 1811/837/2107 1802/827/2098 +f 1840/865/2136 1808/833/2104 1810/835/2106 1831/854/2127 +f 1832/857/2128 1841/866/2137 1820/845/2116 1825/850/2121 +f 1663/688/1959 1822/846/2118 1821/847/2117 1653/678/1949 +f 1827/851/2123 1842/867/2138 1802/827/2098 1801/828/2097 +f 1843/870/2139 1844/869/2140 1845/868/2141 1846/871/2142 +f 1846/871/2142 1845/868/2141 1847/872/2143 1848/873/2144 +f 1848/873/2144 1847/872/2143 1849/874/2145 1850/875/2146 +f 1850/875/2146 1849/874/2145 1851/876/2147 1852/877/2148 +f 1844/869/2140 1853/879/2149 1854/878/2150 1845/868/2141 +f 1845/868/2141 1854/878/2150 1855/880/2151 1847/872/2143 +f 1847/872/2143 1855/880/2151 1856/881/2152 1849/874/2145 +f 1849/874/2145 1856/881/2152 1857/882/2153 1851/876/2147 +f 1853/879/2149 1858/884/2154 1859/883/2155 1854/878/2150 +f 1854/878/2150 1859/883/2155 1860/885/2156 1855/880/2151 +f 1855/880/2151 1860/885/2156 1861/886/2157 1856/881/2152 +f 1856/881/2152 1861/886/2157 1862/887/2158 1857/882/2153 +f 1858/884/2154 1863/889/2159 1864/888/2160 1859/883/2155 +f 1859/883/2155 1864/888/2160 1865/890/2161 1860/885/2156 +f 1860/885/2156 1865/890/2161 1866/891/2162 1861/886/2157 +f 1861/886/2157 1866/891/2162 1867/892/2163 1862/887/2158 +f 1830/855/2126 1829/856/2125 1843/870/2139 1868/893/2164 +f 1869/896/2165 1870/895/2166 1871/894/2167 1852/877/2148 +f 1702/727/1998 1872/897/2168 1867/892/2163 1703/726/1999 +f 1832/857/2128 1655/680/1951 1700/725/1996 1863/889/2159 +f 1868/893/2164 1843/870/2139 1846/871/2142 1873/898/2169 +f 1874/899/2170 1869/896/2165 1852/877/2148 1851/876/2147 +f 1703/726/1999 1867/892/2163 1866/891/2162 1714/739/2010 +f 1841/866/2137 1832/857/2128 1863/889/2159 1858/884/2154 +f 1873/898/2169 1846/871/2142 1848/873/2144 1875/900/2171 +f 1876/901/2172 1874/899/2170 1851/876/2147 1857/882/2153 +f 1714/739/2010 1866/891/2162 1865/890/2161 1711/736/2007 +f 1838/863/2134 1841/866/2137 1858/884/2154 1853/879/2149 +f 1875/900/2171 1848/873/2144 1850/875/2146 1877/902/2173 +f 1878/903/2174 1876/901/2172 1857/882/2153 1862/887/2158 +f 1711/736/2007 1865/890/2161 1864/888/2160 1708/733/2004 +f 1835/860/2131 1838/863/2134 1853/879/2149 1844/869/2140 +f 1877/902/2173 1850/875/2146 1852/877/2148 1871/894/2167 +f 1872/897/2168 1878/903/2174 1862/887/2158 1867/892/2163 +f 1708/733/2004 1864/888/2160 1863/889/2159 1700/725/1996 +f 1829/856/2125 1835/860/2131 1844/869/2140 1843/870/2139 +f 1879/906/2175 1880/905/2176 1881/904/2177 1882/907/2178 +f 1882/907/2178 1881/904/2177 1883/908/2179 1884/909/2180 +f 1884/909/2180 1883/908/2179 1885/910/2181 1886/911/2182 +f 1886/911/2182 1885/910/2181 1887/912/2183 1888/913/2184 +f 1880/905/2176 1889/915/2185 1890/914/2186 1881/904/2177 +f 1881/904/2177 1890/914/2186 1891/916/2187 1883/908/2179 +f 1883/908/2179 1891/916/2187 1892/917/2188 1885/910/2181 +f 1885/910/2181 1892/917/2188 1893/918/2189 1887/912/2183 +f 1889/915/2185 1894/920/2190 1895/919/2191 1890/914/2186 +f 1890/914/2186 1895/919/2191 1896/921/2192 1891/916/2187 +f 1891/916/2187 1896/921/2192 1897/922/2193 1892/917/2188 +f 1892/917/2188 1897/922/2193 1898/923/2194 1893/918/2189 +f 1894/920/2190 1899/925/2195 1900/924/2196 1895/919/2191 +f 1895/919/2191 1900/924/2196 1901/926/2197 1896/921/2192 +f 1896/921/2192 1901/926/2197 1902/927/2198 1897/922/2193 +f 1897/922/2193 1902/927/2198 1903/928/2199 1898/923/2194 +f 1870/895/2166 1869/896/2165 1879/906/2175 1904/929/2200 +f 1905/932/2201 1906/931/2202 1907/930/2203 1888/913/2184 +f 1744/769/2040 1908/933/2204 1903/928/2199 1745/768/2041 +f 1872/897/2168 1702/727/1998 1742/767/2038 1899/925/2195 +f 1904/929/2200 1879/906/2175 1882/907/2178 1909/934/2205 +f 1910/935/2206 1905/932/2201 1888/913/2184 1887/912/2183 +f 1745/768/2041 1903/928/2199 1902/927/2198 1756/781/2052 +f 1878/903/2174 1872/897/2168 1899/925/2195 1894/920/2190 +f 1909/934/2205 1882/907/2178 1884/909/2180 1911/936/2207 +f 1912/937/2208 1910/935/2206 1887/912/2183 1893/918/2189 +f 1756/781/2052 1902/927/2198 1901/926/2197 1753/778/2049 +f 1876/901/2172 1878/903/2174 1894/920/2190 1889/915/2185 +f 1911/936/2207 1884/909/2180 1886/911/2182 1913/938/2209 +f 1914/939/2210 1912/937/2208 1893/918/2189 1898/923/2194 +f 1753/778/2049 1901/926/2197 1900/924/2196 1750/775/2046 +f 1874/899/2170 1876/901/2172 1889/915/2185 1880/905/2176 +f 1913/938/2209 1886/911/2182 1888/913/2184 1907/930/2203 +f 1908/933/2204 1914/939/2210 1898/923/2194 1903/928/2199 +f 1750/775/2046 1900/924/2196 1899/925/2195 1742/767/2038 +f 1869/896/2165 1874/899/2170 1880/905/2176 1879/906/2175 +f 1915/942/2211 1916/941/2212 1917/940/2213 1918/943/2214 +f 1918/943/2214 1917/940/2213 1919/944/2215 1920/945/2216 +f 1920/945/2216 1919/944/2215 1921/946/2217 1922/947/2218 +f 1922/947/2218 1921/946/2217 1923/948/2219 1924/949/2220 +f 1916/941/2212 1925/951/2221 1926/950/2222 1917/940/2213 +f 1917/940/2213 1926/950/2222 1927/952/2223 1919/944/2215 +f 1919/944/2215 1927/952/2223 1928/953/2224 1921/946/2217 +f 1921/946/2217 1928/953/2224 1929/954/2225 1923/948/2219 +f 1925/951/2221 1930/956/2226 1931/955/2227 1926/950/2222 +f 1926/950/2222 1931/955/2227 1932/957/2228 1927/952/2223 +f 1927/952/2223 1932/957/2228 1933/958/2229 1928/953/2224 +f 1928/953/2224 1933/958/2229 1934/959/2230 1929/954/2225 +f 1930/956/2226 1935/961/2231 1936/960/2232 1931/955/2227 +f 1931/955/2227 1936/960/2232 1937/962/2233 1932/957/2228 +f 1932/957/2228 1937/962/2233 1938/963/2234 1933/958/2229 +f 1933/958/2229 1938/963/2234 1939/964/2235 1934/959/2230 +f 1906/931/2202 1905/932/2201 1915/942/2211 1940/965/2236 +f 1941/968/2237 1942/967/2238 1943/966/2239 1924/949/2220 +f 1786/811/2082 1944/969/2240 1939/964/2235 1787/810/2083 +f 1908/933/2204 1744/769/2040 1784/809/2080 1935/961/2231 +f 1940/965/2236 1915/942/2211 1918/943/2214 1945/970/2241 +f 1946/971/2242 1941/968/2237 1924/949/2220 1923/948/2219 +f 1787/810/2083 1939/964/2235 1938/963/2234 1798/823/2094 +f 1914/939/2210 1908/933/2204 1935/961/2231 1930/956/2226 +f 1945/970/2241 1918/943/2214 1920/945/2216 1947/972/2243 +f 1948/973/2244 1946/971/2242 1923/948/2219 1929/954/2225 +f 1798/823/2094 1938/963/2234 1937/962/2233 1795/820/2091 +f 1912/937/2208 1914/939/2210 1930/956/2226 1925/951/2221 +f 1947/972/2243 1920/945/2216 1922/947/2218 1949/974/2245 +f 1950/975/2246 1948/973/2244 1929/954/2225 1934/959/2230 +f 1795/820/2091 1937/962/2233 1936/960/2232 1792/817/2088 +f 1910/935/2206 1912/937/2208 1925/951/2221 1916/941/2212 +f 1949/974/2245 1922/947/2218 1924/949/2220 1943/966/2239 +f 1944/969/2240 1950/975/2246 1934/959/2230 1939/964/2235 +f 1792/817/2088 1936/960/2232 1935/961/2231 1784/809/2080 +f 1905/932/2201 1910/935/2206 1916/941/2212 1915/942/2211 +s 2 +f 1652/676/2247 1651/677/2248 1327/677/2249 1326/676/2250 +s 4 +f 1657/683/2251 1659/684/2252 1334/684/2253 1333/683/2254 +f 1662/685/2255 1661/686/2256 1336/686/2257 1335/685/2258 +s 2 +f 1661/686/2259 1660/687/2260 1337/687/2261 1336/686/2262 +s 4 +f 1659/684/2252 1665/690/2263 1340/690/2264 1334/684/2253 +s 2 +f 1660/687/2260 1666/691/2265 1341/691/2266 1337/687/2261 +s 4 +f 1665/690/2263 1669/694/2267 1344/694/2268 1340/690/2264 +s 2 +f 1666/691/2265 1670/695/2269 1345/695/2270 1341/691/2266 +s 4 +f 1669/694/2267 1673/698/2271 1348/698/2272 1344/694/2268 +s 2 +f 1670/695/2269 1674/699/2273 1349/699/2274 1345/695/2270 +s 4 +f 1673/698/2271 1662/685/2255 1335/685/2258 1348/698/2272 +s 2 +f 1674/699/2273 1652/676/2247 1326/676/2250 1349/699/2274 +s 4 +f 1704/730/2275 1706/731/2276 1381/731/2277 1380/730/2278 +f 1707/732/2279 1657/683/2251 1333/683/2254 1382/732/2280 +f 1706/731/2276 1710/735/2281 1385/735/2282 1381/731/2277 +f 1710/735/2281 1713/738/2283 1388/738/2284 1385/735/2282 +f 1713/738/2283 1716/741/2285 1391/741/2286 1388/738/2284 +f 1716/741/2285 1707/732/2279 1382/732/2280 1391/741/2286 +f 1746/772/2287 1748/773/2288 1423/773/2289 1422/772/2290 +f 1749/774/2291 1704/730/2275 1380/730/2278 1424/774/2292 +f 1748/773/2288 1752/777/2293 1427/777/2294 1423/773/2289 +f 1752/777/2293 1755/780/2295 1430/780/2296 1427/777/2294 +f 1755/780/2295 1758/783/2297 1433/783/2298 1430/780/2296 +f 1758/783/2297 1749/774/2291 1424/774/2292 1433/783/2298 +f 1786/811/2299 1785/812/2300 1462/812/2301 1461/811/2302 +f 1788/814/2303 1790/815/2304 1465/815/2305 1464/814/2306 +f 1789/813/2307 1788/814/2303 1464/814/2306 1463/813/2308 +f 1791/816/2309 1746/772/2287 1422/772/2290 1466/816/2310 +f 1785/812/2300 1793/818/2311 1468/818/2312 1462/812/2301 +f 1790/815/2304 1794/819/2313 1469/819/2314 1465/815/2305 +f 1793/818/2311 1796/821/2315 1471/821/2316 1468/818/2312 +f 1794/819/2313 1797/822/2317 1472/822/2318 1469/819/2314 +f 1796/821/2315 1799/824/2319 1474/824/2320 1471/821/2316 +f 1797/822/2317 1800/825/2321 1475/825/2322 1472/822/2318 +f 1799/824/2319 1789/813/2307 1463/813/2308 1474/824/2320 +f 1800/825/2321 1791/816/2309 1466/816/2310 1475/825/2322 +f 1826/852/2323 1828/853/2324 1503/853/2325 1502/852/2326 +s 2 +f 1827/851/2327 1826/852/2328 1502/852/2329 1501/851/2330 +s 4 +f 1831/854/2331 1830/855/2332 1505/855/2333 1504/854/2334 +s 2 +f 1651/677/2248 1833/858/2335 1508/858/2336 1327/677/2249 +s 4 +f 1828/853/2324 1834/859/2337 1509/859/2338 1503/853/2325 +s 2 +f 1833/858/2335 1836/861/2339 1511/861/2340 1508/858/2336 +s 4 +f 1834/859/2337 1837/862/2341 1512/862/2342 1509/859/2338 +s 2 +f 1836/861/2339 1839/864/2343 1514/864/2344 1511/861/2340 +s 4 +f 1837/862/2341 1840/865/2345 1515/865/2346 1512/862/2342 +s 2 +f 1839/864/2343 1842/867/2347 1517/867/2348 1514/864/2344 +s 4 +f 1840/865/2345 1831/854/2331 1504/854/2334 1515/865/2346 +s 2 +f 1842/867/2347 1827/851/2327 1501/851/2330 1517/867/2348 +s 4 +f 1830/855/2332 1868/893/2349 1543/893/2350 1505/855/2333 +f 1871/894/2351 1870/895/2352 1545/895/2353 1544/894/2354 +f 1868/893/2349 1873/898/2355 1548/898/2356 1543/893/2350 +f 1873/898/2355 1875/900/2357 1550/900/2358 1548/898/2356 +f 1875/900/2357 1877/902/2359 1552/902/2360 1550/900/2358 +f 1877/902/2359 1871/894/2351 1544/894/2354 1552/902/2360 +f 1870/895/2352 1904/929/2361 1579/929/2362 1545/895/2353 +f 1907/930/2363 1906/931/2364 1581/931/2365 1580/930/2366 +f 1904/929/2361 1909/934/2367 1584/934/2368 1579/929/2362 +f 1909/934/2367 1911/936/2369 1586/936/2370 1584/934/2368 +f 1911/936/2369 1913/938/2371 1588/938/2372 1586/936/2370 +f 1913/938/2371 1907/930/2363 1580/930/2366 1588/938/2372 +f 1906/931/2364 1940/965/2373 1615/965/2374 1581/931/2365 +f 1943/966/2375 1942/967/2376 1617/967/2377 1616/966/2378 +f 1942/967/2376 1941/968/2379 1618/968/2380 1617/967/2377 +f 1944/969/2381 1786/811/2299 1461/811/2302 1619/969/2382 +f 1940/965/2373 1945/970/2383 1620/970/2384 1615/965/2374 +f 1941/968/2379 1946/971/2385 1621/971/2386 1618/968/2380 +f 1945/970/2383 1947/972/2387 1622/972/2388 1620/970/2384 +f 1946/971/2385 1948/973/2389 1623/973/2390 1621/971/2386 +f 1947/972/2387 1949/974/2391 1624/974/2392 1622/972/2388 +f 1948/973/2389 1950/975/2393 1625/975/2394 1623/973/2390 +f 1949/974/2391 1943/966/2375 1616/966/2378 1624/974/2392 +f 1950/975/2393 1944/969/2381 1619/969/2382 1625/975/2394 +# 648 polygons + +# +# object lotu_petal_03 +# + +v 0.1994 0.1496 0.0764 +v 0.1500 0.1521 0.0241 +v 0.0840 0.1391 0.0547 +v 0.1193 0.1402 0.1127 +v 0.2509 0.1513 0.1427 +v 0.1638 0.1440 0.1729 +v 0.3007 0.1569 0.2147 +v 0.2062 0.1412 0.2487 +v 0.3590 0.1629 0.2952 +v 0.2572 0.1537 0.3375 +v 0.2792 0.1677 0.0506 +v 0.2243 0.1698 -0.0017 +v 0.3408 0.1726 0.1073 +v 0.4021 0.1766 0.1761 +v 0.4550 0.1731 0.2496 +v 0.3652 0.2023 0.0186 +v 0.3003 0.1976 -0.0239 +v 0.4318 0.2087 0.0727 +v 0.4957 0.2107 0.1357 +v 0.5605 0.2051 0.2101 +v 0.4457 0.2385 -0.0039 +v 0.3710 0.2337 -0.0439 +v 0.5184 0.2433 0.0425 +v 0.5970 0.2450 0.0917 +v 0.6677 0.2526 0.1634 +v 0.0525 0.1399 0.0018 +v -0.0055 0.1323 0.0294 +v 0.0192 0.1360 0.0793 +v 0.1436 0.1513 0.3750 +v 0.1753 0.1687 0.4697 +v 0.2953 0.1615 0.4312 +v 0.7387 0.2719 0.2483 +v 0.8429 0.3208 0.1998 +v 0.7730 0.3064 0.1223 +v 0.4429 0.2801 -0.0606 +v 0.3549 0.2809 -0.0882 +v 0.2905 0.2365 -0.0737 +v 0.0454 0.1393 0.1386 +v 0.4076 0.1717 0.3860 +v 0.6913 0.2912 0.0551 +v 0.2298 0.2011 -0.0565 +v 0.0726 0.1377 0.2121 +v 0.5201 0.1886 0.3409 +v 0.6074 0.2915 0.0001 +v 0.1702 0.1684 -0.0403 +v 0.1104 0.1387 0.2922 +v 0.6280 0.2217 0.2888 +v 0.5247 0.2897 -0.0286 +v 0.1119 0.1525 -0.0155 +v 0.4776 0.2208 0.5917 +v 0.4486 0.1956 0.4826 +v 0.3212 0.1878 0.5323 +v 0.3508 0.2076 0.6436 +v 0.5277 0.2626 0.7037 +v 0.4092 0.2395 0.7635 +v 0.5984 0.2984 0.8218 +v 0.4788 0.2754 0.8918 +v 0.6816 0.3517 0.9575 +v 0.5636 0.3331 1.0261 +v 0.6097 0.2438 0.5327 +v 0.5777 0.2117 0.4329 +v 0.6520 0.2837 0.6474 +v 0.7162 0.3159 0.7703 +v 0.8037 0.3668 0.9061 +v 0.7430 0.2831 0.4860 +v 0.6950 0.2416 0.3835 +v 0.7770 0.3208 0.5952 +v 0.8390 0.3540 0.7162 +v 0.9145 0.3807 0.8541 +v 0.8683 0.3262 0.4339 +v 0.8050 0.2927 0.3357 +v 0.9080 0.3496 0.5425 +v 0.9601 0.3773 0.6637 +v 1.0353 0.4060 0.8067 +v 0.1945 0.1850 0.5778 +v 0.4399 0.3312 1.0839 +v 0.5124 0.3912 1.2332 +v 0.6354 0.3930 1.1703 +v 1.1090 0.4684 0.9530 +v 1.2177 0.5206 0.8829 +v 1.1531 0.4446 0.7374 +v 0.9162 0.3528 0.2908 +v 0.2317 0.2169 0.6884 +v 0.7605 0.4014 1.1144 +v 1.0804 0.4139 0.6132 +v 0.2936 0.2465 0.8063 +v 0.8814 0.4205 1.0585 +v 1.0396 0.3950 0.4966 +v 0.3637 0.2761 0.9399 +v 0.9932 0.4429 1.0089 +v 0.9840 0.3779 0.3833 +v 0.8887 0.5528 1.4665 +v 0.8301 0.4716 1.2910 +v 0.7095 0.4571 1.3385 +v 0.7704 0.5321 1.5308 +v 0.9421 0.6734 1.6653 +v 0.8242 0.6521 1.7126 +v 0.9786 0.8048 1.8501 +v 0.8718 0.7784 1.8978 +v 1.0309 0.9397 2.0091 +v 0.9355 0.9202 2.0653 +v 1.0051 0.5742 1.4156 +v 0.9461 0.4951 1.2289 +v 1.0525 0.6826 1.6169 +v 1.0900 0.8242 1.7943 +v 1.1220 0.9540 1.9611 +v 1.1188 0.6025 1.3676 +v 1.0623 0.5204 1.1772 +v 1.1586 0.6982 1.5554 +v 1.1887 0.8446 1.7360 +v 1.2100 0.9953 1.8999 +v 1.2278 0.6472 1.3025 +v 1.1743 0.5615 1.1239 +v 1.2628 0.7365 1.4853 +v 1.2830 0.8655 1.6628 +v 1.2964 1.0216 1.8350 +v 0.5826 0.4578 1.3960 +v 0.8342 0.9126 2.1207 +v 0.8731 1.0551 2.2489 +v 0.9645 1.0647 2.2006 +v 1.2943 1.1566 1.9836 +v 1.3742 1.1901 1.9054 +v 1.3806 1.0489 1.7676 +v 1.2792 0.6131 1.0409 +v 0.6536 0.5398 1.5766 +v 1.0502 1.0687 2.1434 +v 1.3717 0.9143 1.5919 +v 0.7060 0.6489 1.7701 +v 1.1297 1.0944 2.1011 +v 1.3674 0.8050 1.4094 +v 0.7688 0.7703 1.9537 +v 1.2131 1.1226 2.0482 +v 1.3339 0.6978 1.2178 +v 1.0891 1.3341 2.3653 +v 1.0688 1.2106 2.2589 +v 0.9902 1.1952 2.3002 +v 1.0148 1.3267 2.3979 +v 1.0845 1.4633 2.4341 +v 1.0236 1.4535 2.4672 +v 1.0772 1.5835 2.4933 +v 1.0338 1.5766 2.5195 +v 1.0743 1.6952 2.5439 +v 1.0443 1.6951 2.5612 +v 1.1639 1.3508 2.3222 +v 1.1433 1.2224 2.2109 +v 1.1453 1.4741 2.3990 +v 1.1237 1.5850 2.4669 +v 1.1073 1.6983 2.5248 +v 1.2245 1.3681 2.2745 +v 1.2181 1.2440 2.1607 +v 1.2071 1.4863 2.3525 +v 1.1707 1.5966 2.4307 +v 1.1381 1.6927 2.5035 +v 1.2830 1.3864 2.2178 +v 1.2873 1.2778 2.1021 +v 1.2631 1.5012 2.3050 +v 1.2154 1.6061 2.3920 +v 1.1621 1.6877 2.4814 +v 0.9056 1.1933 2.3481 +v 1.0209 1.6954 2.5725 +v 1.0277 1.8106 2.5928 +v 1.0437 1.8090 2.5839 +v 1.1071 1.7715 2.5455 +v 1.1158 1.7534 2.5324 +v 1.1835 1.6816 2.4590 +v 1.3562 1.3107 2.0434 +v 0.9394 1.3234 2.4290 +v 1.0599 1.8033 2.5740 +v 1.2508 1.6014 2.3579 +v 0.9661 1.4477 2.4947 +v 1.0761 1.7951 2.5652 +v 1.3111 1.5109 2.2597 +v 0.9964 1.5747 2.5389 +v 1.0917 1.7843 2.5563 +v 1.3395 1.4182 2.1640 +v -0.2887 0.1873 0.3004 +v -0.2692 0.2003 0.2242 +v -0.3391 0.2221 0.2577 +v -0.3724 0.2091 0.3369 +v -0.2956 0.1865 0.3846 +v -0.3913 0.2191 0.4236 +v -0.3019 0.1968 0.4758 +v -0.4167 0.2398 0.5171 +v -0.3178 0.2179 0.5743 +v -0.4422 0.2554 0.6173 +v -0.2058 0.1669 0.2641 +v -0.1932 0.1749 0.1903 +v -0.1988 0.1662 0.3457 +v -0.1969 0.1724 0.4350 +v -0.1992 0.1923 0.5321 +v -0.1174 0.1492 0.2214 +v -0.1206 0.1532 0.1519 +v -0.1047 0.1551 0.2985 +v -0.0931 0.1614 0.3837 +v -0.0799 0.1703 0.4769 +v -0.0299 0.1361 0.1770 +v -0.0483 0.1388 0.1113 +v -0.0146 0.1403 0.2519 +v 0.0140 0.1488 0.3334 +v 0.0333 0.1567 0.4229 +v -0.2948 0.2431 0.1795 +v -0.3522 0.2735 0.2035 +v -0.4073 0.2618 0.2876 +v -0.5612 0.3055 0.6609 +v -0.5575 0.3081 0.7709 +v -0.4377 0.2670 0.7246 +v 0.0524 0.1683 0.5211 +v -0.0627 0.1340 0.0571 +v -0.4519 0.2629 0.3716 +v -0.3223 0.2346 0.6784 +v -0.1223 0.1518 0.0903 +v -0.4893 0.2781 0.4601 +v -0.2007 0.2020 0.6341 +v -0.1806 0.1762 0.1227 +v -0.5373 0.2950 0.5573 +v -0.0755 0.1820 0.5751 +v -0.2392 0.2046 0.1523 +v -0.2571 0.2707 0.8977 +v -0.2947 0.2460 0.7860 +v -0.4179 0.2832 0.8358 +v -0.3755 0.3066 0.9503 +v -0.2019 0.3019 1.0168 +v -0.3308 0.3337 1.0684 +v -0.1491 0.3364 1.1436 +v -0.2813 0.3768 1.1974 +v -0.0876 0.4014 1.2794 +v -0.2261 0.4307 1.3296 +v -0.1318 0.2451 0.8537 +v -0.1727 0.2193 0.7404 +v -0.0743 0.2767 0.9683 +v -0.0129 0.3204 1.0829 +v 0.0528 0.3798 1.2109 +v -0.0031 0.2363 0.7815 +v -0.0516 0.2000 0.6749 +v 0.0507 0.2734 0.9026 +v 0.1171 0.3053 1.0292 +v 0.1800 0.3560 1.1644 +v 0.1174 0.2164 0.7356 +v 0.0708 0.1936 0.6239 +v 0.1740 0.2576 0.8556 +v 0.2420 0.2938 0.9820 +v 0.3110 0.3370 1.1211 +v -0.5348 0.3258 0.8832 +v -0.3649 0.4649 1.3692 +v -0.3077 0.5432 1.5067 +v -0.1613 0.5014 1.4675 +v 0.3813 0.3901 1.2742 +v -0.4998 0.3530 0.9963 +v -0.0224 0.4636 1.4172 +v -0.4597 0.3809 1.1160 +v 0.1142 0.4311 1.3596 +v -0.4166 0.4208 1.2390 +v 0.2496 0.4226 1.3129 +v 0.1298 0.6398 1.7507 +v 0.0522 0.5320 1.5700 +v -0.0846 0.5849 1.6192 +v -0.0159 0.6775 1.7923 +v 0.1997 0.7499 1.9314 +v 0.0745 0.7942 1.9624 +v 0.3047 0.8723 2.1068 +v 0.1847 0.9071 2.1225 +v 0.3900 0.9869 2.2533 +v 0.2723 1.0344 2.2664 +v 0.2701 0.6100 1.7097 +v 0.1859 0.4986 1.5310 +v 0.3247 0.7267 1.9036 +v 0.4228 0.8300 2.0784 +v 0.5066 0.9428 2.2430 +v 0.4035 0.5858 1.6786 +v 0.3235 0.4821 1.4821 +v 0.4547 0.6967 1.8658 +v 0.5423 0.7923 2.0454 +v 0.6166 0.9231 2.2067 +v 0.5307 0.5528 1.6306 +v 0.4556 0.4610 1.4508 +v 0.5803 0.6554 1.8263 +v 0.6614 0.7729 2.0109 +v 0.7281 0.9133 2.1703 +v -0.2312 0.6233 1.6526 +v 0.1592 1.0754 2.2698 +v 0.2575 1.1833 2.3810 +v 0.3709 1.1358 2.3679 +v 0.7753 1.0496 2.2893 +v -0.1629 0.7348 1.8161 +v 0.4776 1.1010 2.3576 +v -0.0517 0.8476 1.9833 +v 0.5832 1.0584 2.3542 +v 0.0612 0.9523 2.1380 +v 0.6797 1.0520 2.3198 +v 0.6288 1.3534 2.5201 +v 0.5490 1.2182 2.4439 +v 0.4543 1.2552 2.4545 +v 0.5461 1.3759 2.5198 +v 0.7103 1.4785 2.5669 +v 0.6409 1.4885 2.5730 +v 0.7957 1.5988 2.5940 +v 0.7395 1.5973 2.6042 +v 0.8761 1.7038 2.6062 +v 0.8361 1.6979 2.6093 +v 0.7087 1.3375 2.5140 +v 0.6405 1.2000 2.4352 +v 0.7792 1.4719 2.5567 +v 0.8539 1.5973 2.5808 +v 0.9190 1.7018 2.5973 +v 0.7867 1.3329 2.4981 +v 0.7295 1.1854 2.4247 +v 0.8456 1.4653 2.5399 +v 0.9091 1.5875 2.5636 +v 0.9604 1.6984 2.5881 +v 0.8631 1.3252 2.4737 +v 0.8157 1.1873 2.3891 +v 0.9077 1.4553 2.5162 +v 0.9574 1.5769 2.5527 +v 0.9956 1.6975 2.5785 +v 0.3548 1.2905 2.4578 +v 0.8006 1.6891 2.6091 +v 0.8998 1.7747 2.6177 +v 0.9277 1.7805 2.6124 +v 1.0109 1.8096 2.6002 +v 0.4589 1.3959 2.5210 +v 0.9509 1.7894 2.6106 +v 0.5716 1.5021 2.5795 +v 0.9725 1.7995 2.6073 +v 0.6883 1.5977 2.6128 +v 0.9925 1.8063 2.6041 +v 0.0908 0.1123 0.0508 +v 0.1611 0.1258 0.0215 +v 0.2090 0.1230 0.0753 +v 0.1266 0.1136 0.1122 +v 0.2581 0.1241 0.1411 +v 0.1706 0.1170 0.1725 +v 0.3077 0.1300 0.2178 +v 0.2111 0.1147 0.2504 +v 0.3645 0.1360 0.2956 +v 0.2609 0.1273 0.3393 +v 0.2341 0.1445 -0.0086 +v 0.2894 0.1427 0.0472 +v 0.3478 0.1473 0.1042 +v 0.4087 0.1503 0.1728 +v 0.4633 0.1460 0.2490 +v 0.3094 0.1751 -0.0348 +v 0.3728 0.1775 0.0106 +v 0.4372 0.1832 0.0655 +v 0.5029 0.1856 0.1327 +v 0.5680 0.1789 0.2066 +v 0.3805 0.2136 -0.0620 +v 0.4570 0.2152 -0.0227 +v 0.5278 0.2201 0.0301 +v 0.6034 0.2199 0.0861 +v 0.6734 0.2284 0.1587 +v 0.0009 0.1053 0.0272 +v 0.0633 0.1130 -0.0027 +v 0.0232 0.1090 0.0779 +v 0.2980 0.1347 0.4374 +v 0.1789 0.1423 0.4752 +v 0.1432 0.1243 0.3803 +v 0.8538 0.2972 0.1951 +v 0.7469 0.2463 0.2466 +v 0.7829 0.2832 0.1169 +v 0.3001 0.2182 -0.0925 +v 0.3620 0.2630 -0.1096 +v 0.4518 0.2609 -0.0807 +v 0.0490 0.1123 0.1370 +v 0.4112 0.1450 0.3876 +v 0.6966 0.2646 0.0475 +v 0.2370 0.1781 -0.0713 +v 0.0770 0.1107 0.2110 +v 0.5270 0.1630 0.3416 +v 0.6154 0.2677 -0.0136 +v 0.1781 0.1441 -0.0500 +v 0.1133 0.1117 0.2946 +v 0.6357 0.1954 0.2903 +v 0.5343 0.2677 -0.0451 +v 0.1214 0.1258 -0.0200 +v 0.3250 0.1610 0.5375 +v 0.4533 0.1694 0.4844 +v 0.4825 0.1948 0.5956 +v 0.3554 0.1806 0.6474 +v 0.5341 0.2375 0.7073 +v 0.4164 0.2141 0.7620 +v 0.6028 0.2728 0.8278 +v 0.4850 0.2505 0.8945 +v 0.6882 0.3252 0.9663 +v 0.5676 0.3091 1.0322 +v 0.5830 0.1851 0.4362 +v 0.6176 0.2186 0.5374 +v 0.6586 0.2568 0.6529 +v 0.7243 0.2894 0.7773 +v 0.8115 0.3405 0.9146 +v 0.7013 0.2173 0.3845 +v 0.7525 0.2598 0.4874 +v 0.7869 0.2954 0.5957 +v 0.8473 0.3279 0.7226 +v 0.9224 0.3551 0.8587 +v 0.8140 0.2670 0.3331 +v 0.8811 0.3017 0.4361 +v 0.9182 0.3229 0.5465 +v 0.9697 0.3518 0.6646 +v 1.0425 0.3791 0.8086 +v 0.1973 0.1583 0.5810 +v 0.6417 0.3678 1.1754 +v 0.5176 0.3665 1.2406 +v 0.4432 0.3067 1.0911 +v 1.2307 0.4989 0.8830 +v 1.1209 0.4452 0.9574 +v 1.1628 0.4215 0.7381 +v 0.9257 0.3289 0.2901 +v 0.2371 0.1908 0.6956 +v 0.7659 0.3764 1.1205 +v 1.0893 0.3885 0.6103 +v 0.2955 0.2206 0.8115 +v 0.8901 0.3948 1.0672 +v 1.0482 0.3693 0.4963 +v 0.3669 0.2507 0.9445 +v 1.0058 0.4199 1.0145 +v 0.9941 0.3524 0.3821 +v 0.7161 0.4320 1.3487 +v 0.8415 0.4481 1.2985 +v 0.9007 0.5298 1.4816 +v 0.7800 0.5066 1.5392 +v 0.9532 0.6505 1.6772 +v 0.8334 0.6293 1.7268 +v 0.9909 0.7832 1.8668 +v 0.8796 0.7554 1.9102 +v 1.0450 0.9202 2.0272 +v 0.9457 0.9009 2.0808 +v 0.9578 0.4713 1.2420 +v 1.0193 0.5474 1.4287 +v 1.0673 0.6611 1.6303 +v 1.1040 0.8023 1.8118 +v 1.1400 0.9376 1.9765 +v 1.0757 0.4967 1.1916 +v 1.1362 0.5777 1.3812 +v 1.1765 0.6757 1.5681 +v 1.2057 0.8249 1.7513 +v 1.2287 0.9791 1.9142 +v 1.1908 0.5376 1.1290 +v 1.2431 0.6237 1.3145 +v 1.2788 0.7176 1.4974 +v 1.3008 0.8490 1.6788 +v 1.3158 1.0020 1.8467 +v 0.5850 0.4331 1.4106 +v 0.9759 1.0483 2.2146 +v 0.8788 1.0368 2.2664 +v 0.8410 0.8925 2.1368 +v 1.3932 1.1797 1.9219 +v 1.3153 1.1417 1.9960 +v 1.3981 1.0302 1.7811 +v 1.2939 0.5895 1.0440 +v 0.6588 0.5164 1.5889 +v 1.0670 1.0543 2.1629 +v 1.3890 0.8996 1.6043 +v 0.7127 0.6274 1.7820 +v 1.1491 1.0776 2.1187 +v 1.3837 0.7837 1.4172 +v 0.7760 0.7483 1.9642 +v 1.2326 1.1070 2.0665 +v 1.3483 0.6773 1.2271 +v 1.0023 1.1778 2.3194 +v 1.0813 1.1950 2.2776 +v 1.0986 1.3226 2.3839 +v 1.0240 1.3158 2.4170 +v 1.0951 1.4508 2.4561 +v 1.0339 1.4420 2.4895 +v 1.0926 1.5766 2.5161 +v 1.0489 1.5687 2.5422 +v 1.0911 1.6916 2.5692 +v 1.0623 1.6940 2.5853 +v 1.1599 1.2080 2.2283 +v 1.1766 1.3383 2.3399 +v 1.1597 1.4632 2.4191 +v 1.1403 1.5778 2.4881 +v 1.1240 1.6904 2.5476 +v 1.2341 1.2307 2.1790 +v 1.2431 1.3573 2.2889 +v 1.2204 1.4800 2.3716 +v 1.1870 1.5880 2.4486 +v 1.1582 1.6882 2.5262 +v 1.3064 1.2657 2.1177 +v 1.3034 1.3740 2.2363 +v 1.2808 1.4928 2.3236 +v 1.2319 1.5972 2.4103 +v 1.1843 1.6850 2.5027 +v 0.9134 1.1772 2.3658 +v 1.0601 1.8066 2.6071 +v 1.0414 1.8101 2.6162 +v 1.0354 1.6945 2.5981 +v 1.1360 1.7501 2.5534 +v 1.1214 1.7665 2.5684 +v 1.2043 1.6777 2.4784 +v 1.3756 1.2992 2.0584 +v 0.9461 1.3070 2.4485 +v 1.0772 1.8012 2.5987 +v 1.2685 1.5934 2.3773 +v 0.9749 1.4367 2.5163 +v 1.0922 1.7930 2.5907 +v 1.3306 1.5032 2.2798 +v 1.0102 1.5672 2.5625 +v 1.1059 1.7815 2.5809 +v 1.3594 1.4061 2.1825 +v -0.3565 0.2018 0.2531 +v -0.2825 0.1781 0.2206 +v -0.2985 0.1620 0.3010 +v -0.3855 0.1846 0.3361 +v -0.3058 0.1596 0.3872 +v -0.4038 0.1946 0.4240 +v -0.3103 0.1715 0.4784 +v -0.4269 0.2153 0.5192 +v -0.3264 0.1913 0.5758 +v -0.4505 0.2293 0.6205 +v -0.2006 0.1501 0.1886 +v -0.2116 0.1411 0.2646 +v -0.2024 0.1393 0.3474 +v -0.2036 0.1452 0.4369 +v -0.2021 0.1656 0.5342 +v -0.1234 0.1276 0.1489 +v -0.1194 0.1229 0.2195 +v -0.1069 0.1278 0.2982 +v -0.0969 0.1352 0.3842 +v -0.0811 0.1441 0.4795 +v -0.0466 0.1122 0.1127 +v -0.0277 0.1092 0.1767 +v -0.0142 0.1134 0.2514 +v 0.0124 0.1215 0.3334 +v 0.0315 0.1296 0.4235 +v -0.3694 0.2563 0.1937 +v -0.3120 0.2224 0.1727 +v -0.4215 0.2428 0.2815 +v -0.4472 0.2414 0.7285 +v -0.5661 0.2814 0.7734 +v -0.5707 0.2799 0.6632 +v 0.0531 0.1411 0.5253 +v -0.0617 0.1074 0.0568 +v -0.4656 0.2436 0.3659 +v -0.3268 0.2089 0.6832 +v -0.1241 0.1256 0.0875 +v -0.4993 0.2568 0.4582 +v -0.2037 0.1754 0.6405 +v -0.1901 0.1511 0.1191 +v -0.5464 0.2704 0.5584 +v -0.0759 0.1563 0.5794 +v -0.2530 0.1818 0.1485 +v -0.4248 0.2584 0.8412 +v -0.2971 0.2201 0.7953 +v -0.2597 0.2451 0.9077 +v -0.3822 0.2810 0.9571 +v -0.2071 0.2768 1.0267 +v -0.3362 0.3077 1.0765 +v -0.1518 0.3129 1.1529 +v -0.2870 0.3518 1.2043 +v -0.0900 0.3753 1.2899 +v -0.2303 0.4054 1.3390 +v -0.1765 0.1927 0.7466 +v -0.1314 0.2186 0.8584 +v -0.0783 0.2507 0.9767 +v -0.0152 0.2939 1.0947 +v 0.0486 0.3545 1.2231 +v -0.0513 0.1748 0.6825 +v -0.0060 0.2105 0.7889 +v 0.0504 0.2473 0.9087 +v 0.1152 0.2802 1.0407 +v 0.1768 0.3305 1.1764 +v 0.0736 0.1676 0.6295 +v 0.1172 0.1903 0.7401 +v 0.1762 0.2315 0.8596 +v 0.2431 0.2677 0.9888 +v 0.3107 0.3102 1.1313 +v -0.5415 0.2997 0.8870 +v -0.1621 0.4774 1.4802 +v -0.3116 0.5197 1.5189 +v -0.3696 0.4398 1.3783 +v 0.3834 0.3654 1.2880 +v -0.5077 0.3270 1.0045 +v -0.0257 0.4391 1.4240 +v -0.4680 0.3549 1.1235 +v 0.1110 0.4070 1.3691 +v -0.4218 0.3962 1.2500 +v 0.2532 0.3971 1.3219 +v -0.0873 0.5637 1.6328 +v 0.0516 0.5097 1.5816 +v 0.1332 0.6168 1.7640 +v -0.0183 0.6573 1.8090 +v 0.1966 0.7267 1.9468 +v 0.0714 0.7743 1.9812 +v 0.2992 0.8523 2.1239 +v 0.1782 0.8892 2.1417 +v 0.3911 0.9683 2.2737 +v 0.2709 1.0151 2.2868 +v 0.1884 0.4740 1.5400 +v 0.2770 0.5858 1.7219 +v 0.3274 0.7023 1.9201 +v 0.4213 0.8093 2.0943 +v 0.5063 0.9229 2.2597 +v 0.3267 0.4591 1.4925 +v 0.4112 0.5627 1.6913 +v 0.4611 0.6720 1.8791 +v 0.5419 0.7706 2.0606 +v 0.6189 0.9002 2.2266 +v 0.4574 0.4362 1.4628 +v 0.5367 0.5303 1.6416 +v 0.5877 0.6299 1.8396 +v 0.6640 0.7510 2.0238 +v 0.7334 0.8948 2.1865 +v -0.2312 0.6014 1.6681 +v 0.3706 1.1221 2.3900 +v 0.2572 1.1675 2.4045 +v 0.1552 1.0581 2.2931 +v 0.7813 1.0283 2.3080 +v -0.1658 0.7153 1.8324 +v 0.4807 1.0858 2.3798 +v -0.0550 0.8273 2.0004 +v 0.5859 1.0401 2.3770 +v 0.0565 0.9350 2.1573 +v 0.6851 1.0307 2.3404 +v 0.4547 1.2447 2.4787 +v 0.5515 1.2102 2.4684 +v 0.6286 1.3444 2.5444 +v 0.5450 1.3678 2.5432 +v 0.7155 1.4714 2.5921 +v 0.6454 1.4839 2.5980 +v 0.8011 1.5933 2.6201 +v 0.7436 1.5923 2.6315 +v 0.8813 1.6982 2.6321 +v 0.8399 1.6937 2.6357 +v 0.6441 1.1895 2.4573 +v 0.7106 1.3283 2.5374 +v 0.7847 1.4638 2.5821 +v 0.8607 1.5894 2.6064 +v 0.9251 1.6958 2.6229 +v 0.7344 1.1712 2.4450 +v 0.7902 1.3202 2.5221 +v 0.8525 1.4579 2.5637 +v 0.9179 1.5804 2.5882 +v 0.9676 1.6940 2.6144 +v 0.8243 1.1741 2.4061 +v 0.8674 1.3115 2.4947 +v 0.9168 1.4445 2.5388 +v 0.9690 1.5716 2.5762 +v 1.0055 1.6952 2.6043 +v 0.3523 1.2787 2.4813 +v 0.9360 1.7687 2.6350 +v 0.9128 1.7565 2.6357 +v 0.8042 1.6805 2.6361 +v 1.0218 1.8087 2.6251 +v 0.4571 1.3880 2.5455 +v 0.9588 1.7810 2.6341 +v 0.5762 1.4942 2.6049 +v 0.9806 1.7956 2.6332 +v 0.6918 1.5935 2.6389 +v 1.0015 1.8037 2.6305 +# 650 vertices + +vn 0.1698 0.9837 -0.0598 +vn 0.2010 0.9746 -0.0990 +vn 0.1081 0.9940 -0.0156 +vn 0.0567 0.9981 0.0241 +vn 0.1460 0.9893 0.0044 +vn 0.0743 0.9972 0.0006 +vn 0.1489 0.9888 0.0105 +vn 0.0874 0.9958 0.0287 +vn 0.1037 0.9923 0.0675 +vn 0.0523 0.9939 0.0970 +vn 0.2842 0.9519 -0.1143 +vn 0.2892 0.9438 -0.1602 +vn 0.2810 0.9572 -0.0692 +vn 0.2487 0.9657 -0.0748 +vn 0.1969 0.9804 0.0109 +vn 0.3776 0.9101 -0.1709 +vn 0.4009 0.8609 -0.3132 +vn 0.3454 0.9299 -0.1266 +vn 0.3146 0.9410 -0.1248 +vn 0.3284 0.9431 -0.0520 +vn 0.4563 0.8356 -0.3059 +vn 0.4820 0.7505 -0.4521 +vn 0.3875 0.8916 -0.2341 +vn 0.3627 0.9193 -0.1526 +vn 0.3916 0.9194 -0.0374 +vn 0.1481 0.9880 -0.0445 +vn 0.0261 0.9986 0.0451 +vn 0.0021 0.9984 0.0560 +vn -0.0324 0.9900 0.1372 +vn -0.0277 0.9859 0.1648 +vn 0.0156 0.9855 0.1691 +vn 0.3964 0.9160 0.0618 +vn 0.4024 0.9112 0.0877 +vn 0.4275 0.9027 -0.0480 +vn 0.5245 0.7003 -0.4843 +vn 0.5068 0.5941 -0.6246 +vn 0.4705 0.6859 -0.5550 +vn 0.0205 0.9997 0.0139 +vn 0.1069 0.9839 0.1430 +vn 0.4135 0.8991 -0.1439 +vn 0.4544 0.7489 -0.4823 +vn 0.0207 0.9998 -0.0009 +vn 0.1962 0.9727 0.1241 +vn 0.4218 0.8499 -0.3157 +vn 0.2922 0.9368 -0.1924 +vn -0.0257 0.9963 0.0824 +vn 0.3338 0.9403 0.0658 +vn 0.4898 0.7168 -0.4963 +vn 0.2173 0.9710 -0.0997 +vn 0.1192 0.9560 0.2681 +vn 0.0937 0.9673 0.2359 +vn 0.0270 0.9782 0.2061 +vn 0.0279 0.9738 0.2258 +vn 0.1589 0.9532 0.2571 +vn 0.0599 0.9713 0.2302 +vn 0.1642 0.9528 0.2555 +vn 0.0864 0.9581 0.2732 +vn 0.1472 0.9472 0.2848 +vn 0.0902 0.9427 0.3213 +vn 0.1946 0.9340 0.2995 +vn 0.1771 0.9533 0.2448 +vn 0.2087 0.9430 0.2592 +vn 0.1932 0.9551 0.2246 +vn 0.1262 0.9479 0.2925 +vn 0.2511 0.9184 0.3058 +vn 0.3058 0.9315 0.1969 +vn 0.2223 0.9385 0.2640 +vn 0.2248 0.9585 0.1755 +vn 0.1731 0.9523 0.2512 +vn 0.3396 0.9198 0.1968 +vn 0.4118 0.9039 0.1157 +vn 0.2557 0.9442 0.2074 +vn 0.2260 0.9577 0.1779 +vn 0.2520 0.9343 0.2522 +vn -0.0297 0.9784 0.2043 +vn -0.0268 0.9443 0.3280 +vn 0.0029 0.9413 0.3375 +vn 0.0580 0.9393 0.3381 +vn 0.3128 0.8714 0.3780 +vn 0.3906 0.8325 0.3929 +vn 0.2970 0.9124 0.2817 +vn 0.4360 0.8952 0.0924 +vn -0.0421 0.9717 0.2326 +vn 0.1265 0.9394 0.3187 +vn 0.2764 0.9460 0.1696 +vn -0.0562 0.9723 0.2268 +vn 0.1639 0.9304 0.3279 +vn 0.3195 0.9354 0.1516 +vn -0.0637 0.9596 0.2742 +vn 0.1975 0.9134 0.3560 +vn 0.3947 0.9116 0.1153 +vn 0.1598 0.8808 0.4457 +vn 0.1457 0.9180 0.3689 +vn 0.0679 0.9337 0.3516 +vn 0.0666 0.8896 0.4519 +vn 0.1189 0.8157 0.5662 +vn 0.0923 0.8328 0.5458 +vn 0.1785 0.7768 0.6039 +vn 0.1559 0.7967 0.5839 +vn 0.2013 0.7120 0.6727 +vn 0.1743 0.7220 0.6696 +vn 0.1869 0.8816 0.4335 +vn 0.1947 0.9065 0.3747 +vn 0.1415 0.8098 0.5694 +vn 0.2074 0.7432 0.6361 +vn 0.2815 0.6800 0.6770 +vn 0.2847 0.8567 0.4302 +vn 0.2581 0.8846 0.3884 +vn 0.2665 0.7846 0.5597 +vn 0.2704 0.6902 0.6712 +vn 0.3643 0.6275 0.6881 +vn 0.4045 0.7991 0.4448 +vn 0.3683 0.8334 0.4122 +vn 0.4276 0.7261 0.5384 +vn 0.3863 0.6508 0.6537 +vn 0.3642 0.5915 0.7194 +vn -0.0082 0.9317 0.3632 +vn 0.0827 0.7291 0.6794 +vn 0.0860 0.6396 0.7639 +vn 0.1586 0.6312 0.7592 +vn 0.4266 0.5294 0.7333 +vn 0.4461 0.5107 0.7349 +vn 0.3870 0.5781 0.7183 +vn 0.4355 0.7989 0.4149 +vn -0.0499 0.8921 0.4491 +vn 0.2214 0.6286 0.7455 +vn 0.4725 0.6233 0.6231 +vn 0.0168 0.8616 0.5073 +vn 0.2736 0.6043 0.7483 +vn 0.4907 0.6909 0.5310 +vn 0.0764 0.8173 0.5711 +vn 0.3671 0.5669 0.7375 +vn 0.4388 0.7757 0.4537 +vn 0.1528 0.5127 0.8449 +vn 0.2061 0.6042 0.7697 +vn 0.1445 0.6001 0.7868 +vn 0.0650 0.5178 0.8531 +vn 0.1623 0.3917 0.9057 +vn 0.1236 0.4210 0.8986 +vn 0.1631 0.3552 0.9204 +vn 0.1461 0.3575 0.9224 +vn 0.1465 0.2633 0.9535 +vn 0.1002 0.2505 0.9629 +vn 0.2806 0.4873 0.8269 +vn 0.2695 0.5861 0.7641 +vn 0.2445 0.3573 0.9014 +vn 0.2201 0.3428 0.9133 +vn 0.1614 0.2679 0.9498 +vn 0.3782 0.4530 0.8073 +vn 0.3724 0.5448 0.7513 +vn 0.3305 0.3204 0.8878 +vn 0.3304 0.3116 0.8909 +vn 0.2510 0.2508 0.9349 +vn 0.4524 0.4351 0.7785 +vn 0.4421 0.5002 0.7445 +vn 0.3772 0.3134 0.8715 +vn 0.3371 0.3159 0.8869 +vn 0.3514 0.1966 0.9154 +vn 0.0839 0.5862 0.8058 +vn -0.0414 0.2409 0.9697 +vn 0.0574 0.2010 0.9779 +vn 0.1053 0.1758 0.9788 +vn 0.0085 0.3191 0.9477 +vn 0.1659 -0.5344 -0.8288 +vn 0.3353 0.3106 0.8894 +vn 0.4432 0.4879 0.7520 +vn 0.0711 0.5262 0.8474 +vn 0.0872 0.1793 0.9799 +vn 0.3366 0.3017 0.8920 +vn 0.0265 0.4218 0.9063 +vn 0.0271 0.2125 0.9768 +vn 0.4073 0.3384 0.8483 +vn 0.0205 0.3541 0.9350 +vn -0.0108 0.2734 0.9618 +vn 0.4789 0.4369 0.7614 +vn -0.2283 0.9421 -0.2455 +vn -0.2992 0.8499 -0.4338 +vn -0.3139 0.7752 -0.5483 +vn -0.3702 0.8695 -0.3270 +vn -0.2382 0.9697 -0.0538 +vn -0.4052 0.9058 -0.1239 +vn -0.2637 0.9636 0.0449 +vn -0.3694 0.9261 -0.0773 +vn -0.2601 0.9646 0.0445 +vn -0.3265 0.9442 -0.0423 +vn -0.2037 0.9652 -0.1640 +vn -0.2827 0.9248 -0.2547 +vn -0.1499 0.9885 -0.0211 +vn -0.1599 0.9844 0.0730 +vn -0.1784 0.9803 0.0846 +vn -0.1770 0.9824 -0.0601 +vn -0.2337 0.9659 -0.1117 +vn -0.1275 0.9910 0.0394 +vn -0.0986 0.9933 0.0596 +vn -0.1170 0.9892 0.0883 +vn -0.0652 0.9977 -0.0177 +vn -0.1079 0.9941 0.0093 +vn -0.0925 0.9941 0.0574 +vn -0.0943 0.9919 0.0857 +vn -0.0642 0.9931 0.0978 +vn -0.3639 0.7150 -0.5970 +vn -0.3476 0.6600 -0.6660 +vn -0.4163 0.7041 -0.5753 +vn -0.3409 0.9360 -0.0882 +vn -0.3093 0.9509 0.0129 +vn -0.2937 0.9555 0.0268 +vn -0.0578 0.9862 0.1550 +vn -0.1222 0.9903 0.0661 +vn -0.4832 0.8084 -0.3361 +vn -0.2474 0.9669 0.0624 +vn -0.2589 0.9650 -0.0425 +vn -0.4331 0.8769 -0.2087 +vn -0.1860 0.9786 0.0875 +vn -0.3365 0.9211 -0.1958 +vn -0.3742 0.9145 -0.1537 +vn -0.1139 0.9860 0.1217 +vn -0.3812 0.8427 -0.3801 +vn -0.2251 0.9511 0.2116 +vn -0.2319 0.9639 0.1313 +vn -0.2902 0.9483 0.1284 +vn -0.2858 0.9390 0.1911 +vn -0.1920 0.9502 0.2455 +vn -0.2770 0.9324 0.2323 +vn -0.1697 0.9301 0.3257 +vn -0.2761 0.9069 0.3183 +vn -0.1666 0.9126 0.3733 +vn -0.2357 0.8981 0.3713 +vn -0.1119 0.9670 0.2290 +vn -0.1539 0.9726 0.1744 +vn -0.1039 0.9561 0.2740 +vn -0.1125 0.9336 0.3403 +vn -0.1263 0.9241 0.3608 +vn -0.0960 0.9555 0.2791 +vn -0.0968 0.9724 0.2122 +vn -0.0586 0.9670 0.2478 +vn -0.0884 0.9559 0.2800 +vn -0.1628 0.9224 0.3504 +vn -0.0702 0.9664 0.2471 +vn -0.0554 0.9766 0.2077 +vn -0.1113 0.9570 0.2678 +vn -0.1128 0.9563 0.2699 +vn -0.0988 0.9486 0.3007 +vn -0.3214 0.9366 0.1394 +vn -0.2616 0.8947 0.3620 +vn -0.2905 0.8469 0.4455 +vn -0.2705 0.8633 0.4262 +vn -0.1226 0.9341 0.3353 +vn -0.3282 0.9259 0.1871 +vn -0.2182 0.8996 0.3783 +vn -0.3190 0.9190 0.2316 +vn -0.1281 0.9364 0.3269 +vn -0.2932 0.9108 0.2906 +vn -0.1670 0.9261 0.3384 +vn -0.2483 0.8493 0.4659 +vn -0.2743 0.8587 0.4330 +vn -0.3001 0.8466 0.4395 +vn -0.3351 0.8146 0.4735 +vn -0.2931 0.8152 0.4995 +vn -0.3897 0.7590 0.5217 +vn -0.3646 0.7612 0.5363 +vn -0.3985 0.7279 0.5580 +vn -0.4409 0.6551 0.6136 +vn -0.4510 0.6332 0.6290 +vn -0.2277 0.8490 0.4768 +vn -0.1894 0.8912 0.4122 +vn -0.2402 0.8514 0.4664 +vn -0.3092 0.8008 0.5130 +vn -0.2982 0.7343 0.6098 +vn -0.2225 0.8657 0.4484 +vn -0.1568 0.9146 0.3726 +vn -0.2565 0.8521 0.4562 +vn -0.2317 0.8210 0.5219 +vn -0.1476 0.7507 0.6440 +vn -0.1390 0.8884 0.4375 +vn -0.1170 0.9192 0.3759 +vn -0.1564 0.8632 0.4800 +vn -0.0820 0.8251 0.5591 +vn -0.0428 0.7352 0.6765 +vn -0.3162 0.8362 0.4481 +vn -0.4675 0.6223 0.6279 +vn -0.4446 0.5781 0.6842 +vn -0.4253 0.5813 0.6937 +vn -0.0166 0.6512 0.7587 +vn -0.4167 0.7606 0.4979 +vn -0.4378 0.5580 0.7050 +vn -0.4294 0.7381 0.5205 +vn -0.2892 0.6163 0.7325 +vn -0.4258 0.7118 0.5586 +vn -0.0736 0.6768 0.7325 +vn -0.3896 0.3866 0.8359 +vn -0.3763 0.5175 0.7685 +vn -0.4328 0.4686 0.7701 +vn -0.4251 0.3876 0.8180 +vn -0.2906 0.3318 0.8975 +vn -0.3266 0.3712 0.8692 +vn -0.1815 0.3030 0.9356 +vn -0.2031 0.3153 0.9270 +vn -0.2287 0.1916 0.9544 +vn -0.3209 0.0921 0.9426 +vn -0.2694 0.4308 0.8613 +vn -0.3284 0.5010 0.8008 +vn -0.2123 0.3259 0.9213 +vn -0.1527 0.3005 0.9415 +vn -0.1793 0.2332 0.9558 +vn -0.1567 0.4396 0.8844 +vn -0.1386 0.5619 0.8155 +vn -0.1280 0.3518 0.9273 +vn -0.1692 0.2875 0.9427 +vn -0.1453 0.2553 0.9559 +vn -0.0036 0.4870 0.8734 +vn 0.0396 0.5996 0.7994 +vn -0.0769 0.3817 0.9211 +vn -0.1277 0.3141 0.9408 +vn -0.1434 0.2406 0.9600 +vn -0.4491 0.4603 0.7658 +vn -0.3829 -0.0398 0.9229 +vn -0.1040 0.3767 0.9205 +vn -0.2086 0.2257 0.9516 +vn -0.0337 0.2215 0.9746 +vn -0.4095 0.4315 0.8038 +vn -0.1184 0.2670 0.9564 +vn -0.3282 0.4345 0.8388 +vn -0.1426 0.2274 0.9633 +vn -0.2049 0.4095 0.8890 +vn -0.1368 0.2142 0.9672 +vn -0.1076 -0.9942 0.0096 +vn -0.2050 -0.9742 0.0941 +vn -0.1756 -0.9826 0.0608 +vn -0.0570 -0.9981 -0.0221 +vn -0.1521 -0.9884 -0.0012 +vn -0.0733 -0.9973 -0.0025 +vn -0.1462 -0.9892 -0.0131 +vn -0.0851 -0.9958 -0.0344 +vn -0.1003 -0.9923 -0.0721 +vn -0.0525 -0.9939 -0.0967 +vn -0.2996 -0.9397 0.1649 +vn -0.2878 -0.9518 0.1059 +vn -0.2864 -0.9555 0.0714 +vn -0.2538 -0.9637 0.0832 +vn -0.1971 -0.9803 -0.0145 +vn -0.3956 -0.8675 0.3016 +vn -0.3634 -0.9176 0.1612 +vn -0.3417 -0.9323 0.1185 +vn -0.3183 -0.9394 0.1270 +vn -0.3380 -0.9391 0.0620 +vn -0.4706 -0.7470 0.4695 +vn -0.4526 -0.8357 0.3110 +vn -0.3831 -0.9006 0.2054 +vn -0.3561 -0.9252 0.1312 +vn -0.3955 -0.9175 0.0425 +vn -0.0241 -0.9986 -0.0477 +vn -0.1469 -0.9886 0.0345 +vn -0.0013 -0.9984 -0.0560 +vn -0.0166 -0.9854 -0.1694 +vn 0.0296 -0.9857 -0.1660 +vn 0.0329 -0.9900 -0.1371 +vn -0.4052 -0.9105 -0.0828 +vn -0.4013 -0.9145 -0.0519 +vn -0.4209 -0.9061 0.0424 +vn -0.4674 -0.6805 0.5643 +vn -0.4979 -0.6072 0.6191 +vn -0.5201 -0.7031 0.4850 +vn -0.0198 -0.9997 -0.0126 +vn -0.1083 -0.9837 -0.1438 +vn -0.4044 -0.9062 0.1232 +vn -0.4419 -0.7803 0.4426 +vn -0.0208 -0.9998 0.0003 +vn -0.1970 -0.9718 -0.1298 +vn -0.4247 -0.8533 0.3025 +vn -0.3102 -0.9267 0.2120 +vn 0.0231 -0.9964 -0.0811 +vn -0.3298 -0.9408 -0.0781 +vn -0.5081 -0.6947 0.5092 +vn -0.2256 -0.9691 0.0997 +vn -0.0296 -0.9781 -0.2059 +vn -0.0953 -0.9669 -0.2368 +vn -0.1204 -0.9559 -0.2680 +vn -0.0287 -0.9722 -0.2325 +vn -0.1517 -0.9536 -0.2599 +vn -0.0666 -0.9697 -0.2350 +vn -0.1562 -0.9551 -0.2518 +vn -0.0853 -0.9584 -0.2724 +vn -0.1357 -0.9483 -0.2869 +vn -0.0815 -0.9428 -0.3234 +vn -0.1825 -0.9528 -0.2426 +vn -0.1998 -0.9345 -0.2946 +vn -0.2055 -0.9449 -0.2548 +vn -0.1877 -0.9560 -0.2254 +vn -0.1317 -0.9474 -0.2917 +vn -0.3015 -0.9313 -0.2046 +vn -0.2503 -0.9211 -0.2982 +vn -0.2226 -0.9405 -0.2568 +vn -0.2289 -0.9580 -0.1727 +vn -0.1761 -0.9506 -0.2556 +vn -0.4106 -0.9049 -0.1119 +vn -0.3349 -0.9228 -0.1905 +vn -0.2530 -0.9452 -0.2065 +vn -0.2309 -0.9561 -0.1803 +vn -0.2578 -0.9328 -0.2518 +vn 0.0307 -0.9787 -0.2031 +vn -0.0593 -0.9410 -0.3331 +vn -0.0106 -0.9432 -0.3320 +vn 0.0157 -0.9457 -0.3246 +vn -0.4012 -0.8319 -0.3835 +vn -0.3185 -0.8716 -0.3726 +vn -0.3111 -0.9076 -0.2818 +vn -0.4456 -0.8917 -0.0798 +vn 0.0435 -0.9707 -0.2363 +vn -0.1157 -0.9397 -0.3218 +vn -0.2820 -0.9427 -0.1782 +vn 0.0508 -0.9719 -0.2297 +vn -0.1640 -0.9306 -0.3272 +vn -0.3274 -0.9327 -0.1514 +vn 0.0566 -0.9600 -0.2740 +vn -0.2076 -0.9136 -0.3496 +vn -0.3977 -0.9106 -0.1123 +vn -0.0720 -0.9356 -0.3457 +vn -0.1417 -0.9218 -0.3608 +vn -0.1463 -0.8817 -0.4485 +vn -0.0645 -0.8905 -0.4503 +vn -0.1163 -0.8176 -0.5639 +vn -0.0827 -0.8334 -0.5464 +vn -0.1663 -0.7779 -0.6060 +vn -0.1357 -0.7986 -0.5863 +vn -0.1951 -0.7131 -0.6734 +vn -0.1564 -0.7224 -0.6735 +vn -0.1857 -0.9113 -0.3674 +vn -0.1762 -0.8840 -0.4329 +vn -0.1334 -0.8084 -0.5733 +vn -0.2066 -0.7420 -0.6377 +vn -0.2904 -0.6779 -0.6753 +vn -0.2604 -0.8877 -0.3797 +vn -0.2959 -0.8528 -0.4302 +vn -0.2749 -0.7778 -0.5652 +vn -0.2768 -0.6867 -0.6721 +vn -0.3633 -0.6257 -0.6903 +vn -0.3785 -0.8329 -0.4038 +vn -0.4196 -0.7915 -0.4443 +vn -0.4400 -0.7151 -0.5431 +vn -0.4026 -0.6453 -0.6493 +vn -0.3645 -0.5880 -0.7220 +vn 0.0090 -0.9317 -0.3630 +vn -0.1458 -0.6360 -0.7577 +vn -0.0968 -0.6427 -0.7599 +vn -0.0769 -0.7290 -0.6802 +vn -0.4582 -0.4998 -0.7351 +vn -0.4397 -0.5214 -0.7314 +vn -0.3970 -0.5728 -0.7171 +vn -0.4455 -0.7968 -0.4081 +vn 0.0578 -0.8889 -0.4544 +vn -0.1928 -0.6269 -0.7549 +vn -0.4890 -0.6178 -0.6158 +vn -0.0191 -0.8616 -0.5073 +vn -0.2684 -0.6008 -0.7530 +vn -0.4919 -0.6861 -0.5360 +vn -0.0724 -0.8166 -0.5727 +vn -0.3759 -0.5603 -0.7381 +vn -0.4584 -0.7666 -0.4495 +vn -0.1374 -0.5970 -0.7904 +vn -0.2033 -0.5970 -0.7760 +vn -0.1463 -0.5120 -0.8465 +vn -0.0724 -0.5187 -0.8519 +vn -0.1623 -0.4055 -0.8996 +vn -0.1151 -0.4314 -0.8948 +vn -0.1703 -0.3632 -0.9160 +vn -0.1454 -0.3665 -0.9190 +vn -0.1447 -0.2635 -0.9537 +vn -0.0796 -0.2474 -0.9656 +vn -0.2667 -0.5743 -0.7740 +vn -0.2723 -0.4838 -0.8318 +vn -0.2619 -0.3620 -0.8946 +vn -0.2391 -0.3486 -0.9063 +vn -0.1637 -0.2767 -0.9469 +vn -0.3681 -0.5374 -0.7587 +vn -0.3511 -0.4524 -0.8198 +vn -0.3262 -0.3258 -0.8874 +vn -0.3429 -0.3276 -0.8804 +vn -0.2529 -0.2428 -0.9365 +vn -0.4459 -0.4996 -0.7427 +vn -0.4339 -0.4405 -0.7859 +vn -0.3439 -0.3242 -0.8813 +vn -0.3186 -0.3425 -0.8839 +vn -0.4030 -0.1445 -0.9037 +vn -0.0664 -0.5807 -0.8114 +vn -0.0357 -0.1641 -0.9858 +vn -0.0271 -0.1878 -0.9818 +vn 0.0547 -0.2325 -0.9711 +vn -0.3606 -0.0600 -0.9308 +vn -0.1133 -0.2401 -0.9641 +vn -0.3970 -0.2771 -0.8750 +vn -0.4497 -0.4873 -0.7485 +vn -0.0745 -0.5331 -0.8428 +vn -0.0284 -0.1766 -0.9839 +vn -0.3091 -0.3220 -0.8949 +vn -0.0210 -0.4292 -0.9029 +vn -0.0411 -0.2008 -0.9788 +vn -0.3864 -0.3373 -0.8584 +vn -0.0069 -0.3570 -0.9341 +vn -0.0839 -0.2316 -0.9692 +vn -0.4843 -0.4383 -0.7572 +vn 0.3241 -0.7710 0.5482 +vn 0.2937 -0.8573 0.4228 +vn 0.2208 -0.9419 0.2532 +vn 0.3804 -0.8623 0.3343 +vn 0.2420 -0.9687 0.0551 +vn 0.4246 -0.8961 0.1296 +vn 0.2696 -0.9618 -0.0479 +vn 0.3758 -0.9223 0.0904 +vn 0.2612 -0.9644 -0.0420 +vn 0.3258 -0.9443 0.0454 +vn 0.2798 -0.9282 0.2454 +vn 0.2012 -0.9649 0.1685 +vn 0.1432 -0.9894 0.0249 +vn 0.1589 -0.9843 -0.0763 +vn 0.1753 -0.9807 -0.0869 +vn 0.2285 -0.9676 0.1078 +vn 0.1740 -0.9824 0.0685 +vn 0.1273 -0.9912 -0.0362 +vn 0.0980 -0.9932 -0.0626 +vn 0.1173 -0.9890 -0.0897 +vn 0.1102 -0.9939 -0.0058 +vn 0.0659 -0.9976 0.0205 +vn 0.0911 -0.9944 -0.0531 +vn 0.0957 -0.9919 -0.0835 +vn 0.0681 -0.9931 -0.0957 +vn 0.3648 -0.6566 0.6601 +vn 0.3580 -0.7291 0.5832 +vn 0.4340 -0.6895 0.5799 +vn 0.2914 -0.9561 -0.0298 +vn 0.3042 -0.9525 -0.0151 +vn 0.3392 -0.9359 0.0947 +vn 0.0607 -0.9859 -0.1559 +vn 0.1279 -0.9897 -0.0646 +vn 0.5047 -0.7857 0.3576 +vn 0.2481 -0.9665 -0.0653 +vn 0.2538 -0.9665 0.0379 +vn 0.4496 -0.8626 0.2317 +vn 0.1829 -0.9791 -0.0892 +vn 0.3285 -0.9272 0.1800 +vn 0.3736 -0.9118 0.1707 +vn 0.1129 -0.9859 -0.1239 +vn 0.3772 -0.8515 0.3642 +vn 0.2899 -0.9483 -0.1292 +vn 0.2339 -0.9631 -0.1329 +vn 0.2253 -0.9513 -0.2107 +vn 0.2832 -0.9410 -0.1850 +vn 0.1957 -0.9484 -0.2494 +vn 0.2732 -0.9325 -0.2364 +vn 0.1762 -0.9288 -0.3261 +vn 0.2723 -0.9086 -0.3168 +vn 0.1691 -0.9117 -0.3744 +vn 0.2369 -0.8978 -0.3712 +vn 0.1535 -0.9727 -0.1742 +vn 0.1068 -0.9677 -0.2283 +vn 0.1038 -0.9575 -0.2690 +vn 0.1181 -0.9331 -0.3397 +vn 0.1292 -0.9220 -0.3649 +vn 0.0933 -0.9729 -0.2118 +vn 0.0912 -0.9565 -0.2773 +vn 0.0568 -0.9673 -0.2471 +vn 0.0848 -0.9573 -0.2763 +vn 0.1639 -0.9211 -0.3532 +vn 0.0592 -0.9759 -0.2098 +vn 0.0716 -0.9661 -0.2480 +vn 0.1078 -0.9577 -0.2669 +vn 0.1052 -0.9588 -0.2638 +vn 0.0899 -0.9505 -0.2975 +vn 0.3153 -0.9391 -0.1371 +vn 0.2661 -0.8633 -0.4288 +vn 0.2896 -0.8464 -0.4469 +vn 0.2632 -0.8942 -0.3621 +vn 0.1229 -0.9332 -0.3377 +vn 0.3229 -0.9287 -0.1821 +vn 0.2162 -0.8972 -0.3852 +vn 0.3153 -0.9194 -0.2352 +vn 0.1329 -0.9330 -0.3345 +vn 0.2887 -0.9117 -0.2923 +vn 0.1784 -0.9206 -0.3473 +vn 0.2957 -0.8476 -0.4406 +vn 0.2739 -0.8591 -0.4323 +vn 0.2502 -0.8522 -0.4596 +vn 0.3373 -0.8155 -0.4703 +vn 0.2982 -0.8136 -0.4991 +vn 0.3936 -0.7576 -0.5207 +vn 0.3620 -0.7611 -0.5382 +vn 0.4007 -0.7269 -0.5577 +vn 0.4359 -0.6578 -0.6142 +vn 0.4442 -0.6358 -0.6312 +vn 0.1877 -0.8930 -0.4090 +vn 0.2257 -0.8531 -0.4705 +vn 0.2412 -0.8503 -0.4677 +vn 0.3115 -0.7984 -0.5153 +vn 0.3081 -0.7357 -0.6032 +vn 0.1620 -0.9126 -0.3755 +vn 0.2175 -0.8703 -0.4418 +vn 0.2522 -0.8531 -0.4566 +vn 0.2252 -0.8226 -0.5222 +vn 0.1445 -0.7561 -0.6383 +vn 0.1289 -0.9150 -0.3824 +vn 0.1382 -0.8888 -0.4369 +vn 0.1440 -0.8655 -0.4798 +vn 0.0806 -0.8221 -0.5636 +vn 0.0275 -0.7416 -0.6702 +vn 0.3101 -0.8384 -0.4483 +vn 0.4179 -0.5792 -0.6999 +vn 0.4289 -0.5827 -0.6903 +vn 0.4555 -0.6317 -0.6273 +vn -0.0016 -0.6490 -0.7608 +vn 0.4214 -0.7588 -0.4967 +vn 0.4454 -0.5439 -0.7112 +vn 0.4347 -0.7364 -0.5184 +vn 0.2987 -0.6082 -0.7354 +vn 0.4283 -0.7114 -0.5572 +vn 0.0740 -0.6686 -0.7399 +vn 0.4260 -0.4689 -0.7737 +vn 0.3692 -0.5171 -0.7723 +vn 0.3907 -0.3868 -0.8353 +vn 0.4257 -0.3831 -0.8198 +vn 0.3005 -0.3287 -0.8953 +vn 0.3236 -0.3789 -0.8670 +vn 0.1809 -0.3050 -0.9350 +vn 0.2096 -0.3110 -0.9270 +vn 0.2296 -0.1820 -0.9561 +vn 0.3189 -0.0709 -0.9451 +vn 0.3294 -0.4944 -0.8044 +vn 0.2767 -0.4310 -0.8589 +vn 0.2057 -0.3357 -0.9192 +vn 0.1524 -0.3001 -0.9416 +vn 0.1850 -0.2296 -0.9555 +vn 0.1307 -0.5571 -0.8201 +vn 0.1611 -0.4403 -0.8833 +vn 0.1244 -0.3547 -0.9267 +vn 0.1543 -0.2983 -0.9419 +vn 0.1432 -0.2549 -0.9563 +vn -0.0401 -0.5917 -0.8052 +vn -0.0015 -0.4955 -0.8686 +vn 0.0754 -0.3848 -0.9199 +vn 0.1368 -0.3143 -0.9394 +vn 0.1446 -0.2379 -0.9605 +vn 0.4443 -0.4553 -0.7716 +vn 0.2799 -0.1157 -0.9530 +vn 0.2578 -0.1630 -0.9523 +vn 0.3746 0.0316 -0.9266 +vn 0.0008 -0.2229 -0.9748 +vn 0.3987 -0.4359 -0.8069 +vn 0.2281 -0.1618 -0.9601 +vn 0.3072 -0.4586 -0.8339 +vn 0.1738 -0.2080 -0.9625 +vn 0.2321 -0.3782 -0.8962 +vn 0.0972 -0.2235 -0.9699 +vn -0.0248 0.0152 0.9996 +vn 0.0621 -0.0244 0.9978 +vn 0.0640 -0.0266 0.9976 +vn -0.0025 0.0080 1.0000 +vn -0.8346 0.4215 0.3547 +vn -0.8070 0.4054 0.4294 +vn -0.8049 0.4112 0.4278 +vn -0.8385 0.4135 0.3548 +vn -0.4238 0.7559 0.4990 +vn -0.4113 0.7827 0.4670 +vn -0.4137 0.7771 0.4743 +vn -0.4298 0.7429 0.5132 +vn 0.2440 0.5361 0.8081 +vn 0.2004 0.4557 0.8673 +vn 0.2039 0.4832 0.8514 +vn 0.2496 0.5570 0.7921 +vn -0.7833 0.3493 0.5142 +vn -0.7859 0.3325 0.5214 +vn 0.1249 0.3499 0.9284 +vn 0.1319 0.3850 0.9134 +vn -0.6384 0.5659 0.5217 +vn -0.6435 0.5372 0.5453 +vn 0.0771 0.1771 0.9812 +vn 0.0757 0.2276 0.9708 +vn -0.4935 0.6578 0.5690 +vn -0.4982 0.6361 0.5892 +vn 0.0132 0.0163 0.9998 +vn -0.0070 0.0508 0.9987 +vn -0.8750 0.4275 0.2271 +vn -0.9269 0.3153 0.2036 +vn -0.9253 0.3190 0.2050 +vn -0.8733 0.4317 0.2259 +vn -0.8931 0.3091 0.3268 +vn -0.8960 0.3008 0.3265 +vn -0.9352 0.3400 0.0984 +vn -0.9329 0.3412 0.1149 +vn -0.9527 0.2980 0.0603 +vn -0.9529 0.2975 0.0588 +vn -0.9220 0.3299 0.2024 +vn -0.9234 0.3267 0.2016 +vn -0.8211 0.5488 0.1566 +vn -0.8891 0.4496 0.0855 +vn -0.8890 0.4492 0.0890 +vn -0.8213 0.5461 0.1653 +vn -0.8927 0.4190 0.1660 +vn -0.8947 0.4180 0.1572 +vn -0.8385 0.5387 0.0827 +vn -0.8363 0.5425 0.0793 +vn -0.8791 0.4750 0.0386 +vn -0.8755 0.4818 0.0375 +vn -0.9154 0.3964 0.0704 +vn -0.9159 0.3947 0.0727 +vn -0.0460 0.9985 -0.0289 +vn -0.2300 0.9729 -0.0251 +vn -0.2015 0.9793 -0.0182 +vn -0.0136 0.9997 -0.0183 +vn -0.5909 0.7943 0.1410 +vn -0.5717 0.8098 0.1320 +vn -0.5658 0.8126 0.1398 +vn -0.6479 0.7534 0.1123 +vn -0.6635 0.7476 0.0307 +vn -0.7103 0.7039 0.0084 +vn -0.7933 0.5929 0.1385 +vn -0.7947 0.5913 0.1371 +vn -0.3577 0.9338 0.0086 +vn -0.3414 0.9399 0.0078 +vn -0.6727 0.7399 0.0090 +vn -0.6692 0.7429 0.0160 +vn -0.4977 0.8672 0.0140 +vn -0.4653 0.8847 0.0283 +vn -0.7234 0.6852 0.0844 +vn -0.7279 0.6798 0.0898 +vn -0.5884 0.8085 -0.0103 +vn -0.5561 0.8311 0.0094 +vn -0.8093 0.5796 0.0950 +vn -0.8097 0.5788 0.0969 +vn 0.4578 0.7366 0.4978 +vn 0.5148 0.6275 0.5841 +vn 0.5098 0.6397 0.5752 +vn 0.4440 0.7530 0.4857 +vn -0.2299 0.4146 0.8805 +vn -0.3080 0.5067 0.8052 +vn -0.2820 0.4875 0.8264 +vn -0.2045 0.3938 0.8962 +vn 0.8292 0.3362 0.4465 +vn 0.9108 0.3103 0.2724 +vn 0.9085 0.3172 0.2721 +vn 0.8228 0.3388 0.4563 +vn 0.0789 0.0074 0.9969 +vn 0.0970 -0.0098 0.9952 +vn 0.5137 0.5936 0.6195 +vn 0.4999 0.6085 0.6163 +vn 0.0440 0.1397 0.9892 +vn 0.0704 0.1126 0.9911 +vn 0.6037 0.4062 0.6860 +vn 0.5873 0.4291 0.6863 +vn -0.0360 0.2637 0.9639 +vn -0.0196 0.2448 0.9694 +vn 0.6957 0.3121 0.6470 +vn 0.6876 0.3195 0.6520 +vn -0.1194 0.3197 0.9400 +vn -0.0998 0.3026 0.9479 +vn 0.9451 0.2741 0.1779 +vn 0.9463 0.2733 0.1729 +vn 0.9573 0.2696 0.1042 +vn 0.9522 0.2895 0.0977 +vn 0.9513 0.2934 0.0949 +vn 0.9568 0.2698 0.1083 +vn 0.9273 0.3418 0.1527 +vn 0.9295 0.3370 0.1501 +vn 0.9258 0.3503 0.1418 +vn 0.9246 0.3526 0.1440 +vn 0.9461 0.3038 0.1122 +vn 0.9441 0.3089 0.1154 +vn 0.9730 0.2216 0.0650 +vn 0.9731 0.2225 0.0601 +vn 0.8655 0.4888 0.1096 +vn 0.8732 0.4869 0.0213 +vn 0.8749 0.4839 0.0193 +vn 0.8650 0.4885 0.1145 +vn 0.9332 0.3419 0.1105 +vn 0.9357 0.3349 0.1112 +vn 0.9106 0.4123 0.0271 +vn 0.9124 0.4085 0.0246 +vn 0.8704 0.4807 0.1065 +vn 0.8720 0.4788 0.1018 +vn 0.8031 0.5871 0.1017 +vn 0.8080 0.5819 0.0925 +vn 0.6800 0.7260 -0.1025 +vn 0.5237 0.6398 -0.5625 +vn 0.4832 0.6349 -0.6029 +vn 0.6811 0.7299 -0.0571 +vn 0.5264 0.7831 -0.3311 +vn 0.4318 0.7764 -0.4590 +vn 0.1443 0.9890 -0.0334 +vn 0.1355 0.9896 -0.0481 +vn 0.7458 0.6548 0.1226 +vn 0.7461 0.6533 0.1284 +vn 0.5422 0.8170 -0.1963 +vn 0.4815 0.8280 -0.2872 +vn 0.7522 0.6575 -0.0431 +vn 0.7585 0.6505 -0.0390 +vn 0.4755 0.8764 -0.0760 +vn 0.4459 0.8843 -0.1389 +vn 0.6723 0.7391 0.0415 +vn 0.6768 0.7349 0.0443 +vn 0.2980 0.9528 -0.0575 +vn 0.2836 0.9553 -0.0835 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_03 +s 1 +f 1951/976/2395 1952/977/2396 1953/978/2397 1954/979/2398 +f 1955/980/2399 1951/976/2395 1954/979/2398 1956/981/2400 +f 1957/982/2401 1955/980/2399 1956/981/2400 1958/983/2402 +f 1959/984/2403 1957/982/2401 1958/983/2402 1960/985/2404 +f 1961/986/2405 1962/987/2406 1952/977/2396 1951/976/2395 +f 1963/988/2407 1961/986/2405 1951/976/2395 1955/980/2399 +f 1964/989/2408 1963/988/2407 1955/980/2399 1957/982/2401 +f 1965/990/2409 1964/989/2408 1957/982/2401 1959/984/2403 +f 1966/991/2410 1967/992/2411 1962/987/2406 1961/986/2405 +f 1968/993/2412 1966/991/2410 1961/986/2405 1963/988/2407 +f 1969/994/2413 1968/993/2412 1963/988/2407 1964/989/2408 +f 1970/995/2414 1969/994/2413 1964/989/2408 1965/990/2409 +f 1971/996/2415 1972/997/2416 1967/992/2411 1966/991/2410 +f 1973/998/2417 1971/996/2415 1966/991/2410 1968/993/2412 +f 1974/999/2418 1973/998/2417 1968/993/2412 1969/994/2413 +f 1975/1000/2419 1974/999/2418 1969/994/2413 1970/995/2414 +f 1953/978/2397 1976/1001/2420 1977/1002/2421 1978/1003/2422 +f 1979/1004/2423 1980/1005/2424 1981/1006/2425 1960/985/2404 +f 1975/1000/2419 1982/1007/2426 1983/1008/2427 1984/1009/2428 +f 1985/1010/2429 1986/1011/2430 1987/1012/2431 1972/997/2416 +f 1954/979/2398 1953/978/2397 1978/1003/2422 1988/1013/2432 +f 1960/985/2404 1981/1006/2425 1989/1014/2433 1959/984/2403 +f 1974/999/2418 1975/1000/2419 1984/1009/2428 1990/1015/2434 +f 1972/997/2416 1987/1012/2431 1991/1016/2435 1967/992/2411 +f 1956/981/2400 1954/979/2398 1988/1013/2432 1992/1017/2436 +f 1959/984/2403 1989/1014/2433 1993/1018/2437 1965/990/2409 +f 1973/998/2417 1974/999/2418 1990/1015/2434 1994/1019/2438 +f 1967/992/2411 1991/1016/2435 1995/1020/2439 1962/987/2406 +f 1958/983/2402 1956/981/2400 1992/1017/2436 1996/1021/2440 +f 1965/990/2409 1993/1018/2437 1997/1022/2441 1970/995/2414 +f 1971/996/2415 1973/998/2417 1994/1019/2438 1998/1023/2442 +f 1962/987/2406 1995/1020/2439 1999/1024/2443 1952/977/2396 +f 1960/985/2404 1958/983/2402 1996/1021/2440 1979/1004/2423 +f 1970/995/2414 1997/1022/2441 1982/1007/2426 1975/1000/2419 +f 1972/997/2416 1971/996/2415 1998/1023/2442 1985/1010/2429 +f 1952/977/2396 1999/1024/2443 1976/1001/2420 1953/978/2397 +f 2000/1025/2444 2001/1026/2445 2002/1027/2446 2003/1028/2447 +f 2004/1029/2448 2000/1025/2444 2003/1028/2447 2005/1030/2449 +f 2006/1031/2450 2004/1029/2448 2005/1030/2449 2007/1032/2451 +f 2008/1033/2452 2006/1031/2450 2007/1032/2451 2009/1034/2453 +f 2010/1035/2454 2011/1036/2455 2001/1026/2445 2000/1025/2444 +f 2012/1037/2456 2010/1035/2454 2000/1025/2444 2004/1029/2448 +f 2013/1038/2457 2012/1037/2456 2004/1029/2448 2006/1031/2450 +f 2014/1039/2458 2013/1038/2457 2006/1031/2450 2008/1033/2452 +f 2015/1040/2459 2016/1041/2460 2011/1036/2455 2010/1035/2454 +f 2017/1042/2461 2015/1040/2459 2010/1035/2454 2012/1037/2456 +f 2018/1043/2462 2017/1042/2461 2012/1037/2456 2013/1038/2457 +f 2019/1044/2463 2018/1043/2462 2013/1038/2457 2014/1039/2458 +f 2020/1045/2464 2021/1046/2465 2016/1041/2460 2015/1040/2459 +f 2022/1047/2466 2020/1045/2464 2015/1040/2459 2017/1042/2461 +f 2023/1048/2467 2022/1047/2466 2017/1042/2461 2018/1043/2462 +f 2024/1049/2468 2023/1048/2467 2018/1043/2462 2019/1044/2463 +f 2002/1027/2446 1981/1006/2425 1980/1005/2424 2025/1050/2469 +f 2026/1051/2470 2027/1052/2471 2028/1053/2472 2009/1034/2453 +f 2024/1049/2468 2029/1054/2473 2030/1055/2474 2031/1056/2475 +f 2032/1057/2476 1983/1008/2427 1982/1007/2426 2021/1046/2465 +f 2003/1028/2447 2002/1027/2446 2025/1050/2469 2033/1058/2477 +f 2009/1034/2453 2028/1053/2472 2034/1059/2478 2008/1033/2452 +f 2023/1048/2467 2024/1049/2468 2031/1056/2475 2035/1060/2479 +f 2021/1046/2465 1982/1007/2426 1997/1022/2441 2016/1041/2460 +f 2005/1030/2449 2003/1028/2447 2033/1058/2477 2036/1061/2480 +f 2008/1033/2452 2034/1059/2478 2037/1062/2481 2014/1039/2458 +f 2022/1047/2466 2023/1048/2467 2035/1060/2479 2038/1063/2482 +f 2016/1041/2460 1997/1022/2441 1993/1018/2437 2011/1036/2455 +f 2007/1032/2451 2005/1030/2449 2036/1061/2480 2039/1064/2483 +f 2014/1039/2458 2037/1062/2481 2040/1065/2484 2019/1044/2463 +f 2020/1045/2464 2022/1047/2466 2038/1063/2482 2041/1066/2485 +f 2011/1036/2455 1993/1018/2437 1989/1014/2433 2001/1026/2445 +f 2009/1034/2453 2007/1032/2451 2039/1064/2483 2026/1051/2470 +f 2019/1044/2463 2040/1065/2484 2029/1054/2473 2024/1049/2468 +f 2021/1046/2465 2020/1045/2464 2041/1066/2485 2032/1057/2476 +f 2001/1026/2445 1989/1014/2433 1981/1006/2425 2002/1027/2446 +f 2042/1067/2486 2043/1068/2487 2044/1069/2488 2045/1070/2489 +f 2046/1071/2490 2042/1067/2486 2045/1070/2489 2047/1072/2491 +f 2048/1073/2492 2046/1071/2490 2047/1072/2491 2049/1074/2493 +f 2050/1075/2494 2048/1073/2492 2049/1074/2493 2051/1076/2495 +f 2052/1077/2496 2053/1078/2497 2043/1068/2487 2042/1067/2486 +f 2054/1079/2498 2052/1077/2496 2042/1067/2486 2046/1071/2490 +f 2055/1080/2499 2054/1079/2498 2046/1071/2490 2048/1073/2492 +f 2056/1081/2500 2055/1080/2499 2048/1073/2492 2050/1075/2494 +f 2057/1082/2501 2058/1083/2502 2053/1078/2497 2052/1077/2496 +f 2059/1084/2503 2057/1082/2501 2052/1077/2496 2054/1079/2498 +f 2060/1085/2504 2059/1084/2503 2054/1079/2498 2055/1080/2499 +f 2061/1086/2505 2060/1085/2504 2055/1080/2499 2056/1081/2500 +f 2062/1087/2506 2063/1088/2507 2058/1083/2502 2057/1082/2501 +f 2064/1089/2508 2062/1087/2506 2057/1082/2501 2059/1084/2503 +f 2065/1090/2509 2064/1089/2508 2059/1084/2503 2060/1085/2504 +f 2066/1091/2510 2065/1090/2509 2060/1085/2504 2061/1086/2505 +f 2044/1069/2488 2028/1053/2472 2027/1052/2471 2067/1092/2511 +f 2068/1093/2512 2069/1094/2513 2070/1095/2514 2051/1076/2495 +f 2066/1091/2510 2071/1096/2515 2072/1097/2516 2073/1098/2517 +f 2074/1099/2518 2030/1055/2474 2029/1054/2473 2063/1088/2507 +f 2045/1070/2489 2044/1069/2488 2067/1092/2511 2075/1100/2519 +f 2051/1076/2495 2070/1095/2514 2076/1101/2520 2050/1075/2494 +f 2065/1090/2509 2066/1091/2510 2073/1098/2517 2077/1102/2521 +f 2063/1088/2507 2029/1054/2473 2040/1065/2484 2058/1083/2502 +f 2047/1072/2491 2045/1070/2489 2075/1100/2519 2078/1103/2522 +f 2050/1075/2494 2076/1101/2520 2079/1104/2523 2056/1081/2500 +f 2064/1089/2508 2065/1090/2509 2077/1102/2521 2080/1105/2524 +f 2058/1083/2502 2040/1065/2484 2037/1062/2481 2053/1078/2497 +f 2049/1074/2493 2047/1072/2491 2078/1103/2522 2081/1106/2525 +f 2056/1081/2500 2079/1104/2523 2082/1107/2526 2061/1086/2505 +f 2062/1087/2506 2064/1089/2508 2080/1105/2524 2083/1108/2527 +f 2053/1078/2497 2037/1062/2481 2034/1059/2478 2043/1068/2487 +f 2051/1076/2495 2049/1074/2493 2081/1106/2525 2068/1093/2512 +f 2061/1086/2505 2082/1107/2526 2071/1096/2515 2066/1091/2510 +f 2063/1088/2507 2062/1087/2506 2083/1108/2527 2074/1099/2518 +f 2043/1068/2487 2034/1059/2478 2028/1053/2472 2044/1069/2488 +f 2084/1109/2528 2085/1110/2529 2086/1111/2530 2087/1112/2531 +f 2088/1113/2532 2084/1109/2528 2087/1112/2531 2089/1114/2533 +f 2090/1115/2534 2088/1113/2532 2089/1114/2533 2091/1116/2535 +f 2092/1117/2536 2090/1115/2534 2091/1116/2535 2093/1118/2537 +f 2094/1119/2538 2095/1120/2539 2085/1110/2529 2084/1109/2528 +f 2096/1121/2540 2094/1119/2538 2084/1109/2528 2088/1113/2532 +f 2097/1122/2541 2096/1121/2540 2088/1113/2532 2090/1115/2534 +f 2098/1123/2542 2097/1122/2541 2090/1115/2534 2092/1117/2536 +f 2099/1124/2543 2100/1125/2544 2095/1120/2539 2094/1119/2538 +f 2101/1126/2545 2099/1124/2543 2094/1119/2538 2096/1121/2540 +f 2102/1127/2546 2101/1126/2545 2096/1121/2540 2097/1122/2541 +f 2103/1128/2547 2102/1127/2546 2097/1122/2541 2098/1123/2542 +f 2104/1129/2548 2105/1130/2549 2100/1125/2544 2099/1124/2543 +f 2106/1131/2550 2104/1129/2548 2099/1124/2543 2101/1126/2545 +f 2107/1132/2551 2106/1131/2550 2101/1126/2545 2102/1127/2546 +f 2108/1133/2552 2107/1132/2551 2102/1127/2546 2103/1128/2547 +f 2086/1111/2530 2070/1095/2514 2069/1094/2513 2109/1134/2553 +f 2110/1135/2554 2111/1136/2555 2112/1137/2556 2093/1118/2537 +f 2108/1133/2552 2113/1138/2557 2114/1139/2558 2115/1140/2559 +f 2116/1141/2560 2072/1097/2516 2071/1096/2515 2105/1130/2549 +f 2087/1112/2531 2086/1111/2530 2109/1134/2553 2117/1142/2561 +f 2093/1118/2537 2112/1137/2556 2118/1143/2562 2092/1117/2536 +f 2107/1132/2551 2108/1133/2552 2115/1140/2559 2119/1144/2563 +f 2105/1130/2549 2071/1096/2515 2082/1107/2526 2100/1125/2544 +f 2089/1114/2533 2087/1112/2531 2117/1142/2561 2120/1145/2564 +f 2092/1117/2536 2118/1143/2562 2121/1146/2565 2098/1123/2542 +f 2106/1131/2550 2107/1132/2551 2119/1144/2563 2122/1147/2566 +f 2100/1125/2544 2082/1107/2526 2079/1104/2523 2095/1120/2539 +f 2091/1116/2535 2089/1114/2533 2120/1145/2564 2123/1148/2567 +f 2098/1123/2542 2121/1146/2565 2124/1149/2568 2103/1128/2547 +f 2104/1129/2548 2106/1131/2550 2122/1147/2566 2125/1150/2569 +f 2095/1120/2539 2079/1104/2523 2076/1101/2520 2085/1110/2529 +f 2093/1118/2537 2091/1116/2535 2123/1148/2567 2110/1135/2554 +f 2103/1128/2547 2124/1149/2568 2113/1138/2557 2108/1133/2552 +f 2105/1130/2549 2104/1129/2548 2125/1150/2569 2116/1141/2560 +f 2085/1110/2529 2076/1101/2520 2070/1095/2514 2086/1111/2530 +f 2126/1151/2570 2127/1152/2571 2128/1153/2572 2129/1154/2573 +f 2130/1155/2574 2126/1151/2570 2129/1154/2573 2131/1156/2575 +f 2132/1157/2576 2130/1155/2574 2131/1156/2575 2133/1158/2577 +f 2134/1159/2578 2132/1157/2576 2133/1158/2577 2135/1160/2579 +f 2136/1161/2580 2137/1162/2581 2127/1152/2571 2126/1151/2570 +f 2138/1163/2582 2136/1161/2580 2126/1151/2570 2130/1155/2574 +f 2139/1164/2583 2138/1163/2582 2130/1155/2574 2132/1157/2576 +f 2140/1165/2584 2139/1164/2583 2132/1157/2576 2134/1159/2578 +f 2141/1166/2585 2142/1167/2586 2137/1162/2581 2136/1161/2580 +f 2143/1168/2587 2141/1166/2585 2136/1161/2580 2138/1163/2582 +f 2144/1169/2588 2143/1168/2587 2138/1163/2582 2139/1164/2583 +f 2145/1170/2589 2144/1169/2588 2139/1164/2583 2140/1165/2584 +f 2146/1171/2590 2147/1172/2591 2142/1167/2586 2141/1166/2585 +f 2148/1173/2592 2146/1171/2590 2141/1166/2585 2143/1168/2587 +f 2149/1174/2593 2148/1173/2592 2143/1168/2587 2144/1169/2588 +f 2150/1175/2594 2149/1174/2593 2144/1169/2588 2145/1170/2589 +f 2128/1153/2572 2151/1176/2595 2152/1177/2596 2153/1178/2597 +f 2154/1179/2598 2155/1180/2599 2156/1181/2600 2135/1160/2579 +f 2150/1175/2594 2157/1182/2601 1980/1005/2424 1979/1004/2423 +f 1978/1003/2422 1977/1002/2421 2158/1183/2602 2147/1172/2591 +f 2129/1154/2573 2128/1153/2572 2153/1178/2597 2159/1184/2603 +f 2135/1160/2579 2156/1181/2600 2160/1185/2604 2134/1159/2578 +f 2149/1174/2593 2150/1175/2594 1979/1004/2423 1996/1021/2440 +f 2147/1172/2591 2158/1183/2602 2161/1186/2605 2142/1167/2586 +f 2131/1156/2575 2129/1154/2573 2159/1184/2603 2162/1187/2606 +f 2134/1159/2578 2160/1185/2604 2163/1188/2607 2140/1165/2584 +f 2148/1173/2592 2149/1174/2593 1996/1021/2440 1992/1017/2436 +f 2142/1167/2586 2161/1186/2605 2164/1189/2608 2137/1162/2581 +f 2133/1158/2577 2131/1156/2575 2162/1187/2606 2165/1190/2609 +f 2140/1165/2584 2163/1188/2607 2166/1191/2610 2145/1170/2589 +f 2146/1171/2590 2148/1173/2592 1992/1017/2436 1988/1013/2432 +f 2137/1162/2581 2164/1189/2608 2167/1192/2611 2127/1152/2571 +f 2135/1160/2579 2133/1158/2577 2165/1190/2609 2154/1179/2598 +f 2145/1170/2589 2166/1191/2610 2157/1182/2601 2150/1175/2594 +f 2147/1172/2591 2146/1171/2590 1988/1013/2432 1978/1003/2422 +f 2127/1152/2571 2167/1192/2611 2151/1176/2595 2128/1153/2572 +f 2168/1193/2612 2169/1194/2613 2170/1195/2614 2171/1196/2615 +f 2172/1197/2616 2168/1193/2612 2171/1196/2615 2173/1198/2617 +f 2174/1199/2618 2172/1197/2616 2173/1198/2617 2175/1200/2619 +f 2176/1201/2620 2174/1199/2618 2175/1200/2619 2177/1202/2621 +f 2178/1203/2622 2179/1204/2623 2169/1194/2613 2168/1193/2612 +f 2180/1205/2624 2178/1203/2622 2168/1193/2612 2172/1197/2616 +f 2181/1206/2625 2180/1205/2624 2172/1197/2616 2174/1199/2618 +f 2182/1207/2626 2181/1206/2625 2174/1199/2618 2176/1201/2620 +f 2183/1208/2627 2184/1209/2628 2179/1204/2623 2178/1203/2622 +f 2185/1210/2629 2183/1208/2627 2178/1203/2622 2180/1205/2624 +f 2186/1211/2630 2185/1210/2629 2180/1205/2624 2181/1206/2625 +f 2187/1212/2631 2186/1211/2630 2181/1206/2625 2182/1207/2626 +f 2188/1213/2632 2189/1214/2633 2184/1209/2628 2183/1208/2627 +f 2190/1215/2634 2188/1213/2632 2183/1208/2627 2185/1210/2629 +f 2191/1216/2635 2190/1215/2634 2185/1210/2629 2186/1211/2630 +f 2192/1217/2636 2191/1216/2635 2186/1211/2630 2187/1212/2631 +f 2170/1195/2614 2156/1181/2600 2155/1180/2599 2193/1218/2637 +f 2194/1219/2638 2195/1220/2639 2196/1221/2640 2177/1202/2621 +f 2192/1217/2636 2197/1222/2641 2027/1052/2471 2026/1051/2470 +f 2025/1050/2469 1980/1005/2424 2157/1182/2601 2189/1214/2633 +f 2171/1196/2615 2170/1195/2614 2193/1218/2637 2198/1223/2642 +f 2177/1202/2621 2196/1221/2640 2199/1224/2643 2176/1201/2620 +f 2191/1216/2635 2192/1217/2636 2026/1051/2470 2039/1064/2483 +f 2189/1214/2633 2157/1182/2601 2166/1191/2610 2184/1209/2628 +f 2173/1198/2617 2171/1196/2615 2198/1223/2642 2200/1225/2644 +f 2176/1201/2620 2199/1224/2643 2201/1226/2645 2182/1207/2626 +f 2190/1215/2634 2191/1216/2635 2039/1064/2483 2036/1061/2480 +f 2184/1209/2628 2166/1191/2610 2163/1188/2607 2179/1204/2623 +f 2175/1200/2619 2173/1198/2617 2200/1225/2644 2202/1227/2646 +f 2182/1207/2626 2201/1226/2645 2203/1228/2647 2187/1212/2631 +f 2188/1213/2632 2190/1215/2634 2036/1061/2480 2033/1058/2477 +f 2179/1204/2623 2163/1188/2607 2160/1185/2604 2169/1194/2613 +f 2177/1202/2621 2175/1200/2619 2202/1227/2646 2194/1219/2638 +f 2187/1212/2631 2203/1228/2647 2197/1222/2641 2192/1217/2636 +f 2189/1214/2633 2188/1213/2632 2033/1058/2477 2025/1050/2469 +f 2169/1194/2613 2160/1185/2604 2156/1181/2600 2170/1195/2614 +f 2204/1229/2648 2205/1230/2649 2206/1231/2650 2207/1232/2651 +f 2208/1233/2652 2204/1229/2648 2207/1232/2651 2209/1234/2653 +f 2210/1235/2654 2208/1233/2652 2209/1234/2653 2211/1236/2655 +f 2212/1237/2656 2210/1235/2654 2211/1236/2655 2213/1238/2657 +f 2214/1239/2658 2215/1240/2659 2205/1230/2649 2204/1229/2648 +f 2216/1241/2660 2214/1239/2658 2204/1229/2648 2208/1233/2652 +f 2217/1242/2661 2216/1241/2660 2208/1233/2652 2210/1235/2654 +f 2218/1243/2662 2217/1242/2661 2210/1235/2654 2212/1237/2656 +f 2219/1244/2663 2220/1245/2664 2215/1240/2659 2214/1239/2658 +f 2221/1246/2665 2219/1244/2663 2214/1239/2658 2216/1241/2660 +f 2222/1247/2666 2221/1246/2665 2216/1241/2660 2217/1242/2661 +f 2223/1248/2667 2222/1247/2666 2217/1242/2661 2218/1243/2662 +f 2224/1249/2668 2225/1250/2669 2220/1245/2664 2219/1244/2663 +f 2226/1251/2670 2224/1249/2668 2219/1244/2663 2221/1246/2665 +f 2227/1252/2671 2226/1251/2670 2221/1246/2665 2222/1247/2666 +f 2228/1253/2672 2227/1252/2671 2222/1247/2666 2223/1248/2667 +f 2206/1231/2650 2196/1221/2640 2195/1220/2639 2229/1254/2673 +f 2230/1255/2674 2231/1256/2675 2232/1257/2676 2213/1238/2657 +f 2228/1253/2672 2233/1258/2677 2069/1094/2513 2068/1093/2512 +f 2067/1092/2511 2027/1052/2471 2197/1222/2641 2225/1250/2669 +f 2207/1232/2651 2206/1231/2650 2229/1254/2673 2234/1259/2678 +f 2213/1238/2657 2232/1257/2676 2235/1260/2679 2212/1237/2656 +f 2227/1252/2671 2228/1253/2672 2068/1093/2512 2081/1106/2525 +f 2225/1250/2669 2197/1222/2641 2203/1228/2647 2220/1245/2664 +f 2209/1234/2653 2207/1232/2651 2234/1259/2678 2236/1261/2680 +f 2212/1237/2656 2235/1260/2679 2237/1262/2681 2218/1243/2662 +f 2226/1251/2670 2227/1252/2671 2081/1106/2525 2078/1103/2522 +f 2220/1245/2664 2203/1228/2647 2201/1226/2645 2215/1240/2659 +f 2211/1236/2655 2209/1234/2653 2236/1261/2680 2238/1263/2682 +f 2218/1243/2662 2237/1262/2681 2239/1264/2683 2223/1248/2667 +f 2224/1249/2668 2226/1251/2670 2078/1103/2522 2075/1100/2519 +f 2215/1240/2659 2201/1226/2645 2199/1224/2643 2205/1230/2649 +f 2213/1238/2657 2211/1236/2655 2238/1263/2682 2230/1255/2674 +f 2223/1248/2667 2239/1264/2683 2233/1258/2677 2228/1253/2672 +f 2225/1250/2669 2224/1249/2668 2075/1100/2519 2067/1092/2511 +f 2205/1230/2649 2199/1224/2643 2196/1221/2640 2206/1231/2650 +f 2240/1265/2684 2241/1266/2685 2242/1267/2686 2243/1268/2687 +f 2244/1269/2688 2240/1265/2684 2243/1268/2687 2245/1270/2689 +f 2246/1271/2690 2244/1269/2688 2245/1270/2689 2247/1272/2691 +f 2248/1273/2692 2246/1271/2690 2247/1272/2691 2249/1274/2693 +f 2250/1275/2694 2251/1276/2695 2241/1266/2685 2240/1265/2684 +f 2252/1277/2696 2250/1275/2694 2240/1265/2684 2244/1269/2688 +f 2253/1278/2697 2252/1277/2696 2244/1269/2688 2246/1271/2690 +f 2254/1279/2698 2253/1278/2697 2246/1271/2690 2248/1273/2692 +f 2255/1280/2699 2256/1281/2700 2251/1276/2695 2250/1275/2694 +f 2257/1282/2701 2255/1280/2699 2250/1275/2694 2252/1277/2696 +f 2258/1283/2702 2257/1282/2701 2252/1277/2696 2253/1278/2697 +f 2259/1284/2703 2258/1283/2702 2253/1278/2697 2254/1279/2698 +f 2260/1285/2704 2261/1286/2705 2256/1281/2700 2255/1280/2699 +f 2262/1287/2706 2260/1285/2704 2255/1280/2699 2257/1282/2701 +f 2263/1288/2707 2262/1287/2706 2257/1282/2701 2258/1283/2702 +f 2264/1289/2708 2263/1288/2707 2258/1283/2702 2259/1284/2703 +f 2242/1267/2686 2232/1257/2676 2231/1256/2675 2265/1290/2709 +f 2266/1291/2710 2267/1292/2711 2268/1293/2712 2249/1274/2693 +f 2264/1289/2708 2269/1294/2713 2111/1136/2555 2110/1135/2554 +f 2109/1134/2553 2069/1094/2513 2233/1258/2677 2261/1286/2705 +f 2243/1268/2687 2242/1267/2686 2265/1290/2709 2270/1295/2714 +f 2249/1274/2693 2268/1293/2712 2271/1296/2715 2248/1273/2692 +f 2263/1288/2707 2264/1289/2708 2110/1135/2554 2123/1148/2567 +f 2261/1286/2705 2233/1258/2677 2239/1264/2683 2256/1281/2700 +f 2245/1270/2689 2243/1268/2687 2270/1295/2714 2272/1297/2716 +f 2248/1273/2692 2271/1296/2715 2273/1298/2717 2254/1279/2698 +f 2262/1287/2706 2263/1288/2707 2123/1148/2567 2120/1145/2564 +f 2256/1281/2700 2239/1264/2683 2237/1262/2681 2251/1276/2695 +f 2247/1272/2691 2245/1270/2689 2272/1297/2716 2274/1299/2718 +f 2254/1279/2698 2273/1298/2717 2275/1300/2719 2259/1284/2703 +f 2260/1285/2704 2262/1287/2706 2120/1145/2564 2117/1142/2561 +f 2251/1276/2695 2237/1262/2681 2235/1260/2679 2241/1266/2685 +f 2249/1274/2693 2247/1272/2691 2274/1299/2718 2266/1291/2710 +f 2259/1284/2703 2275/1300/2719 2269/1294/2713 2264/1289/2708 +f 2261/1286/2705 2260/1285/2704 2117/1142/2561 2109/1134/2553 +f 2241/1266/2685 2235/1260/2679 2232/1257/2676 2242/1267/2686 +f 2276/978/2720 2277/977/2721 2278/976/2722 2279/979/2723 +f 2279/979/2723 2278/976/2722 2280/980/2724 2281/981/2725 +f 2281/981/2725 2280/980/2724 2282/982/2726 2283/983/2727 +f 2283/983/2727 2282/982/2726 2284/984/2728 2285/985/2729 +f 2277/977/2721 2286/987/2730 2287/986/2731 2278/976/2722 +f 2278/976/2722 2287/986/2731 2288/988/2732 2280/980/2724 +f 2280/980/2724 2288/988/2732 2289/989/2733 2282/982/2726 +f 2282/982/2726 2289/989/2733 2290/990/2734 2284/984/2728 +f 2286/987/2730 2291/992/2735 2292/991/2736 2287/986/2731 +f 2287/986/2731 2292/991/2736 2293/993/2737 2288/988/2732 +f 2288/988/2732 2293/993/2737 2294/994/2738 2289/989/2733 +f 2289/989/2733 2294/994/2738 2295/995/2739 2290/990/2734 +f 2291/992/2735 2296/997/2740 2297/996/2741 2292/991/2736 +f 2292/991/2736 2297/996/2741 2298/998/2742 2293/993/2737 +f 2293/993/2737 2298/998/2742 2299/999/2743 2294/994/2738 +f 2294/994/2738 2299/999/2743 2300/1000/2744 2295/995/2739 +f 2301/1002/2745 2302/1001/2746 2276/978/2720 2303/1003/2747 +f 2304/1006/2748 2305/1005/2749 2306/1004/2750 2285/985/2729 +f 2307/1008/2751 2308/1007/2752 2300/1000/2744 2309/1009/2753 +f 2310/1012/2754 2311/1011/2755 2312/1010/2756 2296/997/2740 +f 2303/1003/2747 2276/978/2720 2279/979/2723 2313/1013/2757 +f 2314/1014/2758 2304/1006/2748 2285/985/2729 2284/984/2728 +f 2309/1009/2753 2300/1000/2744 2299/999/2743 2315/1015/2759 +f 2316/1016/2760 2310/1012/2754 2296/997/2740 2291/992/2735 +f 2313/1013/2757 2279/979/2723 2281/981/2725 2317/1017/2761 +f 2318/1018/2762 2314/1014/2758 2284/984/2728 2290/990/2734 +f 2315/1015/2759 2299/999/2743 2298/998/2742 2319/1019/2763 +f 2320/1020/2764 2316/1016/2760 2291/992/2735 2286/987/2730 +f 2317/1017/2761 2281/981/2725 2283/983/2727 2321/1021/2765 +f 2322/1022/2766 2318/1018/2762 2290/990/2734 2295/995/2739 +f 2319/1019/2763 2298/998/2742 2297/996/2741 2323/1023/2767 +f 2324/1024/2768 2320/1020/2764 2286/987/2730 2277/977/2721 +f 2321/1021/2765 2283/983/2727 2285/985/2729 2306/1004/2750 +f 2308/1007/2752 2322/1022/2766 2295/995/2739 2300/1000/2744 +f 2323/1023/2767 2297/996/2741 2296/997/2740 2312/1010/2756 +f 2302/1001/2746 2324/1024/2768 2277/977/2721 2276/978/2720 +f 2325/1027/2769 2326/1026/2770 2327/1025/2771 2328/1028/2772 +f 2328/1028/2772 2327/1025/2771 2329/1029/2773 2330/1030/2774 +f 2330/1030/2774 2329/1029/2773 2331/1031/2775 2332/1032/2776 +f 2332/1032/2776 2331/1031/2775 2333/1033/2777 2334/1034/2778 +f 2326/1026/2770 2335/1036/2779 2336/1035/2780 2327/1025/2771 +f 2327/1025/2771 2336/1035/2780 2337/1037/2781 2329/1029/2773 +f 2329/1029/2773 2337/1037/2781 2338/1038/2782 2331/1031/2775 +f 2331/1031/2775 2338/1038/2782 2339/1039/2783 2333/1033/2777 +f 2335/1036/2779 2340/1041/2784 2341/1040/2785 2336/1035/2780 +f 2336/1035/2780 2341/1040/2785 2342/1042/2786 2337/1037/2781 +f 2337/1037/2781 2342/1042/2786 2343/1043/2787 2338/1038/2782 +f 2338/1038/2782 2343/1043/2787 2344/1044/2788 2339/1039/2783 +f 2340/1041/2784 2345/1046/2789 2346/1045/2790 2341/1040/2785 +f 2341/1040/2785 2346/1045/2790 2347/1047/2791 2342/1042/2786 +f 2342/1042/2786 2347/1047/2791 2348/1048/2792 2343/1043/2787 +f 2343/1043/2787 2348/1048/2792 2349/1049/2793 2344/1044/2788 +f 2305/1005/2749 2304/1006/2748 2325/1027/2769 2350/1050/2794 +f 2351/1053/2795 2352/1052/2796 2353/1051/2797 2334/1034/2778 +f 2354/1055/2798 2355/1054/2799 2349/1049/2793 2356/1056/2800 +f 2308/1007/2752 2307/1008/2751 2357/1057/2801 2345/1046/2789 +f 2350/1050/2794 2325/1027/2769 2328/1028/2772 2358/1058/2802 +f 2359/1059/2803 2351/1053/2795 2334/1034/2778 2333/1033/2777 +f 2356/1056/2800 2349/1049/2793 2348/1048/2792 2360/1060/2804 +f 2322/1022/2766 2308/1007/2752 2345/1046/2789 2340/1041/2784 +f 2358/1058/2802 2328/1028/2772 2330/1030/2774 2361/1061/2805 +f 2362/1062/2806 2359/1059/2803 2333/1033/2777 2339/1039/2783 +f 2360/1060/2804 2348/1048/2792 2347/1047/2791 2363/1063/2807 +f 2318/1018/2762 2322/1022/2766 2340/1041/2784 2335/1036/2779 +f 2361/1061/2805 2330/1030/2774 2332/1032/2776 2364/1064/2808 +f 2365/1065/2809 2362/1062/2806 2339/1039/2783 2344/1044/2788 +f 2363/1063/2807 2347/1047/2791 2346/1045/2790 2366/1066/2810 +f 2314/1014/2758 2318/1018/2762 2335/1036/2779 2326/1026/2770 +f 2364/1064/2808 2332/1032/2776 2334/1034/2778 2353/1051/2797 +f 2355/1054/2799 2365/1065/2809 2344/1044/2788 2349/1049/2793 +f 2366/1066/2810 2346/1045/2790 2345/1046/2789 2357/1057/2801 +f 2304/1006/2748 2314/1014/2758 2326/1026/2770 2325/1027/2769 +f 2367/1069/2811 2368/1068/2812 2369/1067/2813 2370/1070/2814 +f 2370/1070/2814 2369/1067/2813 2371/1071/2815 2372/1072/2816 +f 2372/1072/2816 2371/1071/2815 2373/1073/2817 2374/1074/2818 +f 2374/1074/2818 2373/1073/2817 2375/1075/2819 2376/1076/2820 +f 2368/1068/2812 2377/1078/2821 2378/1077/2822 2369/1067/2813 +f 2369/1067/2813 2378/1077/2822 2379/1079/2823 2371/1071/2815 +f 2371/1071/2815 2379/1079/2823 2380/1080/2824 2373/1073/2817 +f 2373/1073/2817 2380/1080/2824 2381/1081/2825 2375/1075/2819 +f 2377/1078/2821 2382/1083/2826 2383/1082/2827 2378/1077/2822 +f 2378/1077/2822 2383/1082/2827 2384/1084/2828 2379/1079/2823 +f 2379/1079/2823 2384/1084/2828 2385/1085/2829 2380/1080/2824 +f 2380/1080/2824 2385/1085/2829 2386/1086/2830 2381/1081/2825 +f 2382/1083/2826 2387/1088/2831 2388/1087/2832 2383/1082/2827 +f 2383/1082/2827 2388/1087/2832 2389/1089/2833 2384/1084/2828 +f 2384/1084/2828 2389/1089/2833 2390/1090/2834 2385/1085/2829 +f 2385/1085/2829 2390/1090/2834 2391/1091/2835 2386/1086/2830 +f 2352/1052/2796 2351/1053/2795 2367/1069/2811 2392/1092/2836 +f 2393/1095/2837 2394/1094/2838 2395/1093/2839 2376/1076/2820 +f 2396/1097/2840 2397/1096/2841 2391/1091/2835 2398/1098/2842 +f 2355/1054/2799 2354/1055/2798 2399/1099/2843 2387/1088/2831 +f 2392/1092/2836 2367/1069/2811 2370/1070/2814 2400/1100/2844 +f 2401/1101/2845 2393/1095/2837 2376/1076/2820 2375/1075/2819 +f 2398/1098/2842 2391/1091/2835 2390/1090/2834 2402/1102/2846 +f 2365/1065/2809 2355/1054/2799 2387/1088/2831 2382/1083/2826 +f 2400/1100/2844 2370/1070/2814 2372/1072/2816 2403/1103/2847 +f 2404/1104/2848 2401/1101/2845 2375/1075/2819 2381/1081/2825 +f 2402/1102/2846 2390/1090/2834 2389/1089/2833 2405/1105/2849 +f 2362/1062/2806 2365/1065/2809 2382/1083/2826 2377/1078/2821 +f 2403/1103/2847 2372/1072/2816 2374/1074/2818 2406/1106/2850 +f 2407/1107/2851 2404/1104/2848 2381/1081/2825 2386/1086/2830 +f 2405/1105/2849 2389/1089/2833 2388/1087/2832 2408/1108/2852 +f 2359/1059/2803 2362/1062/2806 2377/1078/2821 2368/1068/2812 +f 2406/1106/2850 2374/1074/2818 2376/1076/2820 2395/1093/2839 +f 2397/1096/2841 2407/1107/2851 2386/1086/2830 2391/1091/2835 +f 2408/1108/2852 2388/1087/2832 2387/1088/2831 2399/1099/2843 +f 2351/1053/2795 2359/1059/2803 2368/1068/2812 2367/1069/2811 +f 2409/1111/2853 2410/1110/2854 2411/1109/2855 2412/1112/2856 +f 2412/1112/2856 2411/1109/2855 2413/1113/2857 2414/1114/2858 +f 2414/1114/2858 2413/1113/2857 2415/1115/2859 2416/1116/2860 +f 2416/1116/2860 2415/1115/2859 2417/1117/2861 2418/1118/2862 +f 2410/1110/2854 2419/1120/2863 2420/1119/2864 2411/1109/2855 +f 2411/1109/2855 2420/1119/2864 2421/1121/2865 2413/1113/2857 +f 2413/1113/2857 2421/1121/2865 2422/1122/2866 2415/1115/2859 +f 2415/1115/2859 2422/1122/2866 2423/1123/2867 2417/1117/2861 +f 2419/1120/2863 2424/1125/2868 2425/1124/2869 2420/1119/2864 +f 2420/1119/2864 2425/1124/2869 2426/1126/2870 2421/1121/2865 +f 2421/1121/2865 2426/1126/2870 2427/1127/2871 2422/1122/2866 +f 2422/1122/2866 2427/1127/2871 2428/1128/2872 2423/1123/2867 +f 2424/1125/2868 2429/1130/2873 2430/1129/2874 2425/1124/2869 +f 2425/1124/2869 2430/1129/2874 2431/1131/2875 2426/1126/2870 +f 2426/1126/2870 2431/1131/2875 2432/1132/2876 2427/1127/2871 +f 2427/1127/2871 2432/1132/2876 2433/1133/2877 2428/1128/2872 +f 2394/1094/2838 2393/1095/2837 2409/1111/2853 2434/1134/2878 +f 2435/1137/2879 2436/1136/2880 2437/1135/2881 2418/1118/2862 +f 2438/1139/2882 2439/1138/2883 2433/1133/2877 2440/1140/2884 +f 2397/1096/2841 2396/1097/2840 2441/1141/2885 2429/1130/2873 +f 2434/1134/2878 2409/1111/2853 2412/1112/2856 2442/1142/2886 +f 2443/1143/2887 2435/1137/2879 2418/1118/2862 2417/1117/2861 +f 2440/1140/2884 2433/1133/2877 2432/1132/2876 2444/1144/2888 +f 2407/1107/2851 2397/1096/2841 2429/1130/2873 2424/1125/2868 +f 2442/1142/2886 2412/1112/2856 2414/1114/2858 2445/1145/2889 +f 2446/1146/2890 2443/1143/2887 2417/1117/2861 2423/1123/2867 +f 2444/1144/2888 2432/1132/2876 2431/1131/2875 2447/1147/2891 +f 2404/1104/2848 2407/1107/2851 2424/1125/2868 2419/1120/2863 +f 2445/1145/2889 2414/1114/2858 2416/1116/2860 2448/1148/2892 +f 2449/1149/2893 2446/1146/2890 2423/1123/2867 2428/1128/2872 +f 2447/1147/2891 2431/1131/2875 2430/1129/2874 2450/1150/2894 +f 2401/1101/2845 2404/1104/2848 2419/1120/2863 2410/1110/2854 +f 2448/1148/2892 2416/1116/2860 2418/1118/2862 2437/1135/2881 +f 2439/1138/2883 2449/1149/2893 2428/1128/2872 2433/1133/2877 +f 2450/1150/2894 2430/1129/2874 2429/1130/2873 2441/1141/2885 +f 2393/1095/2837 2401/1101/2845 2410/1110/2854 2409/1111/2853 +f 2451/1153/2895 2452/1152/2896 2453/1151/2897 2454/1154/2898 +f 2454/1154/2898 2453/1151/2897 2455/1155/2899 2456/1156/2900 +f 2456/1156/2900 2455/1155/2899 2457/1157/2901 2458/1158/2902 +f 2458/1158/2902 2457/1157/2901 2459/1159/2903 2460/1160/2904 +f 2452/1152/2896 2461/1162/2905 2462/1161/2906 2453/1151/2897 +f 2453/1151/2897 2462/1161/2906 2463/1163/2907 2455/1155/2899 +f 2455/1155/2899 2463/1163/2907 2464/1164/2908 2457/1157/2901 +f 2457/1157/2901 2464/1164/2908 2465/1165/2909 2459/1159/2903 +f 2461/1162/2905 2466/1167/2910 2467/1166/2911 2462/1161/2906 +f 2462/1161/2906 2467/1166/2911 2468/1168/2912 2463/1163/2907 +f 2463/1163/2907 2468/1168/2912 2469/1169/2913 2464/1164/2908 +f 2464/1164/2908 2469/1169/2913 2470/1170/2914 2465/1165/2909 +f 2466/1167/2910 2471/1172/2915 2472/1171/2916 2467/1166/2911 +f 2467/1166/2911 2472/1171/2916 2473/1173/2917 2468/1168/2912 +f 2468/1168/2912 2473/1173/2917 2474/1174/2918 2469/1169/2913 +f 2469/1169/2913 2474/1174/2918 2475/1175/2919 2470/1170/2914 +f 2476/1177/2920 2477/1176/2921 2451/1153/2895 2478/1178/2922 +f 2479/1181/2923 2480/1180/2924 2481/1179/2925 2460/1160/2904 +f 2305/1005/2749 2482/1182/2926 2475/1175/2919 2306/1004/2750 +f 2483/1183/2927 2301/1002/2745 2303/1003/2747 2471/1172/2915 +f 2478/1178/2922 2451/1153/2895 2454/1154/2898 2484/1184/2928 +f 2485/1185/2929 2479/1181/2923 2460/1160/2904 2459/1159/2903 +f 2306/1004/2750 2475/1175/2919 2474/1174/2918 2321/1021/2765 +f 2486/1186/2930 2483/1183/2927 2471/1172/2915 2466/1167/2910 +f 2484/1184/2928 2454/1154/2898 2456/1156/2900 2487/1187/2931 +f 2488/1188/2932 2485/1185/2929 2459/1159/2903 2465/1165/2909 +f 2321/1021/2765 2474/1174/2918 2473/1173/2917 2317/1017/2761 +f 2489/1189/2933 2486/1186/2930 2466/1167/2910 2461/1162/2905 +f 2487/1187/2931 2456/1156/2900 2458/1158/2902 2490/1190/2934 +f 2491/1191/2935 2488/1188/2932 2465/1165/2909 2470/1170/2914 +f 2317/1017/2761 2473/1173/2917 2472/1171/2916 2313/1013/2757 +f 2492/1192/2936 2489/1189/2933 2461/1162/2905 2452/1152/2896 +f 2490/1190/2934 2458/1158/2902 2460/1160/2904 2481/1179/2925 +f 2482/1182/2926 2491/1191/2935 2470/1170/2914 2475/1175/2919 +f 2313/1013/2757 2472/1171/2916 2471/1172/2915 2303/1003/2747 +f 2477/1176/2921 2492/1192/2936 2452/1152/2896 2451/1153/2895 +f 2493/1195/2937 2494/1194/2938 2495/1193/2939 2496/1196/2940 +f 2496/1196/2940 2495/1193/2939 2497/1197/2941 2498/1198/2942 +f 2498/1198/2942 2497/1197/2941 2499/1199/2943 2500/1200/2944 +f 2500/1200/2944 2499/1199/2943 2501/1201/2945 2502/1202/2946 +f 2494/1194/2938 2503/1204/2947 2504/1203/2948 2495/1193/2939 +f 2495/1193/2939 2504/1203/2948 2505/1205/2949 2497/1197/2941 +f 2497/1197/2941 2505/1205/2949 2506/1206/2950 2499/1199/2943 +f 2499/1199/2943 2506/1206/2950 2507/1207/2951 2501/1201/2945 +f 2503/1204/2947 2508/1209/2952 2509/1208/2953 2504/1203/2948 +f 2504/1203/2948 2509/1208/2953 2510/1210/2954 2505/1205/2949 +f 2505/1205/2949 2510/1210/2954 2511/1211/2955 2506/1206/2950 +f 2506/1206/2950 2511/1211/2955 2512/1212/2956 2507/1207/2951 +f 2508/1209/2952 2513/1214/2957 2514/1213/2958 2509/1208/2953 +f 2509/1208/2953 2514/1213/2958 2515/1215/2959 2510/1210/2954 +f 2510/1210/2954 2515/1215/2959 2516/1216/2960 2511/1211/2955 +f 2511/1211/2955 2516/1216/2960 2517/1217/2961 2512/1212/2956 +f 2480/1180/2924 2479/1181/2923 2493/1195/2937 2518/1218/2962 +f 2519/1221/2963 2520/1220/2964 2521/1219/2965 2502/1202/2946 +f 2352/1052/2796 2522/1222/2966 2517/1217/2961 2353/1051/2797 +f 2482/1182/2926 2305/1005/2749 2350/1050/2794 2513/1214/2957 +f 2518/1218/2962 2493/1195/2937 2496/1196/2940 2523/1223/2967 +f 2524/1224/2968 2519/1221/2963 2502/1202/2946 2501/1201/2945 +f 2353/1051/2797 2517/1217/2961 2516/1216/2960 2364/1064/2808 +f 2491/1191/2935 2482/1182/2926 2513/1214/2957 2508/1209/2952 +f 2523/1223/2967 2496/1196/2940 2498/1198/2942 2525/1225/2969 +f 2526/1226/2970 2524/1224/2968 2501/1201/2945 2507/1207/2951 +f 2364/1064/2808 2516/1216/2960 2515/1215/2959 2361/1061/2805 +f 2488/1188/2932 2491/1191/2935 2508/1209/2952 2503/1204/2947 +f 2525/1225/2969 2498/1198/2942 2500/1200/2944 2527/1227/2971 +f 2528/1228/2972 2526/1226/2970 2507/1207/2951 2512/1212/2956 +f 2361/1061/2805 2515/1215/2959 2514/1213/2958 2358/1058/2802 +f 2485/1185/2929 2488/1188/2932 2503/1204/2947 2494/1194/2938 +f 2527/1227/2971 2500/1200/2944 2502/1202/2946 2521/1219/2965 +f 2522/1222/2966 2528/1228/2972 2512/1212/2956 2517/1217/2961 +f 2358/1058/2802 2514/1213/2958 2513/1214/2957 2350/1050/2794 +f 2479/1181/2923 2485/1185/2929 2494/1194/2938 2493/1195/2937 +f 2529/1231/2973 2530/1230/2974 2531/1229/2975 2532/1232/2976 +f 2532/1232/2976 2531/1229/2975 2533/1233/2977 2534/1234/2978 +f 2534/1234/2978 2533/1233/2977 2535/1235/2979 2536/1236/2980 +f 2536/1236/2980 2535/1235/2979 2537/1237/2981 2538/1238/2982 +f 2530/1230/2974 2539/1240/2983 2540/1239/2984 2531/1229/2975 +f 2531/1229/2975 2540/1239/2984 2541/1241/2985 2533/1233/2977 +f 2533/1233/2977 2541/1241/2985 2542/1242/2986 2535/1235/2979 +f 2535/1235/2979 2542/1242/2986 2543/1243/2987 2537/1237/2981 +f 2539/1240/2983 2544/1245/2988 2545/1244/2989 2540/1239/2984 +f 2540/1239/2984 2545/1244/2989 2546/1246/2990 2541/1241/2985 +f 2541/1241/2985 2546/1246/2990 2547/1247/2991 2542/1242/2986 +f 2542/1242/2986 2547/1247/2991 2548/1248/2992 2543/1243/2987 +f 2544/1245/2988 2549/1250/2993 2550/1249/2994 2545/1244/2989 +f 2545/1244/2989 2550/1249/2994 2551/1251/2995 2546/1246/2990 +f 2546/1246/2990 2551/1251/2995 2552/1252/2996 2547/1247/2991 +f 2547/1247/2991 2552/1252/2996 2553/1253/2997 2548/1248/2992 +f 2520/1220/2964 2519/1221/2963 2529/1231/2973 2554/1254/2998 +f 2555/1257/2999 2556/1256/3000 2557/1255/3001 2538/1238/2982 +f 2394/1094/2838 2558/1258/3002 2553/1253/2997 2395/1093/2839 +f 2522/1222/2966 2352/1052/2796 2392/1092/2836 2549/1250/2993 +f 2554/1254/2998 2529/1231/2973 2532/1232/2976 2559/1259/3003 +f 2560/1260/3004 2555/1257/2999 2538/1238/2982 2537/1237/2981 +f 2395/1093/2839 2553/1253/2997 2552/1252/2996 2406/1106/2850 +f 2528/1228/2972 2522/1222/2966 2549/1250/2993 2544/1245/2988 +f 2559/1259/3003 2532/1232/2976 2534/1234/2978 2561/1261/3005 +f 2562/1262/3006 2560/1260/3004 2537/1237/2981 2543/1243/2987 +f 2406/1106/2850 2552/1252/2996 2551/1251/2995 2403/1103/2847 +f 2526/1226/2970 2528/1228/2972 2544/1245/2988 2539/1240/2983 +f 2561/1261/3005 2534/1234/2978 2536/1236/2980 2563/1263/3007 +f 2564/1264/3008 2562/1262/3006 2543/1243/2987 2548/1248/2992 +f 2403/1103/2847 2551/1251/2995 2550/1249/2994 2400/1100/2844 +f 2524/1224/2968 2526/1226/2970 2539/1240/2983 2530/1230/2974 +f 2563/1263/3007 2536/1236/2980 2538/1238/2982 2557/1255/3001 +f 2558/1258/3002 2564/1264/3008 2548/1248/2992 2553/1253/2997 +f 2400/1100/2844 2550/1249/2994 2549/1250/2993 2392/1092/2836 +f 2519/1221/2963 2524/1224/2968 2530/1230/2974 2529/1231/2973 +f 2565/1267/3009 2566/1266/3010 2567/1265/3011 2568/1268/3012 +f 2568/1268/3012 2567/1265/3011 2569/1269/3013 2570/1270/3014 +f 2570/1270/3014 2569/1269/3013 2571/1271/3015 2572/1272/3016 +f 2572/1272/3016 2571/1271/3015 2573/1273/3017 2574/1274/3018 +f 2566/1266/3010 2575/1276/3019 2576/1275/3020 2567/1265/3011 +f 2567/1265/3011 2576/1275/3020 2577/1277/3021 2569/1269/3013 +f 2569/1269/3013 2577/1277/3021 2578/1278/3022 2571/1271/3015 +f 2571/1271/3015 2578/1278/3022 2579/1279/3023 2573/1273/3017 +f 2575/1276/3019 2580/1281/3024 2581/1280/3025 2576/1275/3020 +f 2576/1275/3020 2581/1280/3025 2582/1282/3026 2577/1277/3021 +f 2577/1277/3021 2582/1282/3026 2583/1283/3027 2578/1278/3022 +f 2578/1278/3022 2583/1283/3027 2584/1284/3028 2579/1279/3023 +f 2580/1281/3024 2585/1286/3029 2586/1285/3030 2581/1280/3025 +f 2581/1280/3025 2586/1285/3030 2587/1287/3031 2582/1282/3026 +f 2582/1282/3026 2587/1287/3031 2588/1288/3032 2583/1283/3027 +f 2583/1283/3027 2588/1288/3032 2589/1289/3033 2584/1284/3028 +f 2556/1256/3000 2555/1257/2999 2565/1267/3009 2590/1290/3034 +f 2591/1293/3035 2592/1292/3036 2593/1291/3037 2574/1274/3018 +f 2436/1136/2880 2594/1294/3038 2589/1289/3033 2437/1135/2881 +f 2558/1258/3002 2394/1094/2838 2434/1134/2878 2585/1286/3029 +f 2590/1290/3034 2565/1267/3009 2568/1268/3012 2595/1295/3039 +f 2596/1296/3040 2591/1293/3035 2574/1274/3018 2573/1273/3017 +f 2437/1135/2881 2589/1289/3033 2588/1288/3032 2448/1148/2892 +f 2564/1264/3008 2558/1258/3002 2585/1286/3029 2580/1281/3024 +f 2595/1295/3039 2568/1268/3012 2570/1270/3014 2597/1297/3041 +f 2598/1298/3042 2596/1296/3040 2573/1273/3017 2579/1279/3023 +f 2448/1148/2892 2588/1288/3032 2587/1287/3031 2445/1145/2889 +f 2562/1262/3006 2564/1264/3008 2580/1281/3024 2575/1276/3019 +f 2597/1297/3041 2570/1270/3014 2572/1272/3016 2599/1299/3043 +f 2600/1300/3044 2598/1298/3042 2579/1279/3023 2584/1284/3028 +f 2445/1145/2889 2587/1287/3031 2586/1285/3030 2442/1142/2886 +f 2560/1260/3004 2562/1262/3006 2575/1276/3019 2566/1266/3010 +f 2599/1299/3043 2572/1272/3016 2574/1274/3018 2593/1291/3037 +f 2594/1294/3038 2600/1300/3044 2584/1284/3028 2589/1289/3033 +f 2442/1142/2886 2586/1285/3030 2585/1286/3029 2434/1134/2878 +f 2555/1257/2999 2560/1260/3004 2566/1266/3010 2565/1267/3009 +s 2 +f 2302/1001/3045 2301/1002/3046 1977/1002/3047 1976/1001/3048 +s 4 +f 2307/1008/3049 2309/1009/3050 1984/1009/3051 1983/1008/3052 +f 2312/1010/3053 2311/1011/3054 1986/1011/3055 1985/1010/3056 +s 2 +f 2311/1011/3057 2310/1012/3058 1987/1012/3059 1986/1011/3060 +s 4 +f 2309/1009/3050 2315/1015/3061 1990/1015/3062 1984/1009/3051 +s 2 +f 2310/1012/3058 2316/1016/3063 1991/1016/3064 1987/1012/3059 +s 4 +f 2315/1015/3061 2319/1019/3065 1994/1019/3066 1990/1015/3062 +s 2 +f 2316/1016/3063 2320/1020/3067 1995/1020/3068 1991/1016/3064 +s 4 +f 2319/1019/3065 2323/1023/3069 1998/1023/3070 1994/1019/3066 +s 2 +f 2320/1020/3067 2324/1024/3071 1999/1024/3072 1995/1020/3068 +s 4 +f 2323/1023/3069 2312/1010/3053 1985/1010/3056 1998/1023/3070 +s 2 +f 2324/1024/3071 2302/1001/3045 1976/1001/3048 1999/1024/3072 +s 4 +f 2354/1055/3073 2356/1056/3074 2031/1056/3075 2030/1055/3076 +f 2357/1057/3077 2307/1008/3049 1983/1008/3052 2032/1057/3078 +f 2356/1056/3074 2360/1060/3079 2035/1060/3080 2031/1056/3075 +f 2360/1060/3079 2363/1063/3081 2038/1063/3082 2035/1060/3080 +f 2363/1063/3081 2366/1066/3083 2041/1066/3084 2038/1063/3082 +f 2366/1066/3083 2357/1057/3077 2032/1057/3078 2041/1066/3084 +f 2396/1097/3085 2398/1098/3086 2073/1098/3087 2072/1097/3088 +f 2399/1099/3089 2354/1055/3073 2030/1055/3076 2074/1099/3090 +f 2398/1098/3086 2402/1102/3091 2077/1102/3092 2073/1098/3087 +f 2402/1102/3091 2405/1105/3093 2080/1105/3094 2077/1102/3092 +f 2405/1105/3093 2408/1108/3095 2083/1108/3096 2080/1105/3094 +f 2408/1108/3095 2399/1099/3089 2074/1099/3090 2083/1108/3096 +f 2436/1136/3097 2435/1137/3098 2112/1137/3099 2111/1136/3100 +f 2438/1139/3101 2440/1140/3102 2115/1140/3103 2114/1139/3104 +f 2439/1138/3105 2438/1139/3101 2114/1139/3104 2113/1138/3106 +f 2441/1141/3107 2396/1097/3085 2072/1097/3088 2116/1141/3108 +f 2435/1137/3098 2443/1143/3109 2118/1143/3110 2112/1137/3099 +f 2440/1140/3102 2444/1144/3111 2119/1144/3112 2115/1140/3103 +f 2443/1143/3109 2446/1146/3113 2121/1146/3114 2118/1143/3110 +f 2444/1144/3111 2447/1147/3115 2122/1147/3116 2119/1144/3112 +f 2446/1146/3113 2449/1149/3117 2124/1149/3118 2121/1146/3114 +f 2447/1147/3115 2450/1150/3119 2125/1150/3120 2122/1147/3116 +f 2449/1149/3117 2439/1138/3105 2113/1138/3106 2124/1149/3118 +f 2450/1150/3119 2441/1141/3107 2116/1141/3108 2125/1150/3120 +f 2476/1177/3121 2478/1178/3122 2153/1178/3123 2152/1177/3124 +s 2 +f 2477/1176/3125 2476/1177/3126 2152/1177/3127 2151/1176/3128 +s 4 +f 2481/1179/3129 2480/1180/3130 2155/1180/3131 2154/1179/3132 +s 2 +f 2301/1002/3046 2483/1183/3133 2158/1183/3134 1977/1002/3047 +s 4 +f 2478/1178/3122 2484/1184/3135 2159/1184/3136 2153/1178/3123 +s 2 +f 2483/1183/3133 2486/1186/3137 2161/1186/3138 2158/1183/3134 +s 4 +f 2484/1184/3135 2487/1187/3139 2162/1187/3140 2159/1184/3136 +s 2 +f 2486/1186/3137 2489/1189/3141 2164/1189/3142 2161/1186/3138 +s 4 +f 2487/1187/3139 2490/1190/3143 2165/1190/3144 2162/1187/3140 +s 2 +f 2489/1189/3141 2492/1192/3145 2167/1192/3146 2164/1189/3142 +s 4 +f 2490/1190/3143 2481/1179/3129 2154/1179/3132 2165/1190/3144 +s 2 +f 2492/1192/3145 2477/1176/3125 2151/1176/3128 2167/1192/3146 +s 4 +f 2480/1180/3130 2518/1218/3147 2193/1218/3148 2155/1180/3131 +f 2521/1219/3149 2520/1220/3150 2195/1220/3151 2194/1219/3152 +f 2518/1218/3147 2523/1223/3153 2198/1223/3154 2193/1218/3148 +f 2523/1223/3153 2525/1225/3155 2200/1225/3156 2198/1223/3154 +f 2525/1225/3155 2527/1227/3157 2202/1227/3158 2200/1225/3156 +f 2527/1227/3157 2521/1219/3149 2194/1219/3152 2202/1227/3158 +f 2520/1220/3150 2554/1254/3159 2229/1254/3160 2195/1220/3151 +f 2557/1255/3161 2556/1256/3162 2231/1256/3163 2230/1255/3164 +f 2554/1254/3159 2559/1259/3165 2234/1259/3166 2229/1254/3160 +f 2559/1259/3165 2561/1261/3167 2236/1261/3168 2234/1259/3166 +f 2561/1261/3167 2563/1263/3169 2238/1263/3170 2236/1261/3168 +f 2563/1263/3169 2557/1255/3161 2230/1255/3164 2238/1263/3170 +f 2556/1256/3162 2590/1290/3171 2265/1290/3172 2231/1256/3163 +f 2593/1291/3173 2592/1292/3174 2267/1292/3175 2266/1291/3176 +f 2592/1292/3174 2591/1293/3177 2268/1293/3178 2267/1292/3175 +f 2594/1294/3179 2436/1136/3097 2111/1136/3100 2269/1294/3180 +f 2590/1290/3171 2595/1295/3181 2270/1295/3182 2265/1290/3172 +f 2591/1293/3177 2596/1296/3183 2271/1296/3184 2268/1293/3178 +f 2595/1295/3181 2597/1297/3185 2272/1297/3186 2270/1295/3182 +f 2596/1296/3183 2598/1298/3187 2273/1298/3188 2271/1296/3184 +f 2597/1297/3185 2599/1299/3189 2274/1299/3190 2272/1297/3186 +f 2598/1298/3187 2600/1300/3191 2275/1300/3192 2273/1298/3188 +f 2599/1299/3189 2593/1291/3173 2266/1291/3176 2274/1299/3190 +f 2600/1300/3191 2594/1294/3179 2269/1294/3180 2275/1300/3192 +# 648 polygons + +# +# object lotu_petal_04 +# + +v 0.0737 0.0561 0.2261 +v 0.0887 0.0598 0.1536 +v 0.0321 0.0475 0.1123 +v 0.0033 0.0427 0.1804 +v 0.0566 0.0608 0.3052 +v -0.0231 0.0460 0.2580 +v 0.0247 0.0658 0.3892 +v -0.0577 0.0521 0.3431 +v -0.0119 0.0698 0.4836 +v -0.1038 0.0644 0.4344 +v 0.1477 0.0744 0.2737 +v 0.1517 0.0780 0.1967 +v 0.1347 0.0814 0.3574 +v 0.1132 0.0946 0.4473 +v 0.0773 0.0973 0.5412 +v 0.2231 0.1065 0.3185 +v 0.2097 0.0994 0.2371 +v 0.2134 0.1078 0.4051 +v 0.1980 0.1201 0.4972 +v 0.1600 0.1290 0.5935 +v 0.2907 0.1424 0.3711 +v 0.2720 0.1407 0.2865 +v 0.2938 0.1445 0.4598 +v 0.2718 0.1582 0.5531 +v 0.2501 0.1741 0.6519 +v 0.0585 0.0486 0.0545 +v 0.0088 0.0387 0.0241 +v -0.0245 0.0413 0.0818 +v -0.2029 0.0479 0.3794 +v -0.2596 0.0572 0.4765 +v -0.1608 0.0800 0.5302 +v 0.2379 0.1928 0.7581 +v 0.3492 0.2337 0.8137 +v 0.3452 0.2143 0.7069 +v 0.3311 0.1852 0.3187 +v 0.2864 0.1813 0.2328 +v 0.2392 0.1394 0.1974 +v -0.0609 0.0402 0.1450 +v -0.0672 0.0906 0.5853 +v 0.3480 0.2032 0.6043 +v 0.1960 0.1058 0.1581 +v -0.1043 0.0425 0.2152 +v 0.0293 0.1133 0.6389 +v 0.3606 0.2016 0.5047 +v 0.1478 0.0788 0.1261 +v -0.1469 0.0428 0.2915 +v 0.1315 0.1472 0.6950 +v 0.3565 0.1853 0.4091 +v 0.1011 0.0577 0.0894 +v -0.1754 0.1233 0.8061 +v -0.1220 0.1039 0.6907 +v -0.2303 0.0943 0.6342 +v -0.2897 0.1120 0.7442 +v -0.2139 0.1579 0.9229 +v -0.3436 0.1381 0.8582 +v -0.2583 0.1928 1.0419 +v -0.3924 0.1753 0.9792 +v -0.3131 0.2326 1.1679 +v -0.4454 0.2214 1.1024 +v -0.0444 0.1649 0.8594 +v -0.0103 0.1387 0.7453 +v -0.0841 0.1832 0.9780 +v -0.1248 0.2122 1.1054 +v -0.1836 0.2687 1.2278 +v 0.0813 0.2048 0.9157 +v 0.1052 0.1727 0.8035 +v 0.0526 0.2306 1.0259 +v 0.0079 0.2600 1.1516 +v -0.0525 0.3095 1.2873 +v 0.2079 0.2373 0.9735 +v 0.2263 0.2168 0.8655 +v 0.1813 0.2691 1.0896 +v 0.1350 0.3047 1.2056 +v 0.0785 0.3505 1.3263 +v -0.3280 0.0842 0.5736 +v -0.5753 0.2080 1.0377 +v -0.6430 0.2555 1.1982 +v -0.5146 0.2768 1.2394 +v 0.0003 0.4008 1.4641 +v 0.1298 0.4402 1.5142 +v 0.2034 0.4012 1.3827 +v 0.3440 0.2513 0.9253 +v -0.4004 0.1058 0.6825 +v -0.3842 0.3005 1.3060 +v 0.2669 0.3539 1.2651 +v -0.4651 0.1305 0.7865 +v -0.2562 0.3290 1.3651 +v 0.3044 0.3072 1.1488 +v -0.5204 0.1670 0.9094 +v -0.1317 0.3681 1.4199 +v 0.3328 0.2826 1.0367 +v -0.5852 0.4762 1.6372 +v -0.4759 0.3665 1.4576 +v -0.5998 0.3387 1.4159 +v -0.7070 0.4637 1.5886 +v -0.7113 0.6196 1.8002 +v -0.8214 0.6099 1.7382 +v -0.8570 0.7336 1.9494 +v -0.9689 0.7304 1.8977 +v -0.9527 0.8627 2.1079 +v -1.0541 0.8439 2.0659 +v -0.4595 0.5187 1.6832 +v -0.3487 0.4110 1.5168 +v -0.6059 0.6445 1.8437 +v -0.7381 0.7527 1.9836 +v -0.8432 0.8856 2.1398 +v -0.3322 0.5553 1.7313 +v -0.2240 0.4458 1.5736 +v -0.4935 0.6737 1.8862 +v -0.6217 0.7893 2.0317 +v -0.7360 0.9151 2.1702 +v -0.2164 0.5984 1.7776 +v -0.0974 0.4901 1.6253 +v -0.3798 0.7213 1.9338 +v -0.5071 0.8382 2.0821 +v -0.6310 0.9447 2.2032 +v -0.7194 0.3304 1.3581 +v -1.1540 0.8393 2.0053 +v -1.2240 0.9682 2.1230 +v -1.1345 0.9827 2.1816 +v -0.7536 1.0585 2.3112 +v -0.6458 1.0911 2.3216 +v -0.5191 0.9976 2.2359 +v 0.0337 0.5260 1.6632 +v -0.8185 0.4526 1.5110 +v -1.0449 0.9981 2.2236 +v -0.3854 0.8927 2.1266 +v -0.9315 0.5884 1.6704 +v -0.9506 1.0232 2.2532 +v -0.2600 0.7616 1.9707 +v -1.0659 0.7262 1.8425 +v -0.8557 1.0423 2.2882 +v -0.1091 0.6359 1.8253 +v -1.1990 1.2473 2.3663 +v -1.1275 1.1265 2.3039 +v -1.2112 1.1086 2.2608 +v -1.2718 1.2423 2.3354 +v -1.2581 1.3758 2.4218 +v -1.3161 1.3705 2.3911 +v -1.3147 1.5008 2.4531 +v -1.3654 1.4864 2.4316 +v -1.3676 1.6066 2.4594 +v -1.4020 1.5995 2.4453 +v -1.1209 1.2680 2.3928 +v -1.0453 1.1454 2.3398 +v -1.1953 1.3828 2.4464 +v -1.2613 1.5003 2.4724 +v -1.3277 1.6105 2.4744 +v -1.0421 1.2885 2.4234 +v -0.9569 1.1670 2.3664 +v -1.1279 1.4093 2.4687 +v -1.2046 1.5093 2.4931 +v -1.2864 1.6066 2.4883 +v -0.9613 1.3051 2.4381 +v -0.8629 1.1774 2.3935 +v -1.0605 1.4202 2.4795 +v -1.1493 1.5183 2.5070 +v -1.2476 1.5969 2.5013 +v -1.3012 1.0957 2.2168 +v -1.4269 1.5959 2.4313 +v -1.4441 1.7044 2.4398 +v -1.4276 1.7041 2.4522 +v -1.3476 1.6837 2.4771 +v -1.3276 1.6660 2.4786 +v -1.2133 1.5933 2.5099 +v -0.7667 1.1985 2.4061 +v -1.3477 1.2309 2.2957 +v -1.4096 1.7034 2.4619 +v -1.0997 1.5266 2.5121 +v -1.3681 1.3599 2.3589 +v -1.3903 1.7009 2.4694 +v -0.9934 1.4244 2.4901 +v -1.4025 1.4818 2.4096 +v -1.3696 1.6942 2.4742 +v -0.8763 1.3152 2.4550 +v -0.3627 0.1097 -0.0113 +v -0.2893 0.1094 -0.0487 +v -0.3576 0.1456 -0.0789 +v -0.4418 0.1508 -0.0580 +v -0.4380 0.1118 0.0304 +v -0.5270 0.1497 -0.0136 +v -0.5158 0.1108 0.0940 +v -0.6138 0.1475 0.0444 +v -0.5968 0.1176 0.1614 +v -0.6996 0.1463 0.1221 +v -0.2816 0.0852 0.0272 +v -0.2171 0.0718 -0.0140 +v -0.3492 0.0906 0.0835 +v -0.4210 0.0884 0.1426 +v -0.4910 0.0855 0.2185 +v -0.1990 0.0592 0.0699 +v -0.1460 0.0515 0.0144 +v -0.2642 0.0693 0.1305 +v -0.3284 0.0612 0.1986 +v -0.3949 0.0558 0.2728 +v -0.1287 0.0513 0.1049 +v -0.0781 0.0429 0.0506 +v -0.1816 0.0533 0.1696 +v -0.2391 0.0480 0.2457 +v -0.2958 0.0449 0.3283 +v -0.2673 0.1454 -0.0955 +v -0.3194 0.1929 -0.1191 +v -0.4139 0.1978 -0.1174 +v -0.7995 0.1816 0.0608 +v -0.8899 0.1913 0.1102 +v -0.7853 0.1407 0.1938 +v -0.3625 0.0537 0.4206 +v -0.0447 0.0407 -0.0006 +v -0.5083 0.2016 -0.0971 +v -0.6769 0.1247 0.2490 +v -0.0988 0.0477 -0.0274 +v -0.6056 0.1933 -0.0522 +v -0.5673 0.0948 0.2972 +v -0.1544 0.0660 -0.0517 +v -0.7038 0.1824 0.0074 +v -0.4602 0.0665 0.3576 +v -0.2096 0.1026 -0.0710 +v -0.8350 0.1579 0.4279 +v -0.7551 0.1347 0.3410 +v -0.8702 0.1616 0.2610 +v -0.9510 0.1889 0.3336 +v -0.9194 0.1840 0.5137 +v -1.0299 0.2032 0.4146 +v -1.0220 0.2265 0.6123 +v -1.1251 0.2542 0.5044 +v -1.1036 0.2824 0.7147 +v -1.2251 0.3256 0.6107 +v -0.7207 0.1446 0.5022 +v -0.6405 0.1191 0.3933 +v -0.8160 0.1768 0.6066 +v -0.9090 0.2002 0.7093 +v -0.9747 0.2418 0.8250 +v -0.6126 0.1258 0.5525 +v -0.5342 0.0972 0.4539 +v -0.7060 0.1487 0.6719 +v -0.7795 0.1635 0.7980 +v -0.8417 0.2033 0.9186 +v -0.5097 0.1126 0.6168 +v -0.4255 0.0823 0.5151 +v -0.5845 0.1358 0.7253 +v -0.6501 0.1563 0.8516 +v -0.7058 0.1808 0.9922 +v -0.9750 0.2068 0.1724 +v -1.3284 0.3736 0.5081 +v -1.4116 0.4435 0.6356 +v -1.2870 0.3985 0.7402 +v -0.7662 0.2405 1.1332 +v -1.0615 0.2246 0.2344 +v -1.1637 0.3568 0.8344 +v -1.1482 0.2510 0.3096 +v -1.0253 0.3143 0.9375 +v -1.2304 0.2988 0.4042 +v -0.8969 0.2623 1.0472 +v -1.2903 0.5404 1.1622 +v -1.2142 0.4397 0.9802 +v -1.3397 0.4914 0.8898 +v -1.4060 0.5855 1.0660 +v -1.3760 0.6609 1.3479 +v -1.4836 0.7123 1.2604 +v -1.4610 0.7890 1.5362 +v -1.5588 0.8313 1.4573 +v -1.5386 0.9155 1.7151 +v -1.6245 0.9432 1.6491 +v -1.1717 0.4970 1.2454 +v -1.0853 0.3907 1.0792 +v -1.2650 0.6255 1.4360 +v -1.3577 0.7623 1.6155 +v -1.4413 0.8912 1.7871 +v -1.0496 0.4605 1.3400 +v -0.9679 0.3520 1.1805 +v -1.1554 0.6068 1.5182 +v -1.2548 0.7393 1.6936 +v -1.3440 0.8534 1.8625 +v -0.9352 0.4554 1.4317 +v -0.8399 0.3282 1.2758 +v -1.0412 0.5855 1.5994 +v -1.1547 0.7195 1.7695 +v -1.2466 0.8377 1.9374 +v -1.4633 0.5399 0.7916 +v -1.7122 0.9858 1.5657 +v -1.7314 1.0897 1.7189 +v -1.6577 1.0568 1.7976 +v -1.3145 0.9563 2.0597 +v -1.5258 0.6329 0.9806 +v -1.5783 1.0273 1.8701 +v -1.5818 0.7538 1.1811 +v -1.4965 0.9854 1.9382 +v -1.6444 0.8789 1.3827 +v -1.4074 0.9624 1.9988 +v -1.6104 1.2467 2.0855 +v -1.6005 1.1235 1.9931 +v -1.6697 1.1614 1.9221 +v -1.6679 1.2633 2.0269 +v -1.5921 1.3645 2.1736 +v -1.6448 1.3707 2.1241 +v -1.5671 1.4788 2.2544 +v -1.6098 1.4787 2.2121 +v -1.5361 1.5826 2.3206 +v -1.5649 1.5763 2.2925 +v -1.5467 1.2315 2.1390 +v -1.5304 1.1027 2.0615 +v -1.5392 1.3579 2.2190 +v -1.5214 1.4774 2.2962 +v -1.5074 1.5855 2.3563 +v -1.4810 1.2246 2.1980 +v -1.4614 1.0903 2.1147 +v -1.4806 1.3493 2.2700 +v -1.4772 1.4733 2.3389 +v -1.4792 1.5877 2.3881 +v -1.4170 1.2194 2.2471 +v -1.3872 1.0878 2.1661 +v -1.4233 1.3494 2.3181 +v -1.4368 1.4753 2.3804 +v -1.4506 1.5920 2.4131 +v -1.7330 1.1920 1.8479 +v -1.5874 1.5691 2.2656 +v -1.5384 1.6543 2.3518 +v -1.5172 1.6631 2.3694 +v -1.4598 1.7014 2.4274 +v -1.7305 1.2926 1.9687 +v -1.5039 1.6750 2.3851 +v -1.6961 1.3854 2.0759 +v -1.4909 1.6862 2.4009 +v -1.6414 1.4696 2.1699 +v -1.4756 1.6967 2.4148 +v 0.0373 0.0208 0.1117 +v 0.0994 0.0336 0.1511 +v 0.0810 0.0292 0.2248 +v 0.0071 0.0160 0.1781 +v 0.0622 0.0340 0.3048 +v -0.0198 0.0191 0.2565 +v 0.0271 0.0399 0.3914 +v -0.0588 0.0248 0.3436 +v -0.0090 0.0434 0.4864 +v -0.1076 0.0377 0.4357 +v 0.1599 0.0522 0.1923 +v 0.1579 0.0487 0.2705 +v 0.1405 0.0556 0.3550 +v 0.1181 0.0692 0.4468 +v 0.0822 0.0716 0.5448 +v 0.2251 0.0770 0.2348 +v 0.2344 0.0807 0.3194 +v 0.2227 0.0811 0.4064 +v 0.2060 0.0938 0.4977 +v 0.1684 0.1031 0.5961 +v 0.2911 0.1199 0.2834 +v 0.3043 0.1190 0.3728 +v 0.3070 0.1189 0.4640 +v 0.2853 0.1326 0.5594 +v 0.2617 0.1485 0.6591 +v 0.0075 0.0117 0.0210 +v 0.0621 0.0217 0.0541 +v -0.0202 0.0143 0.0792 +v -0.1581 0.0536 0.5308 +v -0.2636 0.0307 0.4774 +v -0.2047 0.0208 0.3806 +v 0.3565 0.2076 0.8184 +v 0.2468 0.1669 0.7643 +v 0.3581 0.1886 0.7111 +v 0.2611 0.1214 0.1937 +v 0.3069 0.1649 0.2255 +v 0.3501 0.1647 0.3150 +v -0.0573 0.0132 0.1434 +v -0.0622 0.0640 0.5883 +v 0.3622 0.1791 0.6061 +v 0.2111 0.0849 0.1548 +v -0.1028 0.0158 0.2147 +v 0.0372 0.0884 0.6445 +v 0.3763 0.1786 0.5057 +v 0.1617 0.0539 0.1201 +v -0.1469 0.0158 0.2913 +v 0.1379 0.1213 0.7002 +v 0.3713 0.1654 0.4080 +v 0.1114 0.0313 0.0865 +v -0.2256 0.0677 0.6348 +v -0.1178 0.0787 0.6942 +v -0.1751 0.0972 0.8057 +v -0.2906 0.0846 0.7469 +v -0.2138 0.1327 0.9270 +v -0.3441 0.1119 0.8618 +v -0.2596 0.1660 1.0513 +v -0.3982 0.1491 0.9828 +v -0.3117 0.2089 1.1797 +v -0.4477 0.1958 1.1099 +v -0.0093 0.1130 0.7492 +v -0.0417 0.1397 0.8644 +v -0.0844 0.1577 0.9856 +v -0.1223 0.1864 1.1146 +v -0.1809 0.2442 1.2387 +v 0.1077 0.1473 0.8123 +v 0.0842 0.1797 0.9239 +v 0.0544 0.2058 1.0372 +v 0.0128 0.2362 1.1603 +v -0.0494 0.2853 1.2991 +v 0.2332 0.1919 0.8721 +v 0.2119 0.2121 0.9809 +v 0.1852 0.2456 1.0977 +v 0.1407 0.2826 1.2181 +v 0.0811 0.3248 1.3385 +v -0.3288 0.0575 0.5792 +v -0.5170 0.2508 1.2468 +v -0.6472 0.2303 1.2057 +v -0.5810 0.1821 1.0468 +v 0.1360 0.4179 1.5258 +v 0.0028 0.3770 1.4768 +v 0.2071 0.3765 1.3973 +v 0.3529 0.2256 0.9290 +v -0.3998 0.0787 0.6853 +v -0.3848 0.2748 1.3170 +v 0.2698 0.3290 1.2748 +v -0.4716 0.1044 0.7922 +v -0.2578 0.3062 1.3757 +v 0.3090 0.2821 1.1576 +v -0.5246 0.1411 0.9173 +v -0.1312 0.3458 1.4312 +v 0.3394 0.2580 1.0420 +v -0.6063 0.3131 1.4286 +v -0.4768 0.3438 1.4696 +v -0.5860 0.4561 1.6523 +v -0.7096 0.4416 1.6038 +v -0.7119 0.5960 1.8193 +v -0.8205 0.5862 1.7528 +v -0.8631 0.7102 1.9665 +v -0.9737 0.7091 1.9113 +v -0.9592 0.8418 2.1274 +v -1.0652 0.8221 2.0807 +v -0.3497 0.3889 1.5294 +v -0.4593 0.4965 1.6965 +v -0.6050 0.6219 1.8618 +v -0.7438 0.7308 2.0016 +v -0.8506 0.8667 2.1580 +v -0.2207 0.4215 1.5858 +v -0.3335 0.5321 1.7478 +v -0.4911 0.6509 1.9058 +v -0.6266 0.7713 2.0500 +v -0.7417 0.8958 2.1873 +v -0.0931 0.4702 1.6369 +v -0.2144 0.5779 1.7966 +v -0.3756 0.7033 1.9520 +v -0.5082 0.8195 2.0985 +v -0.6330 0.9216 2.2218 +v -0.7259 0.3072 1.3690 +v -1.1440 0.9658 2.2009 +v -1.2303 0.9501 2.1387 +v -1.1608 0.8150 2.0150 +v -0.6427 1.0764 2.3446 +v -0.7530 1.0381 2.3329 +v -0.5197 0.9771 2.2558 +v 0.0373 0.5027 1.6779 +v -0.8258 0.4303 1.5221 +v -1.0519 0.9828 2.2443 +v -0.3895 0.8749 2.1424 +v -0.9333 0.5658 1.6825 +v -0.9554 1.0061 2.2747 +v -0.2616 0.7405 1.9880 +v -1.0747 0.7022 1.8546 +v -0.8571 1.0243 2.3065 +v -0.1037 0.6141 1.8401 +v -1.2170 1.0919 2.2789 +v -1.1342 1.1100 2.3270 +v -1.2076 1.2318 2.3868 +v -1.2818 1.2285 2.3557 +v -1.2702 1.3647 2.4438 +v -1.3297 1.3582 2.4118 +v -1.3248 1.4897 2.4773 +v -1.3753 1.4781 2.4528 +v -1.3770 1.5997 2.4861 +v -1.4136 1.5911 2.4701 +v -1.0465 1.1305 2.3612 +v -1.1288 1.2566 2.4156 +v -1.2027 1.3755 2.4716 +v -1.2679 1.4913 2.4953 +v -1.3351 1.6042 2.5000 +v -0.9565 1.1508 2.3897 +v -1.0502 1.2778 2.4459 +v -1.1339 1.3980 2.4921 +v -1.2101 1.4995 2.5187 +v -1.2915 1.6019 2.5156 +v -0.8641 1.1632 2.4176 +v -0.9691 1.2919 2.4630 +v -1.0642 1.4107 2.5050 +v -1.1541 1.5101 2.5330 +v -1.2509 1.5926 2.5283 +v -1.3045 1.0812 2.2359 +v -1.4372 1.7012 2.4730 +v -1.4572 1.6998 2.4610 +v -1.4419 1.5879 2.4538 +v -1.3293 1.6644 2.5051 +v -1.3515 1.6785 2.5015 +v -1.2169 1.5836 2.5369 +v -0.7672 1.1856 2.4304 +v -1.3588 1.2195 2.3170 +v -1.4169 1.6996 2.4846 +v -1.1035 1.5176 2.5376 +v -1.3822 1.3476 2.3773 +v -1.3963 1.6964 2.4922 +v -0.9965 1.4141 2.5157 +v -1.4186 1.4705 2.4298 +v -1.3744 1.6891 2.4979 +v -0.8819 1.3030 2.4793 +v -0.3575 0.1249 -0.0968 +v -0.2888 0.0865 -0.0621 +v -0.3665 0.0854 -0.0222 +v -0.4442 0.1285 -0.0700 +v -0.4396 0.0875 0.0252 +v -0.5294 0.1248 -0.0223 +v -0.5189 0.0842 0.0889 +v -0.6173 0.1225 0.0354 +v -0.5993 0.0911 0.1569 +v -0.7037 0.1198 0.1138 +v -0.2200 0.0476 -0.0245 +v -0.2835 0.0590 0.0237 +v -0.3489 0.0639 0.0771 +v -0.4242 0.0613 0.1393 +v -0.4962 0.0593 0.2186 +v -0.1482 0.0240 0.0075 +v -0.2007 0.0324 0.0640 +v -0.2654 0.0427 0.1246 +v -0.3319 0.0338 0.1961 +v -0.3983 0.0288 0.2710 +v -0.0807 0.0163 0.0473 +v -0.1271 0.0246 0.1037 +v -0.1806 0.0266 0.1682 +v -0.2397 0.0208 0.2431 +v -0.2976 0.0176 0.3290 +v -0.3237 0.1748 -0.1386 +v -0.2670 0.1225 -0.1149 +v -0.4194 0.1796 -0.1357 +v -0.7928 0.1150 0.1862 +v -0.8996 0.1659 0.1059 +v -0.8051 0.1567 0.0520 +v -0.3652 0.0267 0.4210 +v -0.0463 0.0137 -0.0045 +v -0.5150 0.1808 -0.1096 +v -0.6803 0.0982 0.2466 +v -0.1013 0.0206 -0.0340 +v -0.6117 0.1706 -0.0633 +v -0.5728 0.0685 0.2989 +v -0.1559 0.0416 -0.0648 +v -0.7085 0.1554 -0.0021 +v -0.4645 0.0410 0.3589 +v -0.2107 0.0794 -0.0872 +v -0.8794 0.1367 0.2574 +v -0.7613 0.1082 0.3379 +v -0.8429 0.1320 0.4262 +v -0.9603 0.1620 0.3333 +v -0.9284 0.1566 0.5160 +v -1.0410 0.1778 0.4139 +v -1.0303 0.2013 0.6130 +v -1.1345 0.2311 0.5067 +v -1.1138 0.2589 0.7199 +v -1.2355 0.3037 0.6124 +v -0.6492 0.0932 0.3940 +v -0.7268 0.1179 0.5012 +v -0.8225 0.1494 0.6061 +v -0.9149 0.1749 0.7123 +v -0.9804 0.2167 0.8263 +v -0.5389 0.0713 0.4558 +v -0.6180 0.1007 0.5544 +v -0.7094 0.1211 0.6733 +v -0.7855 0.1384 0.8013 +v -0.8472 0.1790 0.9243 +v -0.4317 0.0562 0.5174 +v -0.5116 0.0860 0.6216 +v -0.5887 0.1100 0.7309 +v -0.6567 0.1288 0.8558 +v -0.7124 0.1547 1.0007 +v -0.9879 0.1815 0.1669 +v -1.3002 0.3752 0.7408 +v -1.4262 0.4210 0.6411 +v -1.3425 0.3504 0.5111 +v -0.7731 0.2162 1.1412 +v -1.0721 0.1998 0.2331 +v -1.1725 0.3361 0.8396 +v -1.1587 0.2260 0.3114 +v -1.0374 0.2917 0.9456 +v -1.2385 0.2761 0.4060 +v -0.9057 0.2393 1.0515 +v -1.3511 0.4691 0.8909 +v -1.2235 0.4167 0.9880 +v -1.2985 0.5196 1.1646 +v -1.4160 0.5641 1.0680 +v -1.3860 0.6391 1.3535 +v -1.4949 0.6928 1.2669 +v -1.4747 0.7659 1.5424 +v -1.5728 0.8134 1.4640 +v -1.5509 0.8944 1.7259 +v -1.6414 0.9225 1.6596 +v -1.0965 0.3682 1.0857 +v -1.1790 0.4735 1.2515 +v -1.2752 0.6021 1.4447 +v -1.3685 0.7415 1.6249 +v -1.4525 0.8703 1.7964 +v -0.9735 0.3284 1.1860 +v -1.0579 0.4377 1.3473 +v -1.1616 0.5849 1.5250 +v -1.2627 0.7181 1.7026 +v -1.3535 0.8325 1.8725 +v -0.8477 0.3029 1.2894 +v -0.9434 0.4332 1.4402 +v -1.0446 0.5640 1.6083 +v -1.1647 0.6952 1.7786 +v -1.2546 0.8142 1.9486 +v -1.4771 0.5188 0.7951 +v -1.6761 1.0373 1.8085 +v -1.7493 1.0748 1.7334 +v -1.7306 0.9652 1.5711 +v -1.3218 0.9371 2.0764 +v -1.5360 0.6109 0.9839 +v -1.5932 1.0060 1.8802 +v -1.5972 0.7325 1.1847 +v -1.5075 0.9628 1.9490 +v -1.6611 0.8578 1.3877 +v -1.4165 0.9418 2.0155 +v -1.6881 1.1462 1.9357 +v -1.6184 1.1100 2.0090 +v -1.6259 1.2336 2.1037 +v -1.6874 1.2503 2.0457 +v -1.6104 1.3511 2.1895 +v -1.6618 1.3588 2.1416 +v -1.5849 1.4733 2.2722 +v -1.6285 1.4719 2.2273 +v -1.5545 1.5761 2.3404 +v -1.5832 1.5713 2.3114 +v -1.5452 1.0895 2.0764 +v -1.5612 1.2187 2.1572 +v -1.5536 1.3471 2.2364 +v -1.5385 1.4691 2.3146 +v -1.5276 1.5776 2.3723 +v -1.4753 1.0757 2.1328 +v -1.4970 1.2109 2.2145 +v -1.4957 1.3391 2.2848 +v -1.4942 1.4655 2.3545 +v -1.4973 1.5800 2.4067 +v -1.3952 1.0722 2.1828 +v -1.4307 1.2084 2.2672 +v -1.4359 1.3371 2.3362 +v -1.4539 1.4652 2.3974 +v -1.4668 1.5861 2.4351 +v -1.7521 1.1790 1.8592 +v -1.5333 1.6541 2.3902 +v -1.5440 1.6376 2.3721 +v -1.6068 1.5612 2.2817 +v -1.4758 1.6971 2.4492 +v -1.7498 1.2814 1.9855 +v -1.5216 1.6682 2.4070 +v -1.7154 1.3756 2.0937 +v -1.5069 1.6809 2.4215 +v -1.6613 1.4621 2.1850 +v -1.4917 1.6905 2.4362 +# 650 vertices + +vn 0.1855 0.9811 -0.0553 +vn 0.2056 0.9749 -0.0858 +vn 0.1426 0.9885 -0.0510 +vn 0.1022 0.9945 -0.0230 +vn 0.1931 0.9811 0.0140 +vn 0.0984 0.9946 0.0337 +vn 0.2041 0.9789 0.0128 +vn 0.1016 0.9927 0.0651 +vn 0.1614 0.9825 0.0933 +vn 0.0991 0.9873 0.1238 +vn 0.2700 0.9564 -0.1114 +vn 0.2813 0.9413 -0.1865 +vn 0.2411 0.9701 0.0266 +vn 0.2583 0.9657 0.0250 +vn 0.2768 0.9598 0.0473 +vn 0.3684 0.9095 -0.1924 +vn 0.3863 0.8674 -0.3137 +vn 0.3264 0.9437 -0.0528 +vn 0.3251 0.9455 0.0195 +vn 0.3347 0.9414 0.0423 +vn 0.4463 0.8407 -0.3065 +vn 0.4614 0.7479 -0.4773 +vn 0.4645 0.8711 -0.1592 +vn 0.3985 0.9172 0.0020 +vn 0.3629 0.9316 0.0207 +vn 0.1702 0.9848 -0.0338 +vn 0.0526 0.9984 0.0197 +vn 0.0267 0.9996 0.0026 +vn 0.0843 0.9944 0.0630 +vn 0.1054 0.9847 0.1389 +vn 0.1398 0.9829 0.1200 +vn 0.3284 0.9429 0.0550 +vn 0.3189 0.9478 0.0056 +vn 0.3600 0.9326 -0.0266 +vn 0.4665 0.7141 -0.5220 +vn 0.4622 0.5395 -0.7038 +vn 0.4861 0.6333 -0.6023 +vn -0.0382 0.9991 0.0204 +vn 0.1556 0.9778 0.1400 +vn 0.4673 0.8743 -0.1314 +vn 0.4233 0.7821 -0.4573 +vn -0.0366 0.9991 0.0200 +vn 0.2432 0.9581 0.1511 +vn 0.5566 0.7961 -0.2378 +vn 0.3556 0.8936 -0.2740 +vn 0.0203 0.9995 0.0250 +vn 0.3115 0.9443 0.1065 +vn 0.4818 0.8450 -0.2321 +vn 0.2114 0.9752 -0.0650 +vn 0.1801 0.9685 0.1720 +vn 0.1847 0.9755 0.1194 +vn 0.0991 0.9847 0.1433 +vn 0.0831 0.9808 0.1763 +vn 0.1630 0.9605 0.2255 +vn 0.0981 0.9688 0.2274 +vn 0.1596 0.9513 0.2635 +vn 0.0956 0.9546 0.2822 +vn 0.1831 0.9294 0.3203 +vn 0.1069 0.9392 0.3264 +vn 0.2971 0.9482 0.1125 +vn 0.2658 0.9518 0.1532 +vn 0.2800 0.9511 0.1305 +vn 0.2564 0.9331 0.2521 +vn 0.2661 0.9046 0.3331 +vn 0.2675 0.9488 0.1679 +vn 0.2818 0.9468 0.1556 +vn 0.3029 0.9419 0.1452 +vn 0.3430 0.9174 0.2016 +vn 0.3217 0.8970 0.3030 +vn 0.2831 0.9499 0.1327 +vn 0.2947 0.9505 0.0983 +vn 0.2795 0.9379 0.2053 +vn 0.3300 0.9125 0.2418 +vn 0.3465 0.8989 0.2681 +vn 0.0477 0.9797 0.1948 +vn 0.1655 0.9553 0.2451 +vn 0.1664 0.9366 0.3083 +vn 0.1890 0.9353 0.2992 +vn 0.3119 0.8811 0.3556 +vn 0.3261 0.8829 0.3377 +vn 0.3564 0.8986 0.2558 +vn 0.2711 0.9538 0.1296 +vn 0.0073 0.9819 0.1892 +vn 0.1995 0.9088 0.3664 +vn 0.3254 0.9030 0.2804 +vn 0.0105 0.9739 0.2268 +vn 0.2631 0.8893 0.3740 +vn 0.2897 0.9290 0.2302 +vn 0.0732 0.9644 0.2543 +vn 0.2997 0.8815 0.3648 +vn 0.3022 0.9456 0.1204 +vn 0.2632 0.8158 0.5150 +vn 0.2863 0.8787 0.3821 +vn 0.1880 0.8943 0.4062 +vn 0.0947 0.8148 0.5719 +vn 0.1784 0.8118 0.5561 +vn 0.0929 0.8264 0.5553 +vn 0.1701 0.8234 0.5414 +vn 0.0757 0.8470 0.5262 +vn 0.2559 0.7506 0.6092 +vn 0.1228 0.7846 0.6077 +vn 0.3236 0.8085 0.4915 +vn 0.2848 0.8562 0.4310 +vn 0.2826 0.7934 0.5390 +vn 0.2897 0.7861 0.5460 +vn 0.3223 0.7265 0.6069 +vn 0.3304 0.7988 0.5028 +vn 0.3077 0.8436 0.4401 +vn 0.3314 0.7807 0.5298 +vn 0.3317 0.7640 0.5535 +vn 0.3421 0.7232 0.5999 +vn 0.3379 0.7855 0.5186 +vn 0.3333 0.8304 0.4464 +vn 0.3773 0.7580 0.5321 +vn 0.3942 0.7341 0.5529 +vn 0.4072 0.6898 0.5987 +vn 0.0463 0.8751 0.4816 +vn -0.0071 0.7908 0.6120 +vn 0.0446 0.7040 0.7088 +vn 0.1148 0.6702 0.7332 +vn 0.4085 0.6286 0.6618 +vn 0.4868 0.5969 0.6377 +vn 0.4491 0.6617 0.6004 +vn 0.3357 0.8313 0.4430 +vn -0.0023 0.8186 0.5743 +vn 0.2495 0.6532 0.7149 +vn 0.4058 0.7207 0.5620 +vn 0.0540 0.8348 0.5479 +vn 0.2979 0.6479 0.7011 +vn 0.3691 0.7535 0.5441 +vn 0.0045 0.8477 0.5305 +vn 0.2955 0.6545 0.6959 +vn 0.3211 0.7886 0.5245 +vn 0.2162 0.5224 0.8248 +vn 0.1978 0.5769 0.7925 +vn 0.1418 0.6040 0.7843 +vn 0.1281 0.5207 0.8441 +vn 0.1401 0.4302 0.8918 +vn 0.0843 0.4447 0.8917 +vn 0.1834 0.2971 0.9371 +vn 0.1250 0.3393 0.9323 +vn 0.1831 0.1965 0.9633 +vn 0.1087 0.2062 0.9725 +vn 0.2794 0.4951 0.8226 +vn 0.2760 0.5589 0.7819 +vn 0.2697 0.4267 0.8632 +vn 0.1968 0.2909 0.9363 +vn 0.1904 0.1899 0.9632 +vn 0.3338 0.4551 0.8255 +vn 0.3013 0.5447 0.7826 +vn 0.3570 0.3943 0.8468 +vn 0.2716 0.2798 0.9208 +vn 0.1837 0.1804 0.9663 +vn 0.3598 0.4300 0.8281 +vn 0.3536 0.5153 0.7807 +vn 0.3852 0.3706 0.8452 +vn 0.3850 0.2409 0.8909 +vn 0.2334 0.1213 0.9648 +vn 0.0909 0.6230 0.7770 +vn -0.0253 0.2162 0.9760 +vn -0.1083 0.1548 0.9820 +vn -0.0320 0.1653 0.9857 +vn 0.4293 -0.0834 0.8993 +vn 0.5479 -0.7509 -0.3688 +vn 0.2783 0.2009 0.9393 +vn 0.4515 0.5083 0.7334 +vn 0.0560 0.5055 0.8610 +vn 0.0891 0.1782 0.9799 +vn 0.4318 0.2653 0.8621 +vn 0.0214 0.4491 0.8932 +vn 0.1734 0.1731 0.9695 +vn 0.3598 0.3989 0.8435 +vn -0.0290 0.3507 0.9360 +vn 0.2753 0.1089 0.9552 +vn 0.3669 0.4173 0.8314 +vn -0.3321 0.9250 -0.1845 +vn -0.4309 0.8496 -0.3041 +vn -0.4643 0.7490 -0.4727 +vn -0.4537 0.8199 -0.3493 +vn -0.2966 0.9438 -0.1460 +vn -0.4122 0.8750 -0.2541 +vn -0.2820 0.9552 -0.0900 +vn -0.3484 0.9228 -0.1647 +vn -0.2680 0.9632 -0.0226 +vn -0.2624 0.9591 -0.1059 +vn -0.2917 0.9561 -0.0281 +vn -0.3733 0.9232 -0.0916 +vn -0.2236 0.9717 -0.0763 +vn -0.2264 0.9697 -0.0918 +vn -0.2462 0.9691 -0.0140 +vn -0.1895 0.9806 0.0494 +vn -0.1902 0.9815 0.0237 +vn -0.1980 0.9793 -0.0411 +vn -0.1790 0.9789 -0.0986 +vn -0.1795 0.9837 -0.0060 +vn -0.1166 0.9919 0.0500 +vn -0.0822 0.9956 0.0454 +vn -0.1278 0.9917 -0.0118 +vn -0.0884 0.9950 -0.0470 +vn -0.0370 0.9992 0.0161 +vn -0.5110 0.6921 -0.5099 +vn -0.4976 0.5945 -0.6316 +vn -0.4862 0.7004 -0.5225 +vn -0.3052 0.9422 -0.1384 +vn -0.3395 0.9404 -0.0194 +vn -0.2429 0.9700 -0.0126 +vn -0.0402 0.9864 0.1594 +vn -0.0669 0.9972 0.0334 +vn -0.4819 0.7829 -0.3935 +vn -0.1831 0.9825 0.0354 +vn -0.1792 0.9838 0.0054 +vn -0.4189 0.8569 -0.3003 +vn -0.2237 0.9693 0.1016 +vn -0.3686 0.9239 -0.1031 +vn -0.3324 0.9235 -0.1917 +vn -0.1715 0.9744 0.1453 +vn -0.5076 0.8014 -0.3164 +vn -0.1579 0.9716 0.1762 +vn -0.1418 0.9820 0.1247 +vn -0.2762 0.9540 0.1168 +vn -0.2415 0.9631 0.1184 +vn -0.1533 0.9694 0.1917 +vn -0.2434 0.9527 0.1820 +vn -0.2390 0.9242 0.2978 +vn -0.3109 0.8942 0.3220 +vn -0.2877 0.8599 0.4217 +vn -0.3426 0.8440 0.4125 +vn -0.1314 0.9759 0.1742 +vn -0.1515 0.9752 0.1615 +vn -0.1543 0.9752 0.1587 +vn -0.2103 0.9502 0.2301 +vn -0.2694 0.8749 0.4025 +vn -0.1255 0.9774 0.1701 +vn -0.1468 0.9669 0.2085 +vn -0.1350 0.9821 0.1312 +vn -0.1463 0.9715 0.1867 +vn -0.1859 0.9197 0.3459 +vn -0.0795 0.9778 0.1939 +vn -0.0553 0.9740 0.2197 +vn -0.0426 0.9849 0.1677 +vn 0.0393 0.9869 0.1562 +vn 0.0539 0.9648 0.2573 +vn -0.2990 0.9522 0.0628 +vn -0.3636 0.8444 0.3934 +vn -0.3110 0.8327 0.4582 +vn -0.3077 0.8201 0.4824 +vn -0.0205 0.9103 0.4135 +vn -0.2727 0.9582 0.0866 +vn -0.2786 0.8286 0.4856 +vn -0.3283 0.9212 0.2089 +vn -0.2960 0.8221 0.4864 +vn -0.3577 0.8752 0.3257 +vn -0.2302 0.8563 0.4624 +vn -0.3026 0.8168 0.4912 +vn -0.3053 0.8145 0.4933 +vn -0.3161 0.8045 0.5029 +vn -0.3187 0.8070 0.4972 +vn -0.3133 0.7914 0.5249 +vn -0.3459 0.7776 0.5251 +vn -0.2879 0.7920 0.5383 +vn -0.3677 0.7692 0.5227 +vn -0.2627 0.7806 0.5672 +vn -0.3374 0.7435 0.5774 +vn -0.2673 0.8200 0.5061 +vn -0.2913 0.8270 0.4809 +vn -0.2262 0.8147 0.5339 +vn -0.2317 0.8054 0.5457 +vn -0.2550 0.7955 0.5496 +vn -0.1893 0.8246 0.5330 +vn -0.2366 0.8260 0.5116 +vn -0.1804 0.8181 0.5460 +vn -0.1950 0.8248 0.5307 +vn -0.2241 0.7945 0.5644 +vn -0.0817 0.8284 0.5541 +vn -0.0969 0.8450 0.5259 +vn -0.0827 0.8327 0.5476 +vn -0.1130 0.8374 0.5348 +vn -0.1042 0.8005 0.5903 +vn -0.3156 0.8015 0.5079 +vn -0.3931 0.7253 0.5652 +vn -0.3989 0.6169 0.6785 +vn -0.3675 0.6367 0.6779 +vn -0.0275 0.7378 0.6745 +vn -0.3096 0.8093 0.4991 +vn -0.3392 0.6778 0.6524 +vn -0.3458 0.7690 0.5376 +vn -0.2713 0.7261 0.6318 +vn -0.4099 0.7443 0.5273 +vn -0.1446 0.7527 0.6423 +vn -0.2769 0.4281 0.8603 +vn -0.3424 0.5537 0.7591 +vn -0.4067 0.5088 0.7587 +vn -0.3274 0.4505 0.8306 +vn -0.2189 0.3691 0.9032 +vn -0.2555 0.3712 0.8927 +vn -0.2222 0.2948 0.9294 +vn -0.2889 0.2383 0.9272 +vn -0.2607 0.2244 0.9390 +vn -0.2368 0.2429 0.9407 +vn -0.2233 0.4265 0.8765 +vn -0.2504 0.5701 0.7825 +vn -0.2044 0.3697 0.9064 +vn -0.2211 0.3183 0.9218 +vn -0.2987 0.2023 0.9327 +vn -0.1710 0.4399 0.8816 +vn -0.1321 0.6052 0.7851 +vn -0.1820 0.3845 0.9050 +vn -0.2311 0.3204 0.9187 +vn -0.2130 0.2288 0.9499 +vn -0.0642 0.4813 0.8742 +vn -0.0153 0.6260 0.7797 +vn -0.0861 0.4252 0.9010 +vn -0.1619 0.3387 0.9269 +vn -0.1258 0.2255 0.9661 +vn -0.4151 0.5171 0.7485 +vn -0.2661 0.2502 0.9309 +vn 0.0390 0.5290 0.8477 +vn -0.0969 0.3665 0.9254 +vn -0.1114 0.1603 0.9808 +vn -0.3406 0.4900 0.8024 +vn -0.1706 0.2881 0.9423 +vn -0.2821 0.3903 0.8764 +vn -0.1021 0.2556 0.9614 +vn -0.3447 0.1836 0.9206 +vn -0.1098 0.1905 0.9755 +vn -0.1392 -0.9889 0.0519 +vn -0.2075 -0.9744 0.0861 +vn -0.1847 -0.9814 0.0516 +vn -0.1000 -0.9947 0.0225 +vn -0.1966 -0.9803 -0.0191 +vn -0.0983 -0.9946 -0.0323 +vn -0.2076 -0.9781 -0.0136 +vn -0.1029 -0.9926 -0.0647 +vn -0.1650 -0.9822 -0.0893 +vn -0.1013 -0.9869 -0.1257 +vn -0.2899 -0.9387 0.1863 +vn -0.2715 -0.9558 0.1129 +vn -0.2363 -0.9711 -0.0340 +vn -0.2532 -0.9671 -0.0258 +vn -0.2740 -0.9607 -0.0435 +vn -0.3885 -0.8598 0.3315 +vn -0.3690 -0.9067 0.2041 +vn -0.3124 -0.9490 0.0431 +vn -0.3062 -0.9515 -0.0309 +vn -0.3245 -0.9449 -0.0432 +vn -0.4605 -0.7576 0.4627 +vn -0.4580 -0.8300 0.3184 +vn -0.4651 -0.8691 0.1683 +vn -0.3964 -0.9181 -0.0017 +vn -0.3557 -0.9341 -0.0287 +vn -0.0457 -0.9987 -0.0217 +vn -0.1603 -0.9865 0.0323 +vn -0.0284 -0.9996 -0.0034 +vn -0.1367 -0.9830 -0.1228 +vn -0.1046 -0.9847 -0.1396 +vn -0.0867 -0.9941 -0.0648 +vn -0.3219 -0.9468 -0.0077 +vn -0.3255 -0.9434 -0.0645 +vn -0.3634 -0.9314 0.0215 +vn -0.4672 -0.6667 0.5808 +vn -0.4667 -0.5324 0.7062 +vn -0.4790 -0.7229 0.4980 +vn 0.0363 -0.9991 -0.0209 +vn -0.1559 -0.9771 -0.1447 +vn -0.4808 -0.8645 0.1464 +vn -0.4403 -0.7562 0.4840 +vn 0.0373 -0.9991 -0.0183 +vn -0.2442 -0.9580 -0.1505 +vn -0.5632 -0.7866 0.2531 +vn -0.3591 -0.8965 0.2596 +vn -0.0207 -0.9995 -0.0233 +vn -0.3067 -0.9455 -0.1090 +vn -0.4984 -0.8236 0.2708 +vn -0.2143 -0.9746 0.0654 +vn -0.1073 -0.9847 -0.1376 +vn -0.1874 -0.9745 -0.1235 +vn -0.1824 -0.9684 -0.1698 +vn -0.0883 -0.9804 -0.1763 +vn -0.1637 -0.9625 -0.2162 +vn -0.1013 -0.9689 -0.2258 +vn -0.1567 -0.9524 -0.2615 +vn -0.0933 -0.9547 -0.2827 +vn -0.1844 -0.9282 -0.3232 +vn -0.1110 -0.9402 -0.3220 +vn -0.2621 -0.9522 -0.1571 +vn -0.2926 -0.9495 -0.1130 +vn -0.2745 -0.9529 -0.1289 +vn -0.2616 -0.9335 -0.2454 +vn -0.2657 -0.9017 -0.3410 +vn -0.2776 -0.9472 -0.1605 +vn -0.2659 -0.9489 -0.1697 +vn -0.3056 -0.9409 -0.1457 +vn -0.3443 -0.9178 -0.1977 +vn -0.3169 -0.8974 -0.3069 +vn -0.2936 -0.9500 -0.1061 +vn -0.2832 -0.9492 -0.1374 +vn -0.2779 -0.9376 -0.2092 +vn -0.3286 -0.9151 -0.2336 +vn -0.3429 -0.9008 -0.2664 +vn -0.0498 -0.9805 -0.1902 +vn -0.1864 -0.9358 -0.2993 +vn -0.1614 -0.9364 -0.3115 +vn -0.1683 -0.9546 -0.2457 +vn -0.3329 -0.8803 -0.3379 +vn -0.3069 -0.8788 -0.3654 +vn -0.3537 -0.8992 -0.2576 +vn -0.2701 -0.9529 -0.1376 +vn -0.0079 -0.9819 -0.1891 +vn -0.2044 -0.9077 -0.3664 +vn -0.3177 -0.9078 -0.2737 +vn -0.0104 -0.9739 -0.2267 +vn -0.2681 -0.8877 -0.3743 +vn -0.2812 -0.9310 -0.2326 +vn -0.0775 -0.9647 -0.2516 +vn -0.2974 -0.8805 -0.3693 +vn -0.3041 -0.9455 -0.1166 +vn -0.1869 -0.8933 -0.4088 +vn -0.2931 -0.8756 -0.3839 +vn -0.2696 -0.8175 -0.5089 +vn -0.0954 -0.8152 -0.5713 +vn -0.1787 -0.8153 -0.5507 +vn -0.0751 -0.8274 -0.5566 +vn -0.1582 -0.8231 -0.5453 +vn -0.0724 -0.8494 -0.5227 +vn -0.2548 -0.7485 -0.6122 +vn -0.1094 -0.7832 -0.6121 +vn -0.2809 -0.8575 -0.4310 +vn -0.3136 -0.8153 -0.4867 +vn -0.2859 -0.7942 -0.5361 +vn -0.3015 -0.7794 -0.5493 +vn -0.3334 -0.7212 -0.6072 +vn -0.3150 -0.8464 -0.4295 +vn -0.3265 -0.8017 -0.5006 +vn -0.3393 -0.7761 -0.5316 +vn -0.3382 -0.7595 -0.5558 +vn -0.3296 -0.7274 -0.6019 +vn -0.3299 -0.8324 -0.4453 +vn -0.3456 -0.7855 -0.5133 +vn -0.3868 -0.7500 -0.5365 +vn -0.4031 -0.7340 -0.5466 +vn -0.3992 -0.6987 -0.5937 +vn -0.0451 -0.8748 -0.4825 +vn -0.1017 -0.6689 -0.7364 +vn -0.0397 -0.7005 -0.7125 +vn 0.0146 -0.7889 -0.6144 +vn -0.4995 -0.5877 -0.6364 +vn -0.3995 -0.6318 -0.6642 +vn -0.4552 -0.6648 -0.5922 +vn -0.3144 -0.8360 -0.4498 +vn 0.0063 -0.8158 -0.5783 +vn -0.2467 -0.6519 -0.7171 +vn -0.4124 -0.7217 -0.5560 +vn -0.0437 -0.8360 -0.5470 +vn -0.3002 -0.6455 -0.7022 +vn -0.3621 -0.7508 -0.5525 +vn -0.0083 -0.8506 -0.5258 +vn -0.2899 -0.6596 -0.6935 +vn -0.3252 -0.7926 -0.5157 +vn -0.1171 -0.6058 -0.7869 +vn -0.1972 -0.5757 -0.7936 +vn -0.2096 -0.5216 -0.8270 +vn -0.1234 -0.5274 -0.8406 +vn -0.1441 -0.4307 -0.8909 +vn -0.0690 -0.4435 -0.8936 +vn -0.1831 -0.3027 -0.9353 +vn -0.1208 -0.3490 -0.9293 +vn -0.1903 -0.1786 -0.9653 +vn -0.0939 -0.1978 -0.9757 +vn -0.2810 -0.5570 -0.7815 +vn -0.2856 -0.4923 -0.8222 +vn -0.2688 -0.4235 -0.8651 +vn -0.1992 -0.2955 -0.9343 +vn -0.2047 -0.1729 -0.9634 +vn -0.2910 -0.5495 -0.7832 +vn -0.3172 -0.4597 -0.8295 +vn -0.3532 -0.4027 -0.8444 +vn -0.2602 -0.2874 -0.9218 +vn -0.1950 -0.1562 -0.9683 +vn -0.3548 -0.5167 -0.7792 +vn -0.3517 -0.4308 -0.8311 +vn -0.3756 -0.3745 -0.8477 +vn -0.3882 -0.2446 -0.8885 +vn -0.2477 -0.0972 -0.9639 +vn -0.0902 -0.6252 -0.7753 +vn -0.0071 -0.1268 -0.9919 +vn 0.0127 -0.1351 -0.9907 +vn 0.0358 -0.2057 -0.9780 +vn -0.5583 0.4166 -0.7175 +vn -0.4090 0.1042 -0.9066 +vn -0.2340 -0.2511 -0.9392 +vn -0.4580 -0.5006 -0.7346 +vn -0.0552 -0.5112 -0.8577 +vn -0.0801 -0.1306 -0.9882 +vn -0.4374 -0.2654 -0.8592 +vn -0.0068 -0.4469 -0.8946 +vn -0.1872 -0.1238 -0.9745 +vn -0.3596 -0.3925 -0.8465 +vn 0.0212 -0.3605 -0.9325 +vn -0.2575 -0.0863 -0.9624 +vn -0.3779 -0.4126 -0.8288 +vn 0.4752 -0.7464 0.4659 +vn 0.4290 -0.8573 0.2848 +vn 0.3409 -0.9215 0.1858 +vn 0.4572 -0.8227 0.3380 +vn 0.2987 -0.9428 0.1484 +vn 0.4057 -0.8764 0.2596 +vn 0.2804 -0.9551 0.0957 +vn 0.3411 -0.9240 0.1727 +vn 0.2650 -0.9640 0.0224 +vn 0.2593 -0.9601 0.1047 +vn 0.3872 -0.9177 0.0884 +vn 0.2933 -0.9554 0.0344 +vn 0.2311 -0.9696 0.0806 +vn 0.2319 -0.9683 0.0931 +vn 0.2464 -0.9691 0.0067 +vn 0.2005 -0.9794 -0.0231 +vn 0.1947 -0.9795 -0.0513 +vn 0.1971 -0.9795 0.0425 +vn 0.1784 -0.9791 0.0975 +vn 0.1829 -0.9831 -0.0010 +vn 0.0800 -0.9955 -0.0517 +vn 0.1130 -0.9922 -0.0532 +vn 0.1233 -0.9922 0.0156 +vn 0.0858 -0.9950 0.0504 +vn 0.0352 -0.9992 -0.0189 +vn 0.5117 -0.5882 0.6262 +vn 0.5132 -0.7161 0.4730 +vn 0.4957 -0.7054 0.5067 +vn 0.2467 -0.9690 0.0123 +vn 0.3367 -0.9414 0.0206 +vn 0.3119 -0.9405 0.1352 +vn 0.0433 -0.9862 -0.1597 +vn 0.0657 -0.9971 -0.0393 +vn 0.4815 -0.7841 0.3915 +vn 0.1826 -0.9826 -0.0353 +vn 0.1880 -0.9822 -0.0001 +vn 0.4120 -0.8562 0.3117 +vn 0.2198 -0.9702 -0.1017 +vn 0.3911 -0.9138 0.1094 +vn 0.3231 -0.9261 0.1948 +vn 0.1728 -0.9737 -0.1484 +vn 0.5080 -0.8111 0.2901 +vn 0.2718 -0.9557 -0.1127 +vn 0.1445 -0.9818 -0.1232 +vn 0.1556 -0.9733 -0.1687 +vn 0.2409 -0.9636 -0.1157 +vn 0.1535 -0.9689 -0.1941 +vn 0.2531 -0.9484 -0.1911 +vn 0.2426 -0.9210 -0.3047 +vn 0.3187 -0.8884 -0.3304 +vn 0.2939 -0.8549 -0.4275 +vn 0.3361 -0.8489 -0.4080 +vn 0.1476 -0.9759 -0.1610 +vn 0.1284 -0.9770 -0.1706 +vn 0.1514 -0.9750 -0.1625 +vn 0.2089 -0.9483 -0.2388 +vn 0.2630 -0.8802 -0.3950 +vn 0.1456 -0.9671 -0.2084 +vn 0.1225 -0.9782 -0.1675 +vn 0.1309 -0.9829 -0.1294 +vn 0.1538 -0.9686 -0.1956 +vn 0.1924 -0.9170 -0.3493 +vn 0.0612 -0.9738 -0.2188 +vn 0.0830 -0.9774 -0.1943 +vn 0.0409 -0.9859 -0.1620 +vn -0.0346 -0.9872 -0.1559 +vn -0.0461 -0.9632 -0.2648 +vn 0.2949 -0.9535 -0.0617 +vn 0.2968 -0.8261 -0.4791 +vn 0.3044 -0.8317 -0.4644 +vn 0.3464 -0.8554 -0.3850 +vn 0.0255 -0.9103 -0.4131 +vn 0.2808 -0.9555 -0.0906 +vn 0.2815 -0.8279 -0.4851 +vn 0.3338 -0.9170 -0.2183 +vn 0.2959 -0.8239 -0.4834 +vn 0.3577 -0.8729 -0.3319 +vn 0.2341 -0.8560 -0.4610 +vn 0.3149 -0.7997 -0.5112 +vn 0.3080 -0.8129 -0.4943 +vn 0.3085 -0.8140 -0.4922 +vn 0.3131 -0.8088 -0.4978 +vn 0.3201 -0.7934 -0.5177 +vn 0.3417 -0.7822 -0.5210 +vn 0.2930 -0.7923 -0.5352 +vn 0.3647 -0.7750 -0.5161 +vn 0.2538 -0.7874 -0.5618 +vn 0.3304 -0.7517 -0.5707 +vn 0.2892 -0.8267 -0.4826 +vn 0.2726 -0.8169 -0.5083 +vn 0.2227 -0.8171 -0.5318 +vn 0.2227 -0.8079 -0.5456 +vn 0.2477 -0.8004 -0.5459 +vn 0.2426 -0.8234 -0.5129 +vn 0.1887 -0.8231 -0.5356 +vn 0.1700 -0.8220 -0.5436 +vn 0.2019 -0.8240 -0.5293 +vn 0.2266 -0.7965 -0.5606 +vn 0.1006 -0.8442 -0.5264 +vn 0.0900 -0.8221 -0.5622 +vn 0.0866 -0.8351 -0.5432 +vn 0.1272 -0.8386 -0.5297 +vn 0.1097 -0.7981 -0.5924 +vn 0.3093 -0.7994 -0.5151 +vn 0.3690 -0.6333 -0.6803 +vn 0.4140 -0.6010 -0.6837 +vn 0.3984 -0.7246 -0.5623 +vn 0.0147 -0.7354 -0.6774 +vn 0.3014 -0.8122 -0.4995 +vn 0.3269 -0.6826 -0.6536 +vn 0.3257 -0.7811 -0.5327 +vn 0.2667 -0.7295 -0.6298 +vn 0.3880 -0.7602 -0.5211 +vn 0.1352 -0.7545 -0.6422 +vn 0.4104 -0.5075 -0.7577 +vn 0.3302 -0.5552 -0.7633 +vn 0.2563 -0.4402 -0.8605 +vn 0.3228 -0.4530 -0.8310 +vn 0.2051 -0.3717 -0.9054 +vn 0.2538 -0.3578 -0.8987 +vn 0.2335 -0.2881 -0.9287 +vn 0.2828 -0.2458 -0.9272 +vn 0.2613 -0.2344 -0.9364 +vn 0.2602 -0.2310 -0.9375 +vn 0.2494 -0.5695 -0.7832 +vn 0.2162 -0.4269 -0.8781 +vn 0.1792 -0.3818 -0.9067 +vn 0.2091 -0.3297 -0.9206 +vn 0.2941 -0.2073 -0.9330 +vn 0.1296 -0.6018 -0.7881 +vn 0.1750 -0.4321 -0.8847 +vn 0.1851 -0.3785 -0.9069 +vn 0.2295 -0.3340 -0.9142 +vn 0.2211 -0.2379 -0.9458 +vn -0.0028 -0.6296 -0.7769 +vn 0.0624 -0.4817 -0.8741 +vn 0.1038 -0.4196 -0.9018 +vn 0.1984 -0.3403 -0.9191 +vn 0.1368 -0.2243 -0.9649 +vn 0.4299 -0.5059 -0.7478 +vn 0.2817 -0.1946 -0.9396 +vn 0.0407 0.5523 0.8326 +vn 0.2903 -0.2300 -0.9289 +vn 0.0547 -0.1600 -0.9856 +vn 0.3565 -0.4812 -0.8009 +vn -0.0209 -0.4137 -0.9102 +vn 0.2708 -0.3923 -0.8791 +vn 0.1134 -0.2624 -0.9583 +vn 0.3263 -0.1929 -0.9254 +vn 0.1165 -0.1924 -0.9744 +vn -0.0146 0.0818 0.9965 +vn 0.0545 0.0851 0.9949 +vn 0.0459 0.0818 0.9956 +vn -0.0250 0.1150 0.9930 +vn -0.8015 0.2786 0.5292 +vn -0.7459 0.4479 0.4930 +vn -0.7526 0.4292 0.4994 +vn -0.8035 0.2674 0.5319 +vn -0.4513 0.6933 0.5619 +vn -0.3345 0.7981 0.5011 +vn -0.3418 0.7770 0.5287 +vn -0.4465 0.6727 0.5900 +vn 0.2975 0.5170 0.8026 +vn 0.2100 0.4635 0.8608 +vn 0.2085 0.4984 0.8415 +vn 0.3040 0.5436 0.7824 +vn -0.7604 0.5127 0.3985 +vn -0.7638 0.5026 0.4050 +vn 0.1253 0.3927 0.9111 +vn 0.1280 0.4079 0.9040 +vn -0.7014 0.5687 0.4295 +vn -0.7095 0.5609 0.4265 +vn 0.0847 0.3936 0.9154 +vn 0.0882 0.4126 0.9066 +vn -0.5862 0.6030 0.5412 +vn -0.5913 0.5900 0.5497 +vn -0.0134 0.2571 0.9663 +vn -0.0228 0.3107 0.9502 +vn -0.9026 0.4065 0.1416 +vn -0.9325 0.3336 0.1388 +vn -0.9292 0.3413 0.1418 +vn -0.9017 0.4084 0.1420 +vn -0.8155 0.3240 0.4796 +vn -0.8165 0.3244 0.4776 +vn -0.9488 0.2258 0.2209 +vn -0.9488 0.2292 0.2172 +vn -0.9175 0.2495 0.3096 +vn -0.9194 0.2426 0.3096 +vn -0.8710 0.2848 0.4003 +vn -0.8762 0.2776 0.3939 +vn -0.7788 0.6200 0.0954 +vn -0.8910 0.4515 -0.0476 +vn -0.8843 0.4653 -0.0388 +vn -0.7721 0.6275 0.1004 +vn -0.9199 0.3806 0.0940 +vn -0.9196 0.3824 0.0905 +vn -0.9564 0.2882 -0.0465 +vn -0.9577 0.2852 -0.0373 +vn -0.9435 0.3313 0.0111 +vn -0.9455 0.3256 0.0067 +vn -0.8832 0.4659 0.0544 +vn -0.8835 0.4658 0.0490 +vn 0.0810 0.9826 -0.1674 +vn -0.0009 0.9910 -0.1339 +vn 0.0007 0.9899 -0.1415 +vn 0.0816 0.9822 -0.1693 +vn -0.4989 0.8482 0.1780 +vn -0.5864 0.8078 -0.0605 +vn -0.5825 0.8115 -0.0453 +vn -0.5424 0.8229 0.1694 +vn -0.5276 0.8468 0.0675 +vn -0.5680 0.8223 0.0332 +vn -0.8041 0.5862 0.0994 +vn -0.8081 0.5814 0.0941 +vn -0.1200 0.9824 -0.1434 +vn -0.0955 0.9865 -0.1328 +vn -0.6811 0.7322 0.0003 +vn -0.6778 0.7353 -0.0009 +vn -0.2615 0.9580 -0.1179 +vn -0.2448 0.9625 -0.1169 +vn -0.7717 0.6336 0.0544 +vn -0.7683 0.6373 0.0598 +vn -0.4021 0.9138 -0.0579 +vn -0.4020 0.9135 -0.0630 +vn -0.8367 0.5476 -0.0061 +vn -0.8381 0.5455 -0.0045 +vn 0.3300 0.7267 0.6025 +vn 0.4174 0.7021 0.5769 +vn 0.3962 0.7162 0.5745 +vn 0.3259 0.7308 0.5997 +vn -0.2865 0.4858 0.8258 +vn -0.2819 0.4649 0.8393 +vn -0.2881 0.4678 0.8356 +vn -0.2858 0.4791 0.8299 +vn 0.7902 0.3771 0.4830 +vn 0.8285 0.3289 0.4531 +vn 0.8274 0.3262 0.4572 +vn 0.7875 0.3814 0.4841 +vn 0.0704 0.1123 0.9912 +vn 0.0778 0.1009 0.9918 +vn 0.6609 0.5535 0.5067 +vn 0.6384 0.5739 0.5129 +vn 0.0239 0.1959 0.9803 +vn 0.0523 0.1615 0.9855 +vn 0.7780 0.4792 0.4063 +vn 0.7671 0.4944 0.4088 +vn -0.0937 0.3803 0.9201 +vn -0.0575 0.3524 0.9341 +vn 0.8285 0.3660 0.4239 +vn 0.8262 0.3735 0.4218 +vn -0.1778 0.4486 0.8759 +vn -0.1605 0.4340 0.8865 +vn 0.8102 0.3999 0.4285 +vn 0.8074 0.4038 0.4301 +vn 0.9137 0.2980 0.2762 +vn 0.9307 0.3503 0.1056 +vn 0.9305 0.3515 0.1035 +vn 0.9151 0.2958 0.2741 +vn 0.8849 0.2770 0.3744 +vn 0.8764 0.2937 0.3816 +vn 0.9305 0.2173 0.2950 +vn 0.9271 0.2247 0.3001 +vn 0.9440 0.1885 0.2707 +vn 0.9437 0.1846 0.2745 +vn 0.9090 0.4158 0.0291 +vn 0.9074 0.4194 0.0269 +vn 0.8634 0.5002 0.0658 +vn 0.8618 0.5067 -0.0216 +vn 0.8633 0.5040 -0.0245 +vn 0.8619 0.5034 0.0614 +vn 0.9416 0.3316 -0.0593 +vn 0.9420 0.3304 -0.0594 +vn 0.8922 0.4484 0.0541 +vn 0.8945 0.4440 0.0513 +vn 0.8877 0.4537 0.0782 +vn 0.8887 0.4518 0.0776 +vn 0.8183 0.5710 0.0657 +vn 0.8198 0.5692 0.0628 +vn 0.7113 0.7026 -0.0224 +vn 0.5944 0.6224 -0.5092 +vn 0.5124 0.6183 -0.5959 +vn 0.7053 0.7087 0.0173 +vn 0.6513 0.7438 -0.1501 +vn 0.5543 0.7695 -0.3173 +vn 0.2361 0.9615 -0.1403 +vn 0.2240 0.9627 -0.1515 +vn 0.7929 0.6091 -0.0165 +vn 0.7975 0.6032 -0.0106 +vn 0.5859 0.8036 -0.1041 +vn 0.5646 0.8130 -0.1421 +vn 0.7205 0.6918 -0.0488 +vn 0.7218 0.6899 -0.0563 +vn 0.5067 0.8538 -0.1195 +vn 0.5106 0.8520 -0.1156 +vn 0.6876 0.7249 0.0422 +vn 0.6905 0.7223 0.0388 +vn 0.3721 0.9153 -0.1541 +vn 0.3580 0.9188 -0.1663 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_04 +s 1 +f 2601/1301/3193 2602/1302/3194 2603/1303/3195 2604/1304/3196 +f 2605/1305/3197 2601/1301/3193 2604/1304/3196 2606/1306/3198 +f 2607/1307/3199 2605/1305/3197 2606/1306/3198 2608/1308/3200 +f 2609/1309/3201 2607/1307/3199 2608/1308/3200 2610/1310/3202 +f 2611/1311/3203 2612/1312/3204 2602/1302/3194 2601/1301/3193 +f 2613/1313/3205 2611/1311/3203 2601/1301/3193 2605/1305/3197 +f 2614/1314/3206 2613/1313/3205 2605/1305/3197 2607/1307/3199 +f 2615/1315/3207 2614/1314/3206 2607/1307/3199 2609/1309/3201 +f 2616/1316/3208 2617/1317/3209 2612/1312/3204 2611/1311/3203 +f 2618/1318/3210 2616/1316/3208 2611/1311/3203 2613/1313/3205 +f 2619/1319/3211 2618/1318/3210 2613/1313/3205 2614/1314/3206 +f 2620/1320/3212 2619/1319/3211 2614/1314/3206 2615/1315/3207 +f 2621/1321/3213 2622/1322/3214 2617/1317/3209 2616/1316/3208 +f 2623/1323/3215 2621/1321/3213 2616/1316/3208 2618/1318/3210 +f 2624/1324/3216 2623/1323/3215 2618/1318/3210 2619/1319/3211 +f 2625/1325/3217 2624/1324/3216 2619/1319/3211 2620/1320/3212 +f 2603/1303/3195 2626/1326/3218 2627/1327/3219 2628/1328/3220 +f 2629/1329/3221 2630/1330/3222 2631/1331/3223 2610/1310/3202 +f 2625/1325/3217 2632/1332/3224 2633/1333/3225 2634/1334/3226 +f 2635/1335/3227 2636/1336/3228 2637/1337/3229 2622/1322/3214 +f 2604/1304/3196 2603/1303/3195 2628/1328/3220 2638/1338/3230 +f 2610/1310/3202 2631/1331/3223 2639/1339/3231 2609/1309/3201 +f 2624/1324/3216 2625/1325/3217 2634/1334/3226 2640/1340/3232 +f 2622/1322/3214 2637/1337/3229 2641/1341/3233 2617/1317/3209 +f 2606/1306/3198 2604/1304/3196 2638/1338/3230 2642/1342/3234 +f 2609/1309/3201 2639/1339/3231 2643/1343/3235 2615/1315/3207 +f 2623/1323/3215 2624/1324/3216 2640/1340/3232 2644/1344/3236 +f 2617/1317/3209 2641/1341/3233 2645/1345/3237 2612/1312/3204 +f 2608/1308/3200 2606/1306/3198 2642/1342/3234 2646/1346/3238 +f 2615/1315/3207 2643/1343/3235 2647/1347/3239 2620/1320/3212 +f 2621/1321/3213 2623/1323/3215 2644/1344/3236 2648/1348/3240 +f 2612/1312/3204 2645/1345/3237 2649/1349/3241 2602/1302/3194 +f 2610/1310/3202 2608/1308/3200 2646/1346/3238 2629/1329/3221 +f 2620/1320/3212 2647/1347/3239 2632/1332/3224 2625/1325/3217 +f 2622/1322/3214 2621/1321/3213 2648/1348/3240 2635/1335/3227 +f 2602/1302/3194 2649/1349/3241 2626/1326/3218 2603/1303/3195 +f 2650/1350/3242 2651/1351/3243 2652/1352/3244 2653/1353/3245 +f 2654/1354/3246 2650/1350/3242 2653/1353/3245 2655/1355/3247 +f 2656/1356/3248 2654/1354/3246 2655/1355/3247 2657/1357/3249 +f 2658/1358/3250 2656/1356/3248 2657/1357/3249 2659/1359/3251 +f 2660/1360/3252 2661/1361/3253 2651/1351/3243 2650/1350/3242 +f 2662/1362/3254 2660/1360/3252 2650/1350/3242 2654/1354/3246 +f 2663/1363/3255 2662/1362/3254 2654/1354/3246 2656/1356/3248 +f 2664/1364/3256 2663/1363/3255 2656/1356/3248 2658/1358/3250 +f 2665/1365/3257 2666/1366/3258 2661/1361/3253 2660/1360/3252 +f 2667/1367/3259 2665/1365/3257 2660/1360/3252 2662/1362/3254 +f 2668/1368/3260 2667/1367/3259 2662/1362/3254 2663/1363/3255 +f 2669/1369/3261 2668/1368/3260 2663/1363/3255 2664/1364/3256 +f 2670/1370/3262 2671/1371/3263 2666/1366/3258 2665/1365/3257 +f 2672/1372/3264 2670/1370/3262 2665/1365/3257 2667/1367/3259 +f 2673/1373/3265 2672/1372/3264 2667/1367/3259 2668/1368/3260 +f 2674/1374/3266 2673/1373/3265 2668/1368/3260 2669/1369/3261 +f 2652/1352/3244 2631/1331/3223 2630/1330/3222 2675/1375/3267 +f 2676/1376/3268 2677/1377/3269 2678/1378/3270 2659/1359/3251 +f 2674/1374/3266 2679/1379/3271 2680/1380/3272 2681/1381/3273 +f 2682/1382/3274 2633/1333/3225 2632/1332/3224 2671/1371/3263 +f 2653/1353/3245 2652/1352/3244 2675/1375/3267 2683/1383/3275 +f 2659/1359/3251 2678/1378/3270 2684/1384/3276 2658/1358/3250 +f 2673/1373/3265 2674/1374/3266 2681/1381/3273 2685/1385/3277 +f 2671/1371/3263 2632/1332/3224 2647/1347/3239 2666/1366/3258 +f 2655/1355/3247 2653/1353/3245 2683/1383/3275 2686/1386/3278 +f 2658/1358/3250 2684/1384/3276 2687/1387/3279 2664/1364/3256 +f 2672/1372/3264 2673/1373/3265 2685/1385/3277 2688/1388/3280 +f 2666/1366/3258 2647/1347/3239 2643/1343/3235 2661/1361/3253 +f 2657/1357/3249 2655/1355/3247 2686/1386/3278 2689/1389/3281 +f 2664/1364/3256 2687/1387/3279 2690/1390/3282 2669/1369/3261 +f 2670/1370/3262 2672/1372/3264 2688/1388/3280 2691/1391/3283 +f 2661/1361/3253 2643/1343/3235 2639/1339/3231 2651/1351/3243 +f 2659/1359/3251 2657/1357/3249 2689/1389/3281 2676/1376/3268 +f 2669/1369/3261 2690/1390/3282 2679/1379/3271 2674/1374/3266 +f 2671/1371/3263 2670/1370/3262 2691/1391/3283 2682/1382/3274 +f 2651/1351/3243 2639/1339/3231 2631/1331/3223 2652/1352/3244 +f 2692/1392/3284 2693/1393/3285 2694/1394/3286 2695/1395/3287 +f 2696/1396/3288 2692/1392/3284 2695/1395/3287 2697/1397/3289 +f 2698/1398/3290 2696/1396/3288 2697/1397/3289 2699/1399/3291 +f 2700/1400/3292 2698/1398/3290 2699/1399/3291 2701/1401/3293 +f 2702/1402/3294 2703/1403/3295 2693/1393/3285 2692/1392/3284 +f 2704/1404/3296 2702/1402/3294 2692/1392/3284 2696/1396/3288 +f 2705/1405/3297 2704/1404/3296 2696/1396/3288 2698/1398/3290 +f 2706/1406/3298 2705/1405/3297 2698/1398/3290 2700/1400/3292 +f 2707/1407/3299 2708/1408/3300 2703/1403/3295 2702/1402/3294 +f 2709/1409/3301 2707/1407/3299 2702/1402/3294 2704/1404/3296 +f 2710/1410/3302 2709/1409/3301 2704/1404/3296 2705/1405/3297 +f 2711/1411/3303 2710/1410/3302 2705/1405/3297 2706/1406/3298 +f 2712/1412/3304 2713/1413/3305 2708/1408/3300 2707/1407/3299 +f 2714/1414/3306 2712/1412/3304 2707/1407/3299 2709/1409/3301 +f 2715/1415/3307 2714/1414/3306 2709/1409/3301 2710/1410/3302 +f 2716/1416/3308 2715/1415/3307 2710/1410/3302 2711/1411/3303 +f 2694/1394/3286 2678/1378/3270 2677/1377/3269 2717/1417/3309 +f 2718/1418/3310 2719/1419/3311 2720/1420/3312 2701/1401/3293 +f 2716/1416/3308 2721/1421/3313 2722/1422/3314 2723/1423/3315 +f 2724/1424/3316 2680/1380/3272 2679/1379/3271 2713/1413/3305 +f 2695/1395/3287 2694/1394/3286 2717/1417/3309 2725/1425/3317 +f 2701/1401/3293 2720/1420/3312 2726/1426/3318 2700/1400/3292 +f 2715/1415/3307 2716/1416/3308 2723/1423/3315 2727/1427/3319 +f 2713/1413/3305 2679/1379/3271 2690/1390/3282 2708/1408/3300 +f 2697/1397/3289 2695/1395/3287 2725/1425/3317 2728/1428/3320 +f 2700/1400/3292 2726/1426/3318 2729/1429/3321 2706/1406/3298 +f 2714/1414/3306 2715/1415/3307 2727/1427/3319 2730/1430/3322 +f 2708/1408/3300 2690/1390/3282 2687/1387/3279 2703/1403/3295 +f 2699/1399/3291 2697/1397/3289 2728/1428/3320 2731/1431/3323 +f 2706/1406/3298 2729/1429/3321 2732/1432/3324 2711/1411/3303 +f 2712/1412/3304 2714/1414/3306 2730/1430/3322 2733/1433/3325 +f 2703/1403/3295 2687/1387/3279 2684/1384/3276 2693/1393/3285 +f 2701/1401/3293 2699/1399/3291 2731/1431/3323 2718/1418/3310 +f 2711/1411/3303 2732/1432/3324 2721/1421/3313 2716/1416/3308 +f 2713/1413/3305 2712/1412/3304 2733/1433/3325 2724/1424/3316 +f 2693/1393/3285 2684/1384/3276 2678/1378/3270 2694/1394/3286 +f 2734/1434/3326 2735/1435/3327 2736/1436/3328 2737/1437/3329 +f 2738/1438/3330 2734/1434/3326 2737/1437/3329 2739/1439/3331 +f 2740/1440/3332 2738/1438/3330 2739/1439/3331 2741/1441/3333 +f 2742/1442/3334 2740/1440/3332 2741/1441/3333 2743/1443/3335 +f 2744/1444/3336 2745/1445/3337 2735/1435/3327 2734/1434/3326 +f 2746/1446/3338 2744/1444/3336 2734/1434/3326 2738/1438/3330 +f 2747/1447/3339 2746/1446/3338 2738/1438/3330 2740/1440/3332 +f 2748/1448/3340 2747/1447/3339 2740/1440/3332 2742/1442/3334 +f 2749/1449/3341 2750/1450/3342 2745/1445/3337 2744/1444/3336 +f 2751/1451/3343 2749/1449/3341 2744/1444/3336 2746/1446/3338 +f 2752/1452/3344 2751/1451/3343 2746/1446/3338 2747/1447/3339 +f 2753/1453/3345 2752/1452/3344 2747/1447/3339 2748/1448/3340 +f 2754/1454/3346 2755/1455/3347 2750/1450/3342 2749/1449/3341 +f 2756/1456/3348 2754/1454/3346 2749/1449/3341 2751/1451/3343 +f 2757/1457/3349 2756/1456/3348 2751/1451/3343 2752/1452/3344 +f 2758/1458/3350 2757/1457/3349 2752/1452/3344 2753/1453/3345 +f 2736/1436/3328 2720/1420/3312 2719/1419/3311 2759/1459/3351 +f 2760/1460/3352 2761/1461/3353 2762/1462/3354 2743/1443/3335 +f 2758/1458/3350 2763/1463/3355 2764/1464/3356 2765/1465/3357 +f 2766/1466/3358 2722/1422/3314 2721/1421/3313 2755/1455/3347 +f 2737/1437/3329 2736/1436/3328 2759/1459/3351 2767/1467/3359 +f 2743/1443/3335 2762/1462/3354 2768/1468/3360 2742/1442/3334 +f 2757/1457/3349 2758/1458/3350 2765/1465/3357 2769/1469/3361 +f 2755/1455/3347 2721/1421/3313 2732/1432/3324 2750/1450/3342 +f 2739/1439/3331 2737/1437/3329 2767/1467/3359 2770/1470/3362 +f 2742/1442/3334 2768/1468/3360 2771/1471/3363 2748/1448/3340 +f 2756/1456/3348 2757/1457/3349 2769/1469/3361 2772/1472/3364 +f 2750/1450/3342 2732/1432/3324 2729/1429/3321 2745/1445/3337 +f 2741/1441/3333 2739/1439/3331 2770/1470/3362 2773/1473/3365 +f 2748/1448/3340 2771/1471/3363 2774/1474/3366 2753/1453/3345 +f 2754/1454/3346 2756/1456/3348 2772/1472/3364 2775/1475/3367 +f 2745/1445/3337 2729/1429/3321 2726/1426/3318 2735/1435/3327 +f 2743/1443/3335 2741/1441/3333 2773/1473/3365 2760/1460/3352 +f 2753/1453/3345 2774/1474/3366 2763/1463/3355 2758/1458/3350 +f 2755/1455/3347 2754/1454/3346 2775/1475/3367 2766/1466/3358 +f 2735/1435/3327 2726/1426/3318 2720/1420/3312 2736/1436/3328 +f 2776/1476/3368 2777/1477/3369 2778/1478/3370 2779/1479/3371 +f 2780/1480/3372 2776/1476/3368 2779/1479/3371 2781/1481/3373 +f 2782/1482/3374 2780/1480/3372 2781/1481/3373 2783/1483/3375 +f 2784/1484/3376 2782/1482/3374 2783/1483/3375 2785/1485/3377 +f 2786/1486/3378 2787/1487/3379 2777/1477/3369 2776/1476/3368 +f 2788/1488/3380 2786/1486/3378 2776/1476/3368 2780/1480/3372 +f 2789/1489/3381 2788/1488/3380 2780/1480/3372 2782/1482/3374 +f 2790/1490/3382 2789/1489/3381 2782/1482/3374 2784/1484/3376 +f 2791/1491/3383 2792/1492/3384 2787/1487/3379 2786/1486/3378 +f 2793/1493/3385 2791/1491/3383 2786/1486/3378 2788/1488/3380 +f 2794/1494/3386 2793/1493/3385 2788/1488/3380 2789/1489/3381 +f 2795/1495/3387 2794/1494/3386 2789/1489/3381 2790/1490/3382 +f 2796/1496/3388 2797/1497/3389 2792/1492/3384 2791/1491/3383 +f 2798/1498/3390 2796/1496/3388 2791/1491/3383 2793/1493/3385 +f 2799/1499/3391 2798/1498/3390 2793/1493/3385 2794/1494/3386 +f 2800/1500/3392 2799/1499/3391 2794/1494/3386 2795/1495/3387 +f 2778/1478/3370 2801/1501/3393 2802/1502/3394 2803/1503/3395 +f 2804/1504/3396 2805/1505/3397 2806/1506/3398 2785/1485/3377 +f 2800/1500/3392 2807/1507/3399 2630/1330/3222 2629/1329/3221 +f 2628/1328/3220 2627/1327/3219 2808/1508/3400 2797/1497/3389 +f 2779/1479/3371 2778/1478/3370 2803/1503/3395 2809/1509/3401 +f 2785/1485/3377 2806/1506/3398 2810/1510/3402 2784/1484/3376 +f 2799/1499/3391 2800/1500/3392 2629/1329/3221 2646/1346/3238 +f 2797/1497/3389 2808/1508/3400 2811/1511/3403 2792/1492/3384 +f 2781/1481/3373 2779/1479/3371 2809/1509/3401 2812/1512/3404 +f 2784/1484/3376 2810/1510/3402 2813/1513/3405 2790/1490/3382 +f 2798/1498/3390 2799/1499/3391 2646/1346/3238 2642/1342/3234 +f 2792/1492/3384 2811/1511/3403 2814/1514/3406 2787/1487/3379 +f 2783/1483/3375 2781/1481/3373 2812/1512/3404 2815/1515/3407 +f 2790/1490/3382 2813/1513/3405 2816/1516/3408 2795/1495/3387 +f 2796/1496/3388 2798/1498/3390 2642/1342/3234 2638/1338/3230 +f 2787/1487/3379 2814/1514/3406 2817/1517/3409 2777/1477/3369 +f 2785/1485/3377 2783/1483/3375 2815/1515/3407 2804/1504/3396 +f 2795/1495/3387 2816/1516/3408 2807/1507/3399 2800/1500/3392 +f 2797/1497/3389 2796/1496/3388 2638/1338/3230 2628/1328/3220 +f 2777/1477/3369 2817/1517/3409 2801/1501/3393 2778/1478/3370 +f 2818/1518/3410 2819/1519/3411 2820/1520/3412 2821/1521/3413 +f 2822/1522/3414 2818/1518/3410 2821/1521/3413 2823/1523/3415 +f 2824/1524/3416 2822/1522/3414 2823/1523/3415 2825/1525/3417 +f 2826/1526/3418 2824/1524/3416 2825/1525/3417 2827/1527/3419 +f 2828/1528/3420 2829/1529/3421 2819/1519/3411 2818/1518/3410 +f 2830/1530/3422 2828/1528/3420 2818/1518/3410 2822/1522/3414 +f 2831/1531/3423 2830/1530/3422 2822/1522/3414 2824/1524/3416 +f 2832/1532/3424 2831/1531/3423 2824/1524/3416 2826/1526/3418 +f 2833/1533/3425 2834/1534/3426 2829/1529/3421 2828/1528/3420 +f 2835/1535/3427 2833/1533/3425 2828/1528/3420 2830/1530/3422 +f 2836/1536/3428 2835/1535/3427 2830/1530/3422 2831/1531/3423 +f 2837/1537/3429 2836/1536/3428 2831/1531/3423 2832/1532/3424 +f 2838/1538/3430 2839/1539/3431 2834/1534/3426 2833/1533/3425 +f 2840/1540/3432 2838/1538/3430 2833/1533/3425 2835/1535/3427 +f 2841/1541/3433 2840/1540/3432 2835/1535/3427 2836/1536/3428 +f 2842/1542/3434 2841/1541/3433 2836/1536/3428 2837/1537/3429 +f 2820/1520/3412 2806/1506/3398 2805/1505/3397 2843/1543/3435 +f 2844/1544/3436 2845/1545/3437 2846/1546/3438 2827/1527/3419 +f 2842/1542/3434 2847/1547/3439 2677/1377/3269 2676/1376/3268 +f 2675/1375/3267 2630/1330/3222 2807/1507/3399 2839/1539/3431 +f 2821/1521/3413 2820/1520/3412 2843/1543/3435 2848/1548/3440 +f 2827/1527/3419 2846/1546/3438 2849/1549/3441 2826/1526/3418 +f 2841/1541/3433 2842/1542/3434 2676/1376/3268 2689/1389/3281 +f 2839/1539/3431 2807/1507/3399 2816/1516/3408 2834/1534/3426 +f 2823/1523/3415 2821/1521/3413 2848/1548/3440 2850/1550/3442 +f 2826/1526/3418 2849/1549/3441 2851/1551/3443 2832/1532/3424 +f 2840/1540/3432 2841/1541/3433 2689/1389/3281 2686/1386/3278 +f 2834/1534/3426 2816/1516/3408 2813/1513/3405 2829/1529/3421 +f 2825/1525/3417 2823/1523/3415 2850/1550/3442 2852/1552/3444 +f 2832/1532/3424 2851/1551/3443 2853/1553/3445 2837/1537/3429 +f 2838/1538/3430 2840/1540/3432 2686/1386/3278 2683/1383/3275 +f 2829/1529/3421 2813/1513/3405 2810/1510/3402 2819/1519/3411 +f 2827/1527/3419 2825/1525/3417 2852/1552/3444 2844/1544/3436 +f 2837/1537/3429 2853/1553/3445 2847/1547/3439 2842/1542/3434 +f 2839/1539/3431 2838/1538/3430 2683/1383/3275 2675/1375/3267 +f 2819/1519/3411 2810/1510/3402 2806/1506/3398 2820/1520/3412 +f 2854/1554/3446 2855/1555/3447 2856/1556/3448 2857/1557/3449 +f 2858/1558/3450 2854/1554/3446 2857/1557/3449 2859/1559/3451 +f 2860/1560/3452 2858/1558/3450 2859/1559/3451 2861/1561/3453 +f 2862/1562/3454 2860/1560/3452 2861/1561/3453 2863/1563/3455 +f 2864/1564/3456 2865/1565/3457 2855/1555/3447 2854/1554/3446 +f 2866/1566/3458 2864/1564/3456 2854/1554/3446 2858/1558/3450 +f 2867/1567/3459 2866/1566/3458 2858/1558/3450 2860/1560/3452 +f 2868/1568/3460 2867/1567/3459 2860/1560/3452 2862/1562/3454 +f 2869/1569/3461 2870/1570/3462 2865/1565/3457 2864/1564/3456 +f 2871/1571/3463 2869/1569/3461 2864/1564/3456 2866/1566/3458 +f 2872/1572/3464 2871/1571/3463 2866/1566/3458 2867/1567/3459 +f 2873/1573/3465 2872/1572/3464 2867/1567/3459 2868/1568/3460 +f 2874/1574/3466 2875/1575/3467 2870/1570/3462 2869/1569/3461 +f 2876/1576/3468 2874/1574/3466 2869/1569/3461 2871/1571/3463 +f 2877/1577/3469 2876/1576/3468 2871/1571/3463 2872/1572/3464 +f 2878/1578/3470 2877/1577/3469 2872/1572/3464 2873/1573/3465 +f 2856/1556/3448 2846/1546/3438 2845/1545/3437 2879/1579/3471 +f 2880/1580/3472 2881/1581/3473 2882/1582/3474 2863/1563/3455 +f 2878/1578/3470 2883/1583/3475 2719/1419/3311 2718/1418/3310 +f 2717/1417/3309 2677/1377/3269 2847/1547/3439 2875/1575/3467 +f 2857/1557/3449 2856/1556/3448 2879/1579/3471 2884/1584/3476 +f 2863/1563/3455 2882/1582/3474 2885/1585/3477 2862/1562/3454 +f 2877/1577/3469 2878/1578/3470 2718/1418/3310 2731/1431/3323 +f 2875/1575/3467 2847/1547/3439 2853/1553/3445 2870/1570/3462 +f 2859/1559/3451 2857/1557/3449 2884/1584/3476 2886/1586/3478 +f 2862/1562/3454 2885/1585/3477 2887/1587/3479 2868/1568/3460 +f 2876/1576/3468 2877/1577/3469 2731/1431/3323 2728/1428/3320 +f 2870/1570/3462 2853/1553/3445 2851/1551/3443 2865/1565/3457 +f 2861/1561/3453 2859/1559/3451 2886/1586/3478 2888/1588/3480 +f 2868/1568/3460 2887/1587/3479 2889/1589/3481 2873/1573/3465 +f 2874/1574/3466 2876/1576/3468 2728/1428/3320 2725/1425/3317 +f 2865/1565/3457 2851/1551/3443 2849/1549/3441 2855/1555/3447 +f 2863/1563/3455 2861/1561/3453 2888/1588/3480 2880/1580/3472 +f 2873/1573/3465 2889/1589/3481 2883/1583/3475 2878/1578/3470 +f 2875/1575/3467 2874/1574/3466 2725/1425/3317 2717/1417/3309 +f 2855/1555/3447 2849/1549/3441 2846/1546/3438 2856/1556/3448 +f 2890/1590/3482 2891/1591/3483 2892/1592/3484 2893/1593/3485 +f 2894/1594/3486 2890/1590/3482 2893/1593/3485 2895/1595/3487 +f 2896/1596/3488 2894/1594/3486 2895/1595/3487 2897/1597/3489 +f 2898/1598/3490 2896/1596/3488 2897/1597/3489 2899/1599/3491 +f 2900/1600/3492 2901/1601/3493 2891/1591/3483 2890/1590/3482 +f 2902/1602/3494 2900/1600/3492 2890/1590/3482 2894/1594/3486 +f 2903/1603/3495 2902/1602/3494 2894/1594/3486 2896/1596/3488 +f 2904/1604/3496 2903/1603/3495 2896/1596/3488 2898/1598/3490 +f 2905/1605/3497 2906/1606/3498 2901/1601/3493 2900/1600/3492 +f 2907/1607/3499 2905/1605/3497 2900/1600/3492 2902/1602/3494 +f 2908/1608/3500 2907/1607/3499 2902/1602/3494 2903/1603/3495 +f 2909/1609/3501 2908/1608/3500 2903/1603/3495 2904/1604/3496 +f 2910/1610/3502 2911/1611/3503 2906/1606/3498 2905/1605/3497 +f 2912/1612/3504 2910/1610/3502 2905/1605/3497 2907/1607/3499 +f 2913/1613/3505 2912/1612/3504 2907/1607/3499 2908/1608/3500 +f 2914/1614/3506 2913/1613/3505 2908/1608/3500 2909/1609/3501 +f 2892/1592/3484 2882/1582/3474 2881/1581/3473 2915/1615/3507 +f 2916/1616/3508 2917/1617/3509 2918/1618/3510 2899/1599/3491 +f 2914/1614/3506 2919/1619/3511 2761/1461/3353 2760/1460/3352 +f 2759/1459/3351 2719/1419/3311 2883/1583/3475 2911/1611/3503 +f 2893/1593/3485 2892/1592/3484 2915/1615/3507 2920/1620/3512 +f 2899/1599/3491 2918/1618/3510 2921/1621/3513 2898/1598/3490 +f 2913/1613/3505 2914/1614/3506 2760/1460/3352 2773/1473/3365 +f 2911/1611/3503 2883/1583/3475 2889/1589/3481 2906/1606/3498 +f 2895/1595/3487 2893/1593/3485 2920/1620/3512 2922/1622/3514 +f 2898/1598/3490 2921/1621/3513 2923/1623/3515 2904/1604/3496 +f 2912/1612/3504 2913/1613/3505 2773/1473/3365 2770/1470/3362 +f 2906/1606/3498 2889/1589/3481 2887/1587/3479 2901/1601/3493 +f 2897/1597/3489 2895/1595/3487 2922/1622/3514 2924/1624/3516 +f 2904/1604/3496 2923/1623/3515 2925/1625/3517 2909/1609/3501 +f 2910/1610/3502 2912/1612/3504 2770/1470/3362 2767/1467/3359 +f 2901/1601/3493 2887/1587/3479 2885/1585/3477 2891/1591/3483 +f 2899/1599/3491 2897/1597/3489 2924/1624/3516 2916/1616/3508 +f 2909/1609/3501 2925/1625/3517 2919/1619/3511 2914/1614/3506 +f 2911/1611/3503 2910/1610/3502 2767/1467/3359 2759/1459/3351 +f 2891/1591/3483 2885/1585/3477 2882/1582/3474 2892/1592/3484 +f 2926/1303/3518 2927/1302/3519 2928/1301/3520 2929/1304/3521 +f 2929/1304/3521 2928/1301/3520 2930/1305/3522 2931/1306/3523 +f 2931/1306/3523 2930/1305/3522 2932/1307/3524 2933/1308/3525 +f 2933/1308/3525 2932/1307/3524 2934/1309/3526 2935/1310/3527 +f 2927/1302/3519 2936/1312/3528 2937/1311/3529 2928/1301/3520 +f 2928/1301/3520 2937/1311/3529 2938/1313/3530 2930/1305/3522 +f 2930/1305/3522 2938/1313/3530 2939/1314/3531 2932/1307/3524 +f 2932/1307/3524 2939/1314/3531 2940/1315/3532 2934/1309/3526 +f 2936/1312/3528 2941/1317/3533 2942/1316/3534 2937/1311/3529 +f 2937/1311/3529 2942/1316/3534 2943/1318/3535 2938/1313/3530 +f 2938/1313/3530 2943/1318/3535 2944/1319/3536 2939/1314/3531 +f 2939/1314/3531 2944/1319/3536 2945/1320/3537 2940/1315/3532 +f 2941/1317/3533 2946/1322/3538 2947/1321/3539 2942/1316/3534 +f 2942/1316/3534 2947/1321/3539 2948/1323/3540 2943/1318/3535 +f 2943/1318/3535 2948/1323/3540 2949/1324/3541 2944/1319/3536 +f 2944/1319/3536 2949/1324/3541 2950/1325/3542 2945/1320/3537 +f 2951/1327/3543 2952/1326/3544 2926/1303/3518 2953/1328/3545 +f 2954/1331/3546 2955/1330/3547 2956/1329/3548 2935/1310/3527 +f 2957/1333/3549 2958/1332/3550 2950/1325/3542 2959/1334/3551 +f 2960/1337/3552 2961/1336/3553 2962/1335/3554 2946/1322/3538 +f 2953/1328/3545 2926/1303/3518 2929/1304/3521 2963/1338/3555 +f 2964/1339/3556 2954/1331/3546 2935/1310/3527 2934/1309/3526 +f 2959/1334/3551 2950/1325/3542 2949/1324/3541 2965/1340/3557 +f 2966/1341/3558 2960/1337/3552 2946/1322/3538 2941/1317/3533 +f 2963/1338/3555 2929/1304/3521 2931/1306/3523 2967/1342/3559 +f 2968/1343/3560 2964/1339/3556 2934/1309/3526 2940/1315/3532 +f 2965/1340/3557 2949/1324/3541 2948/1323/3540 2969/1344/3561 +f 2970/1345/3562 2966/1341/3558 2941/1317/3533 2936/1312/3528 +f 2967/1342/3559 2931/1306/3523 2933/1308/3525 2971/1346/3563 +f 2972/1347/3564 2968/1343/3560 2940/1315/3532 2945/1320/3537 +f 2969/1344/3561 2948/1323/3540 2947/1321/3539 2973/1348/3565 +f 2974/1349/3566 2970/1345/3562 2936/1312/3528 2927/1302/3519 +f 2971/1346/3563 2933/1308/3525 2935/1310/3527 2956/1329/3548 +f 2958/1332/3550 2972/1347/3564 2945/1320/3537 2950/1325/3542 +f 2973/1348/3565 2947/1321/3539 2946/1322/3538 2962/1335/3554 +f 2952/1326/3544 2974/1349/3566 2927/1302/3519 2926/1303/3518 +f 2975/1352/3567 2976/1351/3568 2977/1350/3569 2978/1353/3570 +f 2978/1353/3570 2977/1350/3569 2979/1354/3571 2980/1355/3572 +f 2980/1355/3572 2979/1354/3571 2981/1356/3573 2982/1357/3574 +f 2982/1357/3574 2981/1356/3573 2983/1358/3575 2984/1359/3576 +f 2976/1351/3568 2985/1361/3577 2986/1360/3578 2977/1350/3569 +f 2977/1350/3569 2986/1360/3578 2987/1362/3579 2979/1354/3571 +f 2979/1354/3571 2987/1362/3579 2988/1363/3580 2981/1356/3573 +f 2981/1356/3573 2988/1363/3580 2989/1364/3581 2983/1358/3575 +f 2985/1361/3577 2990/1366/3582 2991/1365/3583 2986/1360/3578 +f 2986/1360/3578 2991/1365/3583 2992/1367/3584 2987/1362/3579 +f 2987/1362/3579 2992/1367/3584 2993/1368/3585 2988/1363/3580 +f 2988/1363/3580 2993/1368/3585 2994/1369/3586 2989/1364/3581 +f 2990/1366/3582 2995/1371/3587 2996/1370/3588 2991/1365/3583 +f 2991/1365/3583 2996/1370/3588 2997/1372/3589 2992/1367/3584 +f 2992/1367/3584 2997/1372/3589 2998/1373/3590 2993/1368/3585 +f 2993/1368/3585 2998/1373/3590 2999/1374/3591 2994/1369/3586 +f 2955/1330/3547 2954/1331/3546 2975/1352/3567 3000/1375/3592 +f 3001/1378/3593 3002/1377/3594 3003/1376/3595 2984/1359/3576 +f 3004/1380/3596 3005/1379/3597 2999/1374/3591 3006/1381/3598 +f 2958/1332/3550 2957/1333/3549 3007/1382/3599 2995/1371/3587 +f 3000/1375/3592 2975/1352/3567 2978/1353/3570 3008/1383/3600 +f 3009/1384/3601 3001/1378/3593 2984/1359/3576 2983/1358/3575 +f 3006/1381/3598 2999/1374/3591 2998/1373/3590 3010/1385/3602 +f 2972/1347/3564 2958/1332/3550 2995/1371/3587 2990/1366/3582 +f 3008/1383/3600 2978/1353/3570 2980/1355/3572 3011/1386/3603 +f 3012/1387/3604 3009/1384/3601 2983/1358/3575 2989/1364/3581 +f 3010/1385/3602 2998/1373/3590 2997/1372/3589 3013/1388/3605 +f 2968/1343/3560 2972/1347/3564 2990/1366/3582 2985/1361/3577 +f 3011/1386/3603 2980/1355/3572 2982/1357/3574 3014/1389/3606 +f 3015/1390/3607 3012/1387/3604 2989/1364/3581 2994/1369/3586 +f 3013/1388/3605 2997/1372/3589 2996/1370/3588 3016/1391/3608 +f 2964/1339/3556 2968/1343/3560 2985/1361/3577 2976/1351/3568 +f 3014/1389/3606 2982/1357/3574 2984/1359/3576 3003/1376/3595 +f 3005/1379/3597 3015/1390/3607 2994/1369/3586 2999/1374/3591 +f 3016/1391/3608 2996/1370/3588 2995/1371/3587 3007/1382/3599 +f 2954/1331/3546 2964/1339/3556 2976/1351/3568 2975/1352/3567 +f 3017/1394/3609 3018/1393/3610 3019/1392/3611 3020/1395/3612 +f 3020/1395/3612 3019/1392/3611 3021/1396/3613 3022/1397/3614 +f 3022/1397/3614 3021/1396/3613 3023/1398/3615 3024/1399/3616 +f 3024/1399/3616 3023/1398/3615 3025/1400/3617 3026/1401/3618 +f 3018/1393/3610 3027/1403/3619 3028/1402/3620 3019/1392/3611 +f 3019/1392/3611 3028/1402/3620 3029/1404/3621 3021/1396/3613 +f 3021/1396/3613 3029/1404/3621 3030/1405/3622 3023/1398/3615 +f 3023/1398/3615 3030/1405/3622 3031/1406/3623 3025/1400/3617 +f 3027/1403/3619 3032/1408/3624 3033/1407/3625 3028/1402/3620 +f 3028/1402/3620 3033/1407/3625 3034/1409/3626 3029/1404/3621 +f 3029/1404/3621 3034/1409/3626 3035/1410/3627 3030/1405/3622 +f 3030/1405/3622 3035/1410/3627 3036/1411/3628 3031/1406/3623 +f 3032/1408/3624 3037/1413/3629 3038/1412/3630 3033/1407/3625 +f 3033/1407/3625 3038/1412/3630 3039/1414/3631 3034/1409/3626 +f 3034/1409/3626 3039/1414/3631 3040/1415/3632 3035/1410/3627 +f 3035/1410/3627 3040/1415/3632 3041/1416/3633 3036/1411/3628 +f 3002/1377/3594 3001/1378/3593 3017/1394/3609 3042/1417/3634 +f 3043/1420/3635 3044/1419/3636 3045/1418/3637 3026/1401/3618 +f 3046/1422/3638 3047/1421/3639 3041/1416/3633 3048/1423/3640 +f 3005/1379/3597 3004/1380/3596 3049/1424/3641 3037/1413/3629 +f 3042/1417/3634 3017/1394/3609 3020/1395/3612 3050/1425/3642 +f 3051/1426/3643 3043/1420/3635 3026/1401/3618 3025/1400/3617 +f 3048/1423/3640 3041/1416/3633 3040/1415/3632 3052/1427/3644 +f 3015/1390/3607 3005/1379/3597 3037/1413/3629 3032/1408/3624 +f 3050/1425/3642 3020/1395/3612 3022/1397/3614 3053/1428/3645 +f 3054/1429/3646 3051/1426/3643 3025/1400/3617 3031/1406/3623 +f 3052/1427/3644 3040/1415/3632 3039/1414/3631 3055/1430/3647 +f 3012/1387/3604 3015/1390/3607 3032/1408/3624 3027/1403/3619 +f 3053/1428/3645 3022/1397/3614 3024/1399/3616 3056/1431/3648 +f 3057/1432/3649 3054/1429/3646 3031/1406/3623 3036/1411/3628 +f 3055/1430/3647 3039/1414/3631 3038/1412/3630 3058/1433/3650 +f 3009/1384/3601 3012/1387/3604 3027/1403/3619 3018/1393/3610 +f 3056/1431/3648 3024/1399/3616 3026/1401/3618 3045/1418/3637 +f 3047/1421/3639 3057/1432/3649 3036/1411/3628 3041/1416/3633 +f 3058/1433/3650 3038/1412/3630 3037/1413/3629 3049/1424/3641 +f 3001/1378/3593 3009/1384/3601 3018/1393/3610 3017/1394/3609 +f 3059/1436/3651 3060/1435/3652 3061/1434/3653 3062/1437/3654 +f 3062/1437/3654 3061/1434/3653 3063/1438/3655 3064/1439/3656 +f 3064/1439/3656 3063/1438/3655 3065/1440/3657 3066/1441/3658 +f 3066/1441/3658 3065/1440/3657 3067/1442/3659 3068/1443/3660 +f 3060/1435/3652 3069/1445/3661 3070/1444/3662 3061/1434/3653 +f 3061/1434/3653 3070/1444/3662 3071/1446/3663 3063/1438/3655 +f 3063/1438/3655 3071/1446/3663 3072/1447/3664 3065/1440/3657 +f 3065/1440/3657 3072/1447/3664 3073/1448/3665 3067/1442/3659 +f 3069/1445/3661 3074/1450/3666 3075/1449/3667 3070/1444/3662 +f 3070/1444/3662 3075/1449/3667 3076/1451/3668 3071/1446/3663 +f 3071/1446/3663 3076/1451/3668 3077/1452/3669 3072/1447/3664 +f 3072/1447/3664 3077/1452/3669 3078/1453/3670 3073/1448/3665 +f 3074/1450/3666 3079/1455/3671 3080/1454/3672 3075/1449/3667 +f 3075/1449/3667 3080/1454/3672 3081/1456/3673 3076/1451/3668 +f 3076/1451/3668 3081/1456/3673 3082/1457/3674 3077/1452/3669 +f 3077/1452/3669 3082/1457/3674 3083/1458/3675 3078/1453/3670 +f 3044/1419/3636 3043/1420/3635 3059/1436/3651 3084/1459/3676 +f 3085/1462/3677 3086/1461/3678 3087/1460/3679 3068/1443/3660 +f 3088/1464/3680 3089/1463/3681 3083/1458/3675 3090/1465/3682 +f 3047/1421/3639 3046/1422/3638 3091/1466/3683 3079/1455/3671 +f 3084/1459/3676 3059/1436/3651 3062/1437/3654 3092/1467/3684 +f 3093/1468/3685 3085/1462/3677 3068/1443/3660 3067/1442/3659 +f 3090/1465/3682 3083/1458/3675 3082/1457/3674 3094/1469/3686 +f 3057/1432/3649 3047/1421/3639 3079/1455/3671 3074/1450/3666 +f 3092/1467/3684 3062/1437/3654 3064/1439/3656 3095/1470/3687 +f 3096/1471/3688 3093/1468/3685 3067/1442/3659 3073/1448/3665 +f 3094/1469/3686 3082/1457/3674 3081/1456/3673 3097/1472/3689 +f 3054/1429/3646 3057/1432/3649 3074/1450/3666 3069/1445/3661 +f 3095/1470/3687 3064/1439/3656 3066/1441/3658 3098/1473/3690 +f 3099/1474/3691 3096/1471/3688 3073/1448/3665 3078/1453/3670 +f 3097/1472/3689 3081/1456/3673 3080/1454/3672 3100/1475/3692 +f 3051/1426/3643 3054/1429/3646 3069/1445/3661 3060/1435/3652 +f 3098/1473/3690 3066/1441/3658 3068/1443/3660 3087/1460/3679 +f 3089/1463/3681 3099/1474/3691 3078/1453/3670 3083/1458/3675 +f 3100/1475/3692 3080/1454/3672 3079/1455/3671 3091/1466/3683 +f 3043/1420/3635 3051/1426/3643 3060/1435/3652 3059/1436/3651 +f 3101/1478/3693 3102/1477/3694 3103/1476/3695 3104/1479/3696 +f 3104/1479/3696 3103/1476/3695 3105/1480/3697 3106/1481/3698 +f 3106/1481/3698 3105/1480/3697 3107/1482/3699 3108/1483/3700 +f 3108/1483/3700 3107/1482/3699 3109/1484/3701 3110/1485/3702 +f 3102/1477/3694 3111/1487/3703 3112/1486/3704 3103/1476/3695 +f 3103/1476/3695 3112/1486/3704 3113/1488/3705 3105/1480/3697 +f 3105/1480/3697 3113/1488/3705 3114/1489/3706 3107/1482/3699 +f 3107/1482/3699 3114/1489/3706 3115/1490/3707 3109/1484/3701 +f 3111/1487/3703 3116/1492/3708 3117/1491/3709 3112/1486/3704 +f 3112/1486/3704 3117/1491/3709 3118/1493/3710 3113/1488/3705 +f 3113/1488/3705 3118/1493/3710 3119/1494/3711 3114/1489/3706 +f 3114/1489/3706 3119/1494/3711 3120/1495/3712 3115/1490/3707 +f 3116/1492/3708 3121/1497/3713 3122/1496/3714 3117/1491/3709 +f 3117/1491/3709 3122/1496/3714 3123/1498/3715 3118/1493/3710 +f 3118/1493/3710 3123/1498/3715 3124/1499/3716 3119/1494/3711 +f 3119/1494/3711 3124/1499/3716 3125/1500/3717 3120/1495/3712 +f 3126/1502/3718 3127/1501/3719 3101/1478/3693 3128/1503/3720 +f 3129/1506/3721 3130/1505/3722 3131/1504/3723 3110/1485/3702 +f 2955/1330/3547 3132/1507/3724 3125/1500/3717 2956/1329/3548 +f 3133/1508/3725 2951/1327/3543 2953/1328/3545 3121/1497/3713 +f 3128/1503/3720 3101/1478/3693 3104/1479/3696 3134/1509/3726 +f 3135/1510/3727 3129/1506/3721 3110/1485/3702 3109/1484/3701 +f 2956/1329/3548 3125/1500/3717 3124/1499/3716 2971/1346/3563 +f 3136/1511/3728 3133/1508/3725 3121/1497/3713 3116/1492/3708 +f 3134/1509/3726 3104/1479/3696 3106/1481/3698 3137/1512/3729 +f 3138/1513/3730 3135/1510/3727 3109/1484/3701 3115/1490/3707 +f 2971/1346/3563 3124/1499/3716 3123/1498/3715 2967/1342/3559 +f 3139/1514/3731 3136/1511/3728 3116/1492/3708 3111/1487/3703 +f 3137/1512/3729 3106/1481/3698 3108/1483/3700 3140/1515/3732 +f 3141/1516/3733 3138/1513/3730 3115/1490/3707 3120/1495/3712 +f 2967/1342/3559 3123/1498/3715 3122/1496/3714 2963/1338/3555 +f 3142/1517/3734 3139/1514/3731 3111/1487/3703 3102/1477/3694 +f 3140/1515/3732 3108/1483/3700 3110/1485/3702 3131/1504/3723 +f 3132/1507/3724 3141/1516/3733 3120/1495/3712 3125/1500/3717 +f 2963/1338/3555 3122/1496/3714 3121/1497/3713 2953/1328/3545 +f 3127/1501/3719 3142/1517/3734 3102/1477/3694 3101/1478/3693 +f 3143/1520/3735 3144/1519/3736 3145/1518/3737 3146/1521/3738 +f 3146/1521/3738 3145/1518/3737 3147/1522/3739 3148/1523/3740 +f 3148/1523/3740 3147/1522/3739 3149/1524/3741 3150/1525/3742 +f 3150/1525/3742 3149/1524/3741 3151/1526/3743 3152/1527/3744 +f 3144/1519/3736 3153/1529/3745 3154/1528/3746 3145/1518/3737 +f 3145/1518/3737 3154/1528/3746 3155/1530/3747 3147/1522/3739 +f 3147/1522/3739 3155/1530/3747 3156/1531/3748 3149/1524/3741 +f 3149/1524/3741 3156/1531/3748 3157/1532/3749 3151/1526/3743 +f 3153/1529/3745 3158/1534/3750 3159/1533/3751 3154/1528/3746 +f 3154/1528/3746 3159/1533/3751 3160/1535/3752 3155/1530/3747 +f 3155/1530/3747 3160/1535/3752 3161/1536/3753 3156/1531/3748 +f 3156/1531/3748 3161/1536/3753 3162/1537/3754 3157/1532/3749 +f 3158/1534/3750 3163/1539/3755 3164/1538/3756 3159/1533/3751 +f 3159/1533/3751 3164/1538/3756 3165/1540/3757 3160/1535/3752 +f 3160/1535/3752 3165/1540/3757 3166/1541/3758 3161/1536/3753 +f 3161/1536/3753 3166/1541/3758 3167/1542/3759 3162/1537/3754 +f 3130/1505/3722 3129/1506/3721 3143/1520/3735 3168/1543/3760 +f 3169/1546/3761 3170/1545/3762 3171/1544/3763 3152/1527/3744 +f 3002/1377/3594 3172/1547/3764 3167/1542/3759 3003/1376/3595 +f 3132/1507/3724 2955/1330/3547 3000/1375/3592 3163/1539/3755 +f 3168/1543/3760 3143/1520/3735 3146/1521/3738 3173/1548/3765 +f 3174/1549/3766 3169/1546/3761 3152/1527/3744 3151/1526/3743 +f 3003/1376/3595 3167/1542/3759 3166/1541/3758 3014/1389/3606 +f 3141/1516/3733 3132/1507/3724 3163/1539/3755 3158/1534/3750 +f 3173/1548/3765 3146/1521/3738 3148/1523/3740 3175/1550/3767 +f 3176/1551/3768 3174/1549/3766 3151/1526/3743 3157/1532/3749 +f 3014/1389/3606 3166/1541/3758 3165/1540/3757 3011/1386/3603 +f 3138/1513/3730 3141/1516/3733 3158/1534/3750 3153/1529/3745 +f 3175/1550/3767 3148/1523/3740 3150/1525/3742 3177/1552/3769 +f 3178/1553/3770 3176/1551/3768 3157/1532/3749 3162/1537/3754 +f 3011/1386/3603 3165/1540/3757 3164/1538/3756 3008/1383/3600 +f 3135/1510/3727 3138/1513/3730 3153/1529/3745 3144/1519/3736 +f 3177/1552/3769 3150/1525/3742 3152/1527/3744 3171/1544/3763 +f 3172/1547/3764 3178/1553/3770 3162/1537/3754 3167/1542/3759 +f 3008/1383/3600 3164/1538/3756 3163/1539/3755 3000/1375/3592 +f 3129/1506/3721 3135/1510/3727 3144/1519/3736 3143/1520/3735 +f 3179/1556/3771 3180/1555/3772 3181/1554/3773 3182/1557/3774 +f 3182/1557/3774 3181/1554/3773 3183/1558/3775 3184/1559/3776 +f 3184/1559/3776 3183/1558/3775 3185/1560/3777 3186/1561/3778 +f 3186/1561/3778 3185/1560/3777 3187/1562/3779 3188/1563/3780 +f 3180/1555/3772 3189/1565/3781 3190/1564/3782 3181/1554/3773 +f 3181/1554/3773 3190/1564/3782 3191/1566/3783 3183/1558/3775 +f 3183/1558/3775 3191/1566/3783 3192/1567/3784 3185/1560/3777 +f 3185/1560/3777 3192/1567/3784 3193/1568/3785 3187/1562/3779 +f 3189/1565/3781 3194/1570/3786 3195/1569/3787 3190/1564/3782 +f 3190/1564/3782 3195/1569/3787 3196/1571/3788 3191/1566/3783 +f 3191/1566/3783 3196/1571/3788 3197/1572/3789 3192/1567/3784 +f 3192/1567/3784 3197/1572/3789 3198/1573/3790 3193/1568/3785 +f 3194/1570/3786 3199/1575/3791 3200/1574/3792 3195/1569/3787 +f 3195/1569/3787 3200/1574/3792 3201/1576/3793 3196/1571/3788 +f 3196/1571/3788 3201/1576/3793 3202/1577/3794 3197/1572/3789 +f 3197/1572/3789 3202/1577/3794 3203/1578/3795 3198/1573/3790 +f 3170/1545/3762 3169/1546/3761 3179/1556/3771 3204/1579/3796 +f 3205/1582/3797 3206/1581/3798 3207/1580/3799 3188/1563/3780 +f 3044/1419/3636 3208/1583/3800 3203/1578/3795 3045/1418/3637 +f 3172/1547/3764 3002/1377/3594 3042/1417/3634 3199/1575/3791 +f 3204/1579/3796 3179/1556/3771 3182/1557/3774 3209/1584/3801 +f 3210/1585/3802 3205/1582/3797 3188/1563/3780 3187/1562/3779 +f 3045/1418/3637 3203/1578/3795 3202/1577/3794 3056/1431/3648 +f 3178/1553/3770 3172/1547/3764 3199/1575/3791 3194/1570/3786 +f 3209/1584/3801 3182/1557/3774 3184/1559/3776 3211/1586/3803 +f 3212/1587/3804 3210/1585/3802 3187/1562/3779 3193/1568/3785 +f 3056/1431/3648 3202/1577/3794 3201/1576/3793 3053/1428/3645 +f 3176/1551/3768 3178/1553/3770 3194/1570/3786 3189/1565/3781 +f 3211/1586/3803 3184/1559/3776 3186/1561/3778 3213/1588/3805 +f 3214/1589/3806 3212/1587/3804 3193/1568/3785 3198/1573/3790 +f 3053/1428/3645 3201/1576/3793 3200/1574/3792 3050/1425/3642 +f 3174/1549/3766 3176/1551/3768 3189/1565/3781 3180/1555/3772 +f 3213/1588/3805 3186/1561/3778 3188/1563/3780 3207/1580/3799 +f 3208/1583/3800 3214/1589/3806 3198/1573/3790 3203/1578/3795 +f 3050/1425/3642 3200/1574/3792 3199/1575/3791 3042/1417/3634 +f 3169/1546/3761 3174/1549/3766 3180/1555/3772 3179/1556/3771 +f 3215/1592/3807 3216/1591/3808 3217/1590/3809 3218/1593/3810 +f 3218/1593/3810 3217/1590/3809 3219/1594/3811 3220/1595/3812 +f 3220/1595/3812 3219/1594/3811 3221/1596/3813 3222/1597/3814 +f 3222/1597/3814 3221/1596/3813 3223/1598/3815 3224/1599/3816 +f 3216/1591/3808 3225/1601/3817 3226/1600/3818 3217/1590/3809 +f 3217/1590/3809 3226/1600/3818 3227/1602/3819 3219/1594/3811 +f 3219/1594/3811 3227/1602/3819 3228/1603/3820 3221/1596/3813 +f 3221/1596/3813 3228/1603/3820 3229/1604/3821 3223/1598/3815 +f 3225/1601/3817 3230/1606/3822 3231/1605/3823 3226/1600/3818 +f 3226/1600/3818 3231/1605/3823 3232/1607/3824 3227/1602/3819 +f 3227/1602/3819 3232/1607/3824 3233/1608/3825 3228/1603/3820 +f 3228/1603/3820 3233/1608/3825 3234/1609/3826 3229/1604/3821 +f 3230/1606/3822 3235/1611/3827 3236/1610/3828 3231/1605/3823 +f 3231/1605/3823 3236/1610/3828 3237/1612/3829 3232/1607/3824 +f 3232/1607/3824 3237/1612/3829 3238/1613/3830 3233/1608/3825 +f 3233/1608/3825 3238/1613/3830 3239/1614/3831 3234/1609/3826 +f 3206/1581/3798 3205/1582/3797 3215/1592/3807 3240/1615/3832 +f 3241/1618/3833 3242/1617/3834 3243/1616/3835 3224/1599/3816 +f 3086/1461/3678 3244/1619/3836 3239/1614/3831 3087/1460/3679 +f 3208/1583/3800 3044/1419/3636 3084/1459/3676 3235/1611/3827 +f 3240/1615/3832 3215/1592/3807 3218/1593/3810 3245/1620/3837 +f 3246/1621/3838 3241/1618/3833 3224/1599/3816 3223/1598/3815 +f 3087/1460/3679 3239/1614/3831 3238/1613/3830 3098/1473/3690 +f 3214/1589/3806 3208/1583/3800 3235/1611/3827 3230/1606/3822 +f 3245/1620/3837 3218/1593/3810 3220/1595/3812 3247/1622/3839 +f 3248/1623/3840 3246/1621/3838 3223/1598/3815 3229/1604/3821 +f 3098/1473/3690 3238/1613/3830 3237/1612/3829 3095/1470/3687 +f 3212/1587/3804 3214/1589/3806 3230/1606/3822 3225/1601/3817 +f 3247/1622/3839 3220/1595/3812 3222/1597/3814 3249/1624/3841 +f 3250/1625/3842 3248/1623/3840 3229/1604/3821 3234/1609/3826 +f 3095/1470/3687 3237/1612/3829 3236/1610/3828 3092/1467/3684 +f 3210/1585/3802 3212/1587/3804 3225/1601/3817 3216/1591/3808 +f 3249/1624/3841 3222/1597/3814 3224/1599/3816 3243/1616/3835 +f 3244/1619/3836 3250/1625/3842 3234/1609/3826 3239/1614/3831 +f 3092/1467/3684 3236/1610/3828 3235/1611/3827 3084/1459/3676 +f 3205/1582/3797 3210/1585/3802 3216/1591/3808 3215/1592/3807 +s 2 +f 2952/1326/3843 2951/1327/3844 2627/1327/3845 2626/1326/3846 +s 4 +f 2957/1333/3847 2959/1334/3848 2634/1334/3849 2633/1333/3850 +f 2962/1335/3851 2961/1336/3852 2636/1336/3853 2635/1335/3854 +s 2 +f 2961/1336/3855 2960/1337/3856 2637/1337/3857 2636/1336/3858 +s 4 +f 2959/1334/3848 2965/1340/3859 2640/1340/3860 2634/1334/3849 +s 2 +f 2960/1337/3856 2966/1341/3861 2641/1341/3862 2637/1337/3857 +s 4 +f 2965/1340/3859 2969/1344/3863 2644/1344/3864 2640/1340/3860 +s 2 +f 2966/1341/3861 2970/1345/3865 2645/1345/3866 2641/1341/3862 +s 4 +f 2969/1344/3863 2973/1348/3867 2648/1348/3868 2644/1344/3864 +s 2 +f 2970/1345/3865 2974/1349/3869 2649/1349/3870 2645/1345/3866 +s 4 +f 2973/1348/3867 2962/1335/3851 2635/1335/3854 2648/1348/3868 +s 2 +f 2974/1349/3869 2952/1326/3843 2626/1326/3846 2649/1349/3870 +s 4 +f 3004/1380/3871 3006/1381/3872 2681/1381/3873 2680/1380/3874 +f 3007/1382/3875 2957/1333/3847 2633/1333/3850 2682/1382/3876 +f 3006/1381/3872 3010/1385/3877 2685/1385/3878 2681/1381/3873 +f 3010/1385/3877 3013/1388/3879 2688/1388/3880 2685/1385/3878 +f 3013/1388/3879 3016/1391/3881 2691/1391/3882 2688/1388/3880 +f 3016/1391/3881 3007/1382/3875 2682/1382/3876 2691/1391/3882 +f 3046/1422/3883 3048/1423/3884 2723/1423/3885 2722/1422/3886 +f 3049/1424/3887 3004/1380/3871 2680/1380/3874 2724/1424/3888 +f 3048/1423/3884 3052/1427/3889 2727/1427/3890 2723/1423/3885 +f 3052/1427/3889 3055/1430/3891 2730/1430/3892 2727/1427/3890 +f 3055/1430/3891 3058/1433/3893 2733/1433/3894 2730/1430/3892 +f 3058/1433/3893 3049/1424/3887 2724/1424/3888 2733/1433/3894 +f 3086/1461/3895 3085/1462/3896 2762/1462/3897 2761/1461/3898 +f 3088/1464/3899 3090/1465/3900 2765/1465/3901 2764/1464/3902 +f 3089/1463/3903 3088/1464/3899 2764/1464/3902 2763/1463/3904 +f 3091/1466/3905 3046/1422/3883 2722/1422/3886 2766/1466/3906 +f 3085/1462/3896 3093/1468/3907 2768/1468/3908 2762/1462/3897 +f 3090/1465/3900 3094/1469/3909 2769/1469/3910 2765/1465/3901 +f 3093/1468/3907 3096/1471/3911 2771/1471/3912 2768/1468/3908 +f 3094/1469/3909 3097/1472/3913 2772/1472/3914 2769/1469/3910 +f 3096/1471/3911 3099/1474/3915 2774/1474/3916 2771/1471/3912 +f 3097/1472/3913 3100/1475/3917 2775/1475/3918 2772/1472/3914 +f 3099/1474/3915 3089/1463/3903 2763/1463/3904 2774/1474/3916 +f 3100/1475/3917 3091/1466/3905 2766/1466/3906 2775/1475/3918 +f 3126/1502/3919 3128/1503/3920 2803/1503/3921 2802/1502/3922 +s 2 +f 3127/1501/3923 3126/1502/3924 2802/1502/3925 2801/1501/3926 +s 4 +f 3131/1504/3927 3130/1505/3928 2805/1505/3929 2804/1504/3930 +s 2 +f 2951/1327/3844 3133/1508/3931 2808/1508/3932 2627/1327/3845 +s 4 +f 3128/1503/3920 3134/1509/3933 2809/1509/3934 2803/1503/3921 +s 2 +f 3133/1508/3931 3136/1511/3935 2811/1511/3936 2808/1508/3932 +s 4 +f 3134/1509/3933 3137/1512/3937 2812/1512/3938 2809/1509/3934 +s 2 +f 3136/1511/3935 3139/1514/3939 2814/1514/3940 2811/1511/3936 +s 4 +f 3137/1512/3937 3140/1515/3941 2815/1515/3942 2812/1512/3938 +s 2 +f 3139/1514/3939 3142/1517/3943 2817/1517/3944 2814/1514/3940 +s 4 +f 3140/1515/3941 3131/1504/3927 2804/1504/3930 2815/1515/3942 +s 2 +f 3142/1517/3943 3127/1501/3923 2801/1501/3926 2817/1517/3944 +s 4 +f 3130/1505/3928 3168/1543/3945 2843/1543/3946 2805/1505/3929 +f 3171/1544/3947 3170/1545/3948 2845/1545/3949 2844/1544/3950 +f 3168/1543/3945 3173/1548/3951 2848/1548/3952 2843/1543/3946 +f 3173/1548/3951 3175/1550/3953 2850/1550/3954 2848/1548/3952 +f 3175/1550/3953 3177/1552/3955 2852/1552/3956 2850/1550/3954 +f 3177/1552/3955 3171/1544/3947 2844/1544/3950 2852/1552/3956 +f 3170/1545/3948 3204/1579/3957 2879/1579/3958 2845/1545/3949 +f 3207/1580/3959 3206/1581/3960 2881/1581/3961 2880/1580/3962 +f 3204/1579/3957 3209/1584/3963 2884/1584/3964 2879/1579/3958 +f 3209/1584/3963 3211/1586/3965 2886/1586/3966 2884/1584/3964 +f 3211/1586/3965 3213/1588/3967 2888/1588/3968 2886/1586/3966 +f 3213/1588/3967 3207/1580/3959 2880/1580/3962 2888/1588/3968 +f 3206/1581/3960 3240/1615/3969 2915/1615/3970 2881/1581/3961 +f 3243/1616/3971 3242/1617/3972 2917/1617/3973 2916/1616/3974 +f 3242/1617/3972 3241/1618/3975 2918/1618/3976 2917/1617/3973 +f 3244/1619/3977 3086/1461/3895 2761/1461/3898 2919/1619/3978 +f 3240/1615/3969 3245/1620/3979 2920/1620/3980 2915/1615/3970 +f 3241/1618/3975 3246/1621/3981 2921/1621/3982 2918/1618/3976 +f 3245/1620/3979 3247/1622/3983 2922/1622/3984 2920/1620/3980 +f 3246/1621/3981 3248/1623/3985 2923/1623/3986 2921/1621/3982 +f 3247/1622/3983 3249/1624/3987 2924/1624/3988 2922/1622/3984 +f 3248/1623/3985 3250/1625/3989 2925/1625/3990 2923/1623/3986 +f 3249/1624/3987 3243/1616/3971 2916/1616/3974 2924/1624/3988 +f 3250/1625/3989 3244/1619/3977 2919/1619/3978 2925/1625/3990 +# 648 polygons + +# +# object lotu_petal_05 +# + +v -0.1244 0.2591 0.2403 +v -0.0611 0.2554 0.1974 +v -0.0653 0.2491 0.1253 +v -0.1321 0.2528 0.1562 +v -0.1974 0.2580 0.2733 +v -0.2071 0.2568 0.1775 +v -0.2844 0.2545 0.3082 +v -0.2931 0.2596 0.2059 +v -0.3770 0.2469 0.3428 +v -0.3868 0.2516 0.2309 +v -0.1209 0.2790 0.3262 +v -0.0561 0.2782 0.2707 +v -0.1895 0.2754 0.3697 +v -0.2714 0.2718 0.4096 +v -0.3650 0.2826 0.4521 +v -0.1107 0.3126 0.4105 +v -0.0534 0.3060 0.3437 +v -0.1877 0.3105 0.4624 +v -0.2795 0.3120 0.5125 +v -0.3764 0.3240 0.5603 +v -0.1217 0.3516 0.4938 +v -0.0519 0.3429 0.4161 +v -0.1998 0.3562 0.5566 +v -0.2841 0.3623 0.6136 +v -0.3670 0.3700 0.6714 +v -0.0066 0.2488 0.0943 +v -0.0169 0.2411 0.0356 +v -0.0749 0.2393 0.0579 +v -0.3953 0.2671 0.1173 +v -0.4974 0.2696 0.1304 +v -0.4874 0.2622 0.2505 +v -0.4575 0.3756 0.7236 +v -0.4212 0.4242 0.8347 +v -0.3328 0.4092 0.7834 +v -0.0564 0.3881 0.4827 +v 0.0018 0.3870 0.3946 +v -0.0042 0.3432 0.3309 +v -0.1419 0.2456 0.0770 +v -0.4766 0.2718 0.3708 +v -0.2621 0.4071 0.7178 +v -0.0027 0.3049 0.2707 +v -0.2173 0.2481 0.0858 +v -0.4739 0.2971 0.4910 +v -0.1938 0.3974 0.6493 +v -0.0025 0.2774 0.2134 +v -0.3009 0.2590 0.1027 +v -0.4829 0.3395 0.6111 +v -0.1278 0.3957 0.5690 +v -0.0032 0.2556 0.1536 +v -0.7035 0.3261 0.4572 +v -0.5851 0.2974 0.4076 +v -0.5992 0.2771 0.2839 +v -0.7167 0.2979 0.3251 +v -0.8279 0.3418 0.4702 +v -0.8416 0.3187 0.3353 +v -0.9638 0.3619 0.4734 +v -0.9769 0.3492 0.3326 +v -1.1109 0.4047 0.4681 +v -1.1200 0.3865 0.3251 +v -0.7092 0.3539 0.5856 +v -0.5903 0.3253 0.5319 +v -0.8363 0.3771 0.6087 +v -0.9699 0.4000 0.6132 +v -1.1098 0.4471 0.6100 +v -0.6963 0.3690 0.7116 +v -0.5872 0.3580 0.6521 +v -0.8126 0.3919 0.7471 +v -0.9334 0.4297 0.7518 +v -1.0713 0.4901 0.7488 +v -0.6548 0.3961 0.8309 +v -0.5523 0.3855 0.7727 +v -0.7703 0.4093 0.8759 +v -0.8944 0.4588 0.8882 +v -1.0283 0.5241 0.8868 +v -0.6074 0.2798 0.1629 +v -1.1383 0.3878 0.1829 +v -1.2955 0.4537 0.1869 +v -1.2816 0.4624 0.3280 +v -1.1775 0.6038 0.8962 +v -1.1418 0.6371 1.0375 +v -0.9878 0.5543 1.0268 +v -0.5153 0.4362 0.8912 +v -0.7262 0.2881 0.1962 +v -1.2673 0.4858 0.4663 +v -0.8490 0.4916 1.0168 +v -0.8544 0.3018 0.2018 +v -1.2604 0.5261 0.6082 +v -0.7223 0.4499 0.9979 +v -0.9908 0.3402 0.1923 +v -1.2195 0.5631 0.7507 +v -0.6119 0.4403 0.9453 +v -1.6283 0.6772 0.4980 +v -1.4377 0.5760 0.4758 +v -1.4627 0.5519 0.3356 +v -1.6540 0.6354 0.3610 +v -1.8332 0.7957 0.5178 +v -1.8628 0.7696 0.3897 +v -2.0374 0.9300 0.5197 +v -2.0611 0.9176 0.3977 +v -2.2111 1.0674 0.5284 +v -2.2356 1.0666 0.4139 +v -1.6043 0.7112 0.6328 +v -1.4244 0.6094 0.6167 +v -1.8083 0.8383 0.6478 +v -2.0108 0.9541 0.6476 +v -2.1929 1.0839 0.6474 +v -1.5872 0.7574 0.7700 +v -1.3890 0.6482 0.7564 +v -1.7908 0.8883 0.7813 +v -1.9882 1.0032 0.7744 +v -2.1765 1.1216 0.7633 +v -1.5601 0.7955 0.9000 +v -1.3567 0.6943 0.8956 +v -1.7736 0.9239 0.9108 +v -1.9600 1.0597 0.9028 +v -2.1350 1.1604 0.8785 +v -1.4732 0.5279 0.1987 +v -2.2515 1.0587 0.3039 +v -2.3714 1.1950 0.3308 +v -2.3658 1.1878 0.4316 +v -2.2732 1.2651 0.8374 +v -2.2323 1.3134 0.9427 +v -2.0855 1.2178 0.9890 +v -1.3150 0.7286 1.0302 +v -1.6689 0.6262 0.2272 +v -2.3516 1.1908 0.5333 +v -1.9236 1.1032 1.0212 +v -1.8790 0.7478 0.2641 +v -2.3356 1.2000 0.6364 +v -1.7380 0.9597 1.0417 +v -2.0924 0.9020 0.2809 +v -2.3192 1.2231 0.7367 +v -1.5272 0.8354 1.0311 +v -2.5343 1.4595 0.5090 +v -2.4561 1.3212 0.5152 +v -2.4699 1.3211 0.4291 +v -2.5448 1.4641 0.4333 +v -2.6005 1.5946 0.4872 +v -2.6105 1.6007 0.4195 +v -2.6641 1.7225 0.4534 +v -2.6738 1.7241 0.3979 +v -2.7285 1.8348 0.4307 +v -2.7380 1.8414 0.3934 +v -2.5220 1.4573 0.5833 +v -2.4484 1.3204 0.5977 +v -2.5912 1.5869 0.5560 +v -2.6495 1.7069 0.5116 +v -2.7121 1.8272 0.4737 +v -2.5051 1.4578 0.6603 +v -2.4274 1.3341 0.6874 +v -2.5735 1.5811 0.6248 +v -2.6322 1.7012 0.5699 +v -2.6970 1.8106 0.5161 +v -2.4784 1.4704 0.7325 +v -2.3936 1.3583 0.7806 +v -2.5520 1.5790 0.6903 +v -2.6182 1.6911 0.6226 +v -2.6795 1.7952 0.5515 +v -2.4804 1.3336 0.3370 +v -2.7405 1.8472 0.3648 +v -2.7753 1.9538 0.3751 +v -2.7737 1.9491 0.3943 +v -2.7410 1.9022 0.4730 +v -2.7289 1.8799 0.4863 +v -2.6636 1.7831 0.5803 +v -2.3522 1.3984 0.8784 +v -2.5622 1.4693 0.3547 +v -2.7680 1.9417 0.4136 +v -2.6010 1.6804 0.6721 +v -2.6235 1.6033 0.3559 +v -2.7617 1.9319 0.4335 +v -2.5243 1.5915 0.7492 +v -2.6786 1.7299 0.3520 +v -2.7523 1.9173 0.4541 +v -2.4437 1.4937 0.8096 +v -0.1654 0.3043 -0.2832 +v -0.0920 0.2912 -0.2441 +v -0.1071 0.3424 -0.3213 +v -0.1755 0.3526 -0.3746 +v -0.2425 0.3223 -0.3107 +v -0.2585 0.3692 -0.4086 +v -0.3297 0.3367 -0.3321 +v -0.3513 0.3833 -0.4423 +v -0.4254 0.3558 -0.3461 +v -0.4505 0.3839 -0.4641 +v -0.1516 0.2624 -0.1876 +v -0.0808 0.2592 -0.1630 +v -0.2284 0.2782 -0.2106 +v -0.3154 0.2958 -0.2229 +v -0.4113 0.3193 -0.2290 +v -0.1422 0.2498 -0.0921 +v -0.0750 0.2457 -0.0841 +v -0.2199 0.2601 -0.1078 +v -0.3064 0.2726 -0.1123 +v -0.4008 0.2842 -0.1125 +v -0.1473 0.2386 -0.0035 +v -0.0786 0.2406 -0.0100 +v -0.2252 0.2453 -0.0079 +v -0.3121 0.2574 -0.0036 +v -0.4078 0.2682 0.0029 +v -0.0390 0.3289 -0.2654 +v -0.0499 0.3871 -0.3314 +v -0.1157 0.3975 -0.3927 +v -0.4644 0.4116 -0.5917 +v -0.5671 0.4244 -0.6137 +v -0.5564 0.3833 -0.4848 +v -0.5118 0.2769 0.0092 +v -0.0185 0.2429 -0.0233 +v -0.1944 0.4089 -0.4561 +v -0.5294 0.3618 -0.3583 +v -0.0159 0.2475 -0.0833 +v -0.2834 0.4129 -0.5080 +v -0.5159 0.3352 -0.2345 +v -0.0170 0.2598 -0.1438 +v -0.3707 0.4149 -0.5527 +v -0.5037 0.2998 -0.1131 +v -0.0266 0.2870 -0.2050 +v -0.7583 0.3739 -0.3540 +v -0.6420 0.3671 -0.3472 +v -0.6712 0.3982 -0.4818 +v -0.7868 0.4107 -0.4970 +v -0.8829 0.3899 -0.3739 +v -0.9058 0.4287 -0.5195 +v -1.0166 0.4285 -0.3917 +v -1.0364 0.4684 -0.5392 +v -1.1616 0.4743 -0.3975 +v -1.1780 0.5188 -0.5397 +v -0.7434 0.3452 -0.2111 +v -0.6257 0.3388 -0.2159 +v -0.8675 0.3561 -0.2233 +v -1.0047 0.3775 -0.2445 +v -1.1530 0.4209 -0.2536 +v -0.7319 0.3056 -0.0705 +v -0.6140 0.3081 -0.0852 +v -0.8548 0.3251 -0.0760 +v -0.9944 0.3557 -0.0985 +v -1.1447 0.4028 -0.1075 +v -0.7392 0.2910 0.0662 +v -0.6222 0.2855 0.0411 +v -0.8645 0.3133 0.0667 +v -1.0016 0.3445 0.0490 +v -1.1470 0.3992 0.0386 +v -0.6693 0.4391 -0.6178 +v -1.1677 0.5583 -0.6807 +v -1.3275 0.6165 -0.6650 +v -1.3336 0.5737 -0.5179 +v -1.3090 0.4528 0.0459 +v -0.7784 0.4578 -0.6447 +v -1.3143 0.5380 -0.3715 +v -0.8972 0.4752 -0.6647 +v -1.3128 0.4863 -0.2337 +v -1.0272 0.5082 -0.6858 +v -1.3082 0.4685 -0.0954 +v -1.6898 0.7148 -0.3067 +v -1.4950 0.6145 -0.3485 +v -1.5026 0.6616 -0.4902 +v -1.6885 0.7512 -0.4395 +v -1.8856 0.8222 -0.2528 +v -1.8877 0.8731 -0.3750 +v -2.0770 0.9530 -0.2015 +v -2.0672 0.9994 -0.3182 +v -2.2329 1.0902 -0.1322 +v -2.2219 1.1262 -0.2394 +v -1.6967 0.6659 -0.1720 +v -1.4914 0.5809 -0.2120 +v -1.8954 0.7792 -0.1240 +v -2.0806 0.9058 -0.0805 +v -2.2477 1.0694 -0.0242 +v -1.6878 0.6403 -0.0371 +v -1.4900 0.5642 -0.0756 +v -1.8840 0.7612 0.0093 +v -2.0842 0.8924 0.0428 +v -2.2501 1.0455 0.0855 +v -1.6775 0.6291 0.0961 +v -1.4848 0.5326 0.0614 +v -1.8912 0.7489 0.1390 +v -2.0900 0.8916 0.1642 +v -2.2461 1.0434 0.1961 +v -1.5007 0.6927 -0.6292 +v -2.2117 1.1682 -0.3499 +v -2.3308 1.2920 -0.2895 +v -2.3500 1.2618 -0.1830 +v -2.3744 1.1900 0.2288 +v -1.6849 0.8030 -0.5668 +v -2.3696 1.2369 -0.0788 +v -1.8791 0.9220 -0.4987 +v -2.3785 1.2102 0.0251 +v -2.0540 1.0373 -0.4304 +v -2.3817 1.1914 0.1270 +v -2.5844 1.4723 0.0335 +v -2.4877 1.3554 -0.0273 +v -2.4675 1.3820 -0.1238 +v -2.5686 1.4913 -0.0485 +v -2.6369 1.6014 0.0889 +v -2.6213 1.6075 0.0202 +v -2.6770 1.7310 0.1431 +v -2.6708 1.7272 0.0897 +v -2.7199 1.8434 0.2137 +v -2.7134 1.8354 0.1743 +v -2.5874 1.4633 0.1151 +v -2.4974 1.3340 0.0641 +v -2.6385 1.6032 0.1582 +v -2.6795 1.7355 0.1993 +v -2.7265 1.8489 0.2566 +v -2.5848 1.4679 0.1956 +v -2.4920 1.3312 0.1530 +v -2.6409 1.6063 0.2268 +v -2.6798 1.7352 0.2554 +v -2.7325 1.8507 0.2986 +v -2.5758 1.4695 0.2753 +v -2.4895 1.3328 0.2435 +v -2.6345 1.6067 0.2933 +v -2.6801 1.7350 0.3076 +v -2.7400 1.8511 0.3360 +v -2.4438 1.4117 -0.2200 +v -2.7044 1.8228 0.1403 +v -2.7567 1.9167 0.2415 +v -2.7604 1.9284 0.2695 +v -2.7754 1.9565 0.3552 +v -2.5402 1.5125 -0.1316 +v -2.7687 1.9405 0.2915 +v -2.6076 1.6113 -0.0443 +v -2.7728 1.9498 0.3131 +v -2.6586 1.7145 0.0417 +v -2.7745 1.9553 0.3345 +v -0.0686 0.2221 0.1273 +v -0.0615 0.2286 0.2027 +v -0.1256 0.2331 0.2446 +v -0.1360 0.2258 0.1576 +v -0.1988 0.2311 0.2791 +v -0.2114 0.2296 0.1828 +v -0.2844 0.2277 0.3154 +v -0.2976 0.2320 0.2119 +v -0.3784 0.2203 0.3459 +v -0.3908 0.2244 0.2338 +v -0.0497 0.2530 0.2785 +v -0.1170 0.2538 0.3348 +v -0.1863 0.2500 0.3777 +v -0.2696 0.2455 0.4169 +v -0.3640 0.2568 0.4575 +v -0.0422 0.2816 0.3528 +v -0.1049 0.2889 0.4205 +v -0.1836 0.2870 0.4735 +v -0.2764 0.2874 0.5197 +v -0.3788 0.2986 0.5679 +v -0.0397 0.3207 0.4234 +v -0.1138 0.3276 0.5050 +v -0.1946 0.3328 0.5671 +v -0.2795 0.3380 0.6219 +v -0.3670 0.3453 0.6785 +v -0.0172 0.2142 0.0350 +v -0.0086 0.2217 0.0969 +v -0.0760 0.2123 0.0564 +v -0.4921 0.2348 0.2530 +v -0.5039 0.2425 0.1308 +v -0.3997 0.2396 0.1177 +v -0.4198 0.3995 0.8468 +v -0.4562 0.3498 0.7334 +v -0.3334 0.3852 0.7927 +v 0.0147 0.3247 0.3419 +v 0.0196 0.3729 0.4026 +v -0.0448 0.3685 0.4913 +v -0.1428 0.2186 0.0766 +v -0.4782 0.2462 0.3741 +v -0.2542 0.3819 0.7268 +v 0.0086 0.2845 0.2825 +v -0.2194 0.2210 0.0887 +v -0.4749 0.2720 0.4959 +v -0.1850 0.3740 0.6603 +v 0.0051 0.2521 0.2210 +v -0.3054 0.2323 0.1052 +v -0.4839 0.3123 0.6168 +v -0.1182 0.3759 0.5783 +v -0.0036 0.2297 0.1581 +v -0.6024 0.2501 0.2854 +v -0.5879 0.2720 0.4107 +v -0.7057 0.2996 0.4608 +v -0.7223 0.2718 0.3270 +v -0.8359 0.3161 0.4785 +v -0.8474 0.2935 0.3384 +v -0.9721 0.3357 0.4791 +v -0.9846 0.3221 0.3343 +v -1.1209 0.3811 0.4696 +v -1.1301 0.3610 0.3258 +v -0.5917 0.2991 0.5350 +v -0.7145 0.3287 0.5929 +v -0.8435 0.3507 0.6152 +v -0.9789 0.3754 0.6206 +v -1.1221 0.4221 0.6146 +v -0.5887 0.3320 0.6615 +v -0.7003 0.3421 0.7207 +v -0.8174 0.3656 0.7541 +v -0.9417 0.4041 0.7599 +v -1.0810 0.4655 0.7571 +v -0.5551 0.3588 0.7816 +v -0.6600 0.3691 0.8426 +v -0.7720 0.3831 0.8883 +v -0.8996 0.4341 0.8963 +v -1.0340 0.5022 0.8966 +v -0.6138 0.2530 0.1626 +v -1.2901 0.4380 0.3278 +v -1.3055 0.4301 0.1859 +v -1.1460 0.3627 0.1827 +v -1.1478 0.6151 1.0448 +v -1.1833 0.5809 0.9012 +v -0.9944 0.5313 1.0358 +v -0.5134 0.4116 0.9011 +v -0.7307 0.2602 0.1967 +v -1.2780 0.4633 0.4708 +v -0.8534 0.4661 1.0287 +v -0.8590 0.2762 0.2032 +v -1.2711 0.5025 0.6107 +v -0.7265 0.4253 1.0113 +v -0.9983 0.3129 0.1912 +v -1.2313 0.5414 0.7541 +v -0.6125 0.4141 0.9579 +v -1.4736 0.5282 0.3363 +v -1.4511 0.5529 0.4751 +v -1.6436 0.6548 0.4986 +v -1.6660 0.6130 0.3608 +v -1.8466 0.7733 0.5210 +v -1.8741 0.7477 0.3884 +v -2.0505 0.9098 0.5238 +v -2.0775 0.8982 0.3995 +v -2.2308 1.0462 0.5294 +v -2.2564 1.0449 0.4116 +v -1.4409 0.5857 0.6196 +v -1.6185 0.6909 0.6381 +v -1.8196 0.8157 0.6524 +v -2.0267 0.9341 0.6517 +v -2.2115 1.0635 0.6504 +v -1.4007 0.6270 0.7626 +v -1.6006 0.7374 0.7760 +v -1.8060 0.8686 0.7872 +v -2.0027 0.9821 0.7803 +v -2.1899 1.1024 0.7721 +v -1.3627 0.6723 0.9024 +v -1.5682 0.7757 0.9096 +v -1.7901 0.9058 0.9195 +v -1.9763 1.0379 0.9103 +v -2.1519 1.1421 0.8854 +v -1.4875 0.5028 0.1953 +v -2.3849 1.1677 0.4344 +v -2.3913 1.1766 0.3303 +v -2.2722 1.0370 0.3019 +v -2.2505 1.2935 0.9549 +v -2.2925 1.2467 0.8488 +v -2.1016 1.1993 1.0018 +v -1.3233 0.7088 1.0418 +v -1.6797 0.6022 0.2264 +v -2.3717 1.1668 0.5387 +v -1.9392 1.0815 1.0307 +v -1.8918 0.7271 0.2630 +v -2.3578 1.1798 0.6440 +v -1.7512 0.9406 1.0512 +v -2.1072 0.8811 0.2797 +v -2.3388 1.2058 0.7475 +v -1.5327 0.8155 1.0403 +v -2.4914 1.3050 0.4343 +v -2.4786 1.3076 0.5258 +v -2.5579 1.4450 0.5192 +v -2.5703 1.4527 0.4401 +v -2.6262 1.5816 0.4918 +v -2.6354 1.5923 0.4218 +v -2.6895 1.7097 0.4553 +v -2.6983 1.7136 0.4001 +v -2.7526 1.8262 0.4368 +v -2.7621 1.8331 0.3980 +v -2.4689 1.3080 0.6117 +v -2.5469 1.4420 0.5959 +v -2.6146 1.5728 0.5644 +v -2.6725 1.6954 0.5174 +v -2.7375 1.8163 0.4787 +v -2.4483 1.3200 0.6961 +v -2.5286 1.4421 0.6706 +v -2.5970 1.5671 0.6342 +v -2.6568 1.6889 0.5775 +v -2.7204 1.8009 0.5206 +v -2.4117 1.3434 0.7907 +v -2.5027 1.4591 0.7483 +v -2.5740 1.5668 0.7025 +v -2.6434 1.6823 0.6327 +v -2.7028 1.7868 0.5607 +v -2.5025 1.3188 0.3400 +v -2.7988 1.9445 0.3961 +v -2.8018 1.9488 0.3750 +v -2.7650 1.8383 0.3663 +v -2.7524 1.8718 0.4963 +v -2.7644 1.8914 0.4773 +v -2.6887 1.7716 0.5915 +v -2.3721 1.3809 0.8884 +v -2.5869 1.4583 0.3582 +v -2.7931 1.9361 0.4166 +v -2.6250 1.6700 0.6787 +v -2.6484 1.5927 0.3556 +v -2.7862 1.9238 0.4366 +v -2.5486 1.5805 0.7640 +v -2.7031 1.7225 0.3526 +v -2.7766 1.9082 0.4569 +v -2.4668 1.4779 0.8238 +v -0.0970 0.3235 -0.3346 +v -0.0868 0.2705 -0.2538 +v -0.1619 0.2810 -0.2908 +v -0.1705 0.3299 -0.3881 +v -0.2410 0.2961 -0.3214 +v -0.2592 0.3454 -0.4216 +v -0.3291 0.3115 -0.3405 +v -0.3507 0.3576 -0.4525 +v -0.4266 0.3293 -0.3550 +v -0.4516 0.3566 -0.4743 +v -0.0785 0.2339 -0.1705 +v -0.1525 0.2366 -0.1928 +v -0.2307 0.2523 -0.2152 +v -0.3190 0.2706 -0.2289 +v -0.4153 0.2937 -0.2349 +v -0.0728 0.2181 -0.0914 +v -0.1403 0.2233 -0.0977 +v -0.2184 0.2333 -0.1084 +v -0.3071 0.2461 -0.1153 +v -0.4046 0.2579 -0.1169 +v -0.0768 0.2137 -0.0149 +v -0.1461 0.2114 -0.0063 +v -0.2248 0.2187 -0.0065 +v -0.3129 0.2303 -0.0032 +v -0.4107 0.2415 0.0001 +v -0.0361 0.3699 -0.3471 +v -0.0307 0.3098 -0.2813 +v -0.1068 0.3767 -0.4076 +v -0.5585 0.3574 -0.4922 +v -0.5670 0.3991 -0.6224 +v -0.4628 0.3856 -0.6003 +v -0.5175 0.2499 0.0072 +v -0.0167 0.2158 -0.0275 +v -0.1909 0.3852 -0.4704 +v -0.5338 0.3353 -0.3654 +v -0.0142 0.2201 -0.0899 +v -0.2764 0.3875 -0.5193 +v -0.5208 0.3091 -0.2429 +v -0.0139 0.2347 -0.1529 +v -0.3673 0.3888 -0.5637 +v -0.5097 0.2735 -0.1191 +v -0.0218 0.2629 -0.2177 +v -0.6705 0.3713 -0.4880 +v -0.6467 0.3416 -0.3546 +v -0.7653 0.3473 -0.3594 +v -0.7905 0.3857 -0.5026 +v -0.8894 0.3630 -0.3772 +v -0.9149 0.4030 -0.5272 +v -1.0242 0.4041 -0.4002 +v -1.0446 0.4446 -0.5460 +v -1.1683 0.4496 -0.4062 +v -1.1867 0.4930 -0.5518 +v -0.6334 0.3109 -0.2194 +v -0.7499 0.3187 -0.2135 +v -0.8751 0.3294 -0.2246 +v -1.0109 0.3515 -0.2517 +v -1.1605 0.3967 -0.2583 +v -0.6204 0.2808 -0.0891 +v -0.7371 0.2786 -0.0725 +v -0.8636 0.2997 -0.0746 +v -0.9983 0.3312 -0.1021 +v -1.1522 0.3770 -0.1112 +v -0.6290 0.2587 0.0393 +v -0.7462 0.2636 0.0649 +v -0.8720 0.2877 0.0677 +v -1.0082 0.3189 0.0462 +v -1.1562 0.3740 0.0366 +v -0.6754 0.4134 -0.6243 +v -1.3426 0.5487 -0.5252 +v -1.3353 0.5920 -0.6733 +v -1.1755 0.5352 -0.6931 +v -1.3172 0.4274 0.0434 +v -0.7855 0.4330 -0.6488 +v -1.3254 0.5145 -0.3829 +v -0.9047 0.4510 -0.6713 +v -1.3220 0.4620 -0.2434 +v -1.0346 0.4843 -0.6938 +v -1.3176 0.4438 -0.1006 +v -1.5141 0.6381 -0.4979 +v -1.5047 0.5936 -0.3579 +v -1.7041 0.6898 -0.3151 +v -1.7028 0.7308 -0.4498 +v -1.8986 0.8028 -0.2626 +v -1.9041 0.8515 -0.3895 +v -2.0923 0.9310 -0.2128 +v -2.0831 0.9805 -0.3295 +v -2.2526 1.0734 -0.1464 +v -2.2404 1.1090 -0.2533 +v -1.5034 0.5570 -0.2208 +v -1.7088 0.6420 -0.1785 +v -1.9125 0.7568 -0.1275 +v -2.0977 0.8864 -0.0890 +v -2.2666 1.0502 -0.0348 +v -1.4983 0.5403 -0.0815 +v -1.7039 0.6152 -0.0418 +v -1.9011 0.7370 0.0076 +v -2.0982 0.8728 0.0378 +v -2.2708 1.0283 0.0800 +v -1.4965 0.5084 0.0569 +v -1.6896 0.6047 0.0925 +v -1.9029 0.7241 0.1383 +v -2.1081 0.8728 0.1616 +v -2.2696 1.0270 0.1930 +v -1.5114 0.6697 -0.6395 +v -2.3711 1.2483 -0.1926 +v -2.3524 1.2789 -0.2996 +v -2.2301 1.1510 -0.3583 +v -2.3948 1.1726 0.2261 +v -1.6994 0.7812 -0.5802 +v -2.3906 1.2230 -0.0856 +v -1.8968 0.9022 -0.5084 +v -2.3982 1.1960 0.0188 +v -2.0731 1.0196 -0.4432 +v -2.4011 1.1747 0.1223 +v -2.4882 1.3670 -0.1274 +v -2.5065 1.3416 -0.0325 +v -2.6067 1.4626 0.0290 +v -2.5912 1.4792 -0.0557 +v -2.6615 1.5961 0.0803 +v -2.6477 1.5984 0.0116 +v -2.7031 1.7271 0.1332 +v -2.6973 1.7213 0.0782 +v -2.7452 1.8358 0.2082 +v -2.7382 1.8289 0.1676 +v -2.5196 1.3189 0.0599 +v -2.6119 1.4519 0.1119 +v -2.6637 1.5952 0.1503 +v -2.7056 1.7290 0.1920 +v -2.7517 1.8426 0.2519 +v -2.5157 1.3164 0.1529 +v -2.6083 1.4564 0.1938 +v -2.6670 1.5988 0.2205 +v -2.7053 1.7285 0.2504 +v -2.7569 1.8458 0.2952 +v -2.5115 1.3194 0.2459 +v -2.5988 1.4572 0.2757 +v -2.6607 1.5977 0.2896 +v -2.7054 1.7265 0.3051 +v -2.7642 1.8440 0.3344 +v -2.4635 1.3974 -0.2296 +v -2.7836 1.9184 0.2649 +v -2.7756 1.9005 0.2408 +v -2.7290 1.8144 0.1330 +v -2.8017 1.9497 0.3537 +v -2.5630 1.4977 -0.1399 +v -2.7920 1.9324 0.2878 +v -2.6333 1.6018 -0.0550 +v -2.7975 1.9427 0.3102 +v -2.6837 1.7093 0.0315 +v -2.8008 1.9484 0.3323 +# 650 vertices + +vn 0.1535 0.9868 -0.0518 +vn 0.1923 0.9775 -0.0870 +vn 0.1116 0.9936 -0.0148 +vn 0.0794 0.9964 0.0296 +vn 0.1024 0.9934 -0.0521 +vn 0.0461 0.9986 0.0258 +vn 0.0836 0.9949 -0.0566 +vn -0.0112 0.9998 -0.0135 +vn 0.1232 0.9916 0.0396 +vn -0.0573 0.9972 0.0473 +vn 0.3052 0.9332 -0.1896 +vn 0.3351 0.9109 -0.2408 +vn 0.2848 0.9459 -0.1553 +vn 0.2797 0.9580 -0.0636 +vn 0.3208 0.9471 0.0054 +vn 0.4243 0.8612 -0.2797 +vn 0.4102 0.8372 -0.3618 +vn 0.4227 0.8833 -0.2026 +vn 0.4133 0.9044 -0.1060 +vn 0.3653 0.9307 -0.0162 +vn 0.4917 0.8088 -0.3225 +vn 0.4941 0.7033 -0.5111 +vn 0.4366 0.8772 -0.1999 +vn 0.4134 0.8968 -0.1576 +vn 0.3602 0.9287 -0.0887 +vn 0.1163 0.9922 -0.0456 +vn 0.0395 0.9985 -0.0371 +vn 0.0548 0.9984 0.0119 +vn -0.0614 0.9958 0.0684 +vn -0.0506 0.9961 0.0723 +vn 0.0038 0.9933 0.1155 +vn 0.3455 0.9367 -0.0558 +vn 0.3652 0.9294 -0.0531 +vn 0.3290 0.9427 -0.0558 +vn 0.5430 0.6673 -0.5098 +vn 0.4778 0.6797 -0.5565 +vn 0.4758 0.5997 -0.6434 +vn 0.0770 0.9960 0.0451 +vn 0.1151 0.9740 0.1953 +vn 0.3691 0.9041 -0.2155 +vn 0.4370 0.7485 -0.4988 +vn 0.0545 0.9957 0.0749 +vn 0.2626 0.9577 0.1179 +vn 0.4212 0.8744 -0.2409 +vn 0.3675 0.8745 -0.3165 +vn -0.0091 0.9959 0.0900 +vn 0.3078 0.9502 0.0484 +vn 0.5237 0.7114 -0.4686 +vn 0.1853 0.9748 -0.1245 +vn 0.1941 0.9696 0.1490 +vn 0.1649 0.9712 0.1722 +vn 0.0649 0.9884 0.1371 +vn 0.1271 0.9823 0.1378 +vn 0.2014 0.9681 0.1493 +vn 0.1248 0.9749 0.1844 +vn 0.1674 0.9558 0.2416 +vn 0.0803 0.9622 0.2604 +vn 0.1581 0.9100 0.3833 +vn 0.0599 0.9311 0.3599 +vn 0.1477 0.9739 0.1724 +vn 0.2077 0.9658 0.1549 +vn 0.1771 0.9663 0.1866 +vn 0.2356 0.9305 0.2803 +vn 0.2628 0.8743 0.4081 +vn 0.1754 0.9800 0.0937 +vn 0.2498 0.9671 0.0479 +vn 0.1567 0.9564 0.2463 +vn 0.2311 0.9063 0.3539 +vn 0.2961 0.8548 0.4262 +vn 0.2792 0.9602 -0.0018 +vn 0.3014 0.9533 -0.0210 +vn 0.2642 0.9427 0.2036 +vn 0.2622 0.8810 0.3938 +vn 0.2673 0.8500 0.4540 +vn -0.0270 0.9953 0.0934 +vn -0.0374 0.9330 0.3580 +vn 0.0219 0.9221 0.3862 +vn 0.0928 0.8944 0.4375 +vn 0.2822 0.8393 0.4647 +vn 0.2568 0.8412 0.4759 +vn 0.2682 0.8536 0.4467 +vn 0.3692 0.9250 -0.0896 +vn 0.0318 0.9954 0.0902 +vn 0.1687 0.8696 0.4640 +vn 0.3188 0.8781 0.3569 +vn 0.0182 0.9811 0.1925 +vn 0.2498 0.8503 0.4632 +vn 0.3463 0.9283 0.1356 +vn -0.0070 0.9609 0.2770 +vn 0.3020 0.8381 0.4543 +vn 0.3454 0.9366 -0.0593 +vn 0.2576 0.8476 0.4639 +vn 0.1846 0.8663 0.4641 +vn 0.1610 0.8934 0.4194 +vn 0.1752 0.8700 0.4609 +vn 0.2593 0.8168 0.5153 +vn 0.1717 0.8177 0.5495 +vn 0.1636 0.7901 0.5908 +vn 0.1503 0.7754 0.6134 +vn 0.0995 0.7591 0.6433 +vn 0.0762 0.7405 0.6678 +vn 0.2560 0.8291 0.4970 +vn 0.2418 0.8497 0.4686 +vn 0.2997 0.8092 0.5053 +vn 0.2685 0.7933 0.5465 +vn 0.1954 0.7619 0.6176 +vn 0.2761 0.8206 0.5004 +vn 0.3017 0.8373 0.4560 +vn 0.2759 0.7972 0.5369 +vn 0.3533 0.7729 0.5271 +vn 0.3314 0.7267 0.6017 +vn 0.2971 0.8249 0.4809 +vn 0.3070 0.8365 0.4540 +vn 0.2691 0.7785 0.5670 +vn 0.3742 0.7329 0.5681 +vn 0.4326 0.6746 0.5982 +vn 0.0450 0.9098 0.4125 +vn 0.0094 0.7017 0.7124 +vn -0.0637 0.6396 0.7661 +vn -0.0118 0.6649 0.7469 +vn 0.4331 0.5880 0.6832 +vn 0.4501 0.5817 0.6775 +vn 0.4733 0.6507 0.5937 +vn 0.2856 0.8377 0.4655 +vn 0.0134 0.8787 0.4773 +vn 0.0578 0.6859 0.7254 +vn 0.3498 0.7083 0.6131 +vn 0.0693 0.8393 0.5392 +vn 0.1436 0.6882 0.7111 +vn 0.2938 0.7698 0.5666 +vn 0.0740 0.7676 0.6366 +vn 0.3183 0.6390 0.7002 +vn 0.3051 0.8256 0.4746 +vn 0.0110 0.4555 0.8902 +vn 0.0110 0.5473 0.8369 +vn -0.0250 0.5474 0.8365 +vn 0.0139 0.4541 0.8908 +vn -0.0176 0.4218 0.9065 +vn 0.0283 0.4216 0.9063 +vn 0.0264 0.4380 0.8986 +vn -0.0064 0.4458 0.8951 +vn 0.1058 0.3903 0.9146 +vn -0.0244 0.3939 0.9188 +vn 0.0572 0.4517 0.8903 +vn 0.0748 0.5483 0.8329 +vn 0.0423 0.4038 0.9139 +vn 0.0572 0.4085 0.9110 +vn 0.1018 0.3929 0.9139 +vn 0.1871 0.4347 0.8809 +vn 0.2387 0.5196 0.8204 +vn 0.1284 0.3901 0.9118 +vn 0.0924 0.3876 0.9172 +vn 0.1378 0.3552 0.9246 +vn 0.3308 0.4030 0.8533 +vn 0.3750 0.4799 0.7932 +vn 0.2689 0.3695 0.8895 +vn 0.1098 0.3631 0.9252 +vn 0.2285 0.2985 0.9266 +vn -0.0350 0.5622 0.8262 +vn -0.1365 0.3819 0.9141 +vn -0.1292 0.3108 0.9417 +vn -0.0459 0.3120 0.9490 +vn 0.2058 0.2865 0.9357 +vn -0.0941 -0.3737 -0.9227 +vn 0.2643 0.2646 0.9274 +vn 0.4184 0.4942 0.7621 +vn 0.0486 0.4727 0.8799 +vn 0.0436 0.3158 0.9478 +vn 0.1611 0.3711 0.9145 +vn 0.0415 0.4085 0.9118 +vn 0.0497 0.3331 0.9416 +vn 0.3643 0.3538 0.8615 +vn -0.0853 0.4228 0.9022 +vn 0.0682 0.3646 0.9287 +vn 0.3829 0.3842 0.8401 +vn -0.4497 0.8879 -0.0972 +vn -0.4632 0.8538 -0.2377 +vn -0.5324 0.7543 -0.3842 +vn -0.5103 0.8264 -0.2380 +vn -0.4122 0.9110 0.0114 +vn -0.4416 0.8920 -0.0970 +vn -0.3644 0.9295 0.0566 +vn -0.3244 0.9439 -0.0612 +vn -0.2746 0.9606 0.0431 +vn -0.2206 0.9725 -0.0740 +vn -0.2698 0.9629 0.0003 +vn -0.2644 0.9589 -0.1026 +vn -0.2993 0.9500 0.0891 +vn -0.3005 0.9454 0.1259 +vn -0.2974 0.9457 0.1314 +vn -0.1432 0.9886 0.0473 +vn -0.1280 0.9915 -0.0220 +vn -0.1617 0.9810 0.1069 +vn -0.1779 0.9777 0.1117 +vn -0.2168 0.9697 0.1128 +vn -0.0201 0.9995 0.0259 +vn -0.0270 0.9995 -0.0190 +vn -0.0714 0.9918 0.1065 +vn -0.0775 0.9903 0.1157 +vn -0.0893 0.9924 0.0852 +vn -0.5520 0.7323 -0.3988 +vn -0.5613 0.6709 -0.4847 +vn -0.5409 0.7121 -0.4475 +vn -0.2450 0.9671 -0.0677 +vn -0.3029 0.9510 0.0622 +vn -0.2314 0.9725 0.0244 +vn -0.1295 0.9870 0.0950 +vn -0.0504 0.9983 -0.0304 +vn -0.5002 0.8227 -0.2701 +vn -0.1955 0.9806 0.0150 +vn -0.1313 0.9903 -0.0455 +vn -0.3548 0.9217 -0.1572 +vn -0.2482 0.9664 0.0664 +vn -0.2653 0.9573 -0.1150 +vn -0.2487 0.9588 -0.1375 +vn -0.2461 0.9630 0.1097 +vn -0.4312 0.8664 -0.2518 +vn -0.2179 0.9750 0.0426 +vn -0.2019 0.9785 0.0421 +vn -0.2594 0.9636 0.0649 +vn -0.2760 0.9598 0.0515 +vn -0.2487 0.9612 0.1198 +vn -0.2867 0.9477 0.1403 +vn -0.2881 0.9309 0.2247 +vn -0.2847 0.9271 0.2439 +vn -0.3087 0.8976 0.3147 +vn -0.2892 0.9034 0.3167 +vn -0.2273 0.9727 0.0458 +vn -0.2254 0.9737 0.0330 +vn -0.2007 0.9760 0.0842 +vn -0.2228 0.9567 0.1872 +vn -0.2454 0.9212 0.3020 +vn -0.1820 0.9816 0.0582 +vn -0.2063 0.9774 0.0459 +vn -0.1676 0.9756 0.1420 +vn -0.1363 0.9646 0.2259 +vn -0.1120 0.9431 0.3132 +vn -0.0869 0.9916 0.0953 +vn -0.1156 0.9904 0.0765 +vn -0.0976 0.9769 0.1903 +vn -0.0874 0.9594 0.2683 +vn -0.0756 0.9417 0.3277 +vn -0.3035 0.9506 0.0646 +vn -0.3139 0.8981 0.3081 +vn -0.3031 0.8774 0.3719 +vn -0.2761 0.8836 0.3781 +vn -0.0713 0.9283 0.3650 +vn -0.3157 0.9475 0.0503 +vn -0.2858 0.8797 0.3801 +vn -0.3140 0.9416 0.1213 +vn -0.2538 0.8762 0.4097 +vn -0.2999 0.9253 0.2322 +vn -0.1563 0.9017 0.4030 +vn -0.3323 0.8196 0.4667 +vn -0.2816 0.8655 0.4143 +vn -0.2840 0.8518 0.4402 +vn -0.3345 0.8041 0.4915 +vn -0.3610 0.7717 0.5236 +vn -0.3857 0.7431 0.5468 +vn -0.3767 0.6920 0.6159 +vn -0.3907 0.6869 0.6128 +vn -0.3379 0.6404 0.6897 +vn -0.3751 0.6257 0.6839 +vn -0.2676 0.8496 0.4545 +vn -0.2202 0.8874 0.4050 +vn -0.2508 0.8144 0.5233 +vn -0.2745 0.7348 0.6203 +vn -0.2786 0.6505 0.7065 +vn -0.1427 0.8865 0.4402 +vn -0.1808 0.8894 0.4199 +vn -0.1507 0.8321 0.5337 +vn -0.1339 0.7771 0.6150 +vn -0.1507 0.6865 0.7113 +vn -0.0788 0.8871 0.4548 +vn -0.1339 0.8907 0.4344 +vn -0.0872 0.8370 0.5403 +vn -0.0687 0.7709 0.6332 +vn -0.0490 0.6965 0.7159 +vn -0.2752 0.8568 0.4361 +vn -0.3861 0.6202 0.6828 +vn -0.3948 0.5744 0.7171 +vn -0.3796 0.5907 0.7120 +vn -0.0385 0.6476 0.7610 +vn -0.3895 0.7563 0.5256 +vn -0.3391 0.6162 0.7108 +vn -0.3965 0.7362 0.5485 +vn -0.2575 0.6348 0.7285 +vn -0.3850 0.6984 0.6034 +vn -0.1356 0.6402 0.7562 +vn -0.2725 0.4460 0.8526 +vn -0.3461 0.5688 0.7461 +vn -0.4152 0.5354 0.7355 +vn -0.4167 0.3743 0.8284 +vn -0.2338 0.2883 0.9285 +vn -0.3362 0.2752 0.9007 +vn -0.1752 0.3064 0.9357 +vn -0.2440 0.2892 0.9257 +vn -0.1942 0.3495 0.9166 +vn -0.2172 0.3262 0.9200 +vn -0.1261 0.4717 0.8727 +vn -0.1874 0.6094 0.7704 +vn -0.1295 0.3175 0.9394 +vn -0.1226 0.3404 0.9322 +vn -0.2095 0.3449 0.9150 +vn -0.0229 0.4869 0.8732 +vn -0.0709 0.6038 0.7939 +vn -0.0736 0.3393 0.9378 +vn -0.1222 0.3572 0.9260 +vn -0.2488 0.3359 0.9085 +vn 0.0202 0.4837 0.8750 +vn -0.0321 0.5824 0.8123 +vn 0.0022 0.3803 0.9248 +vn -0.1118 0.3933 0.9126 +vn -0.2208 0.3522 0.9095 +vn -0.4446 0.5080 0.7377 +vn -0.2561 0.2771 0.9261 +vn 0.0557 0.5984 0.7992 +vn -0.2826 0.2994 0.9113 +vn -0.1531 0.3292 0.9318 +vn -0.4654 0.3802 0.7992 +vn -0.0923 0.4534 0.8865 +vn -0.3131 0.3768 0.8718 +vn -0.0758 0.4361 0.8967 +vn -0.2595 0.3195 0.9114 +vn -0.1204 0.3813 0.9166 +vn -0.1087 -0.9940 0.0098 +vn -0.1891 -0.9782 0.0856 +vn -0.1525 -0.9870 0.0500 +vn -0.0817 -0.9963 -0.0254 +vn -0.1067 -0.9925 0.0605 +vn -0.0463 -0.9987 -0.0208 +vn -0.0906 -0.9943 0.0558 +vn 0.0113 -0.9998 0.0149 +vn -0.1241 -0.9911 -0.0485 +vn 0.0511 -0.9976 -0.0472 +vn -0.3244 -0.9182 0.2272 +vn -0.3030 -0.9350 0.1845 +vn -0.2888 -0.9442 0.1582 +vn -0.2867 -0.9558 0.0648 +vn -0.3172 -0.9483 -0.0146 +vn -0.4128 -0.8331 0.3682 +vn -0.4163 -0.8731 0.2539 +vn -0.4251 -0.8830 0.1990 +vn -0.4170 -0.9028 0.1054 +vn -0.3672 -0.9298 0.0238 +vn -0.5093 -0.6945 0.5083 +vn -0.4987 -0.8011 0.3311 +vn -0.4310 -0.8825 0.1883 +vn -0.4068 -0.9019 0.1453 +vn -0.3616 -0.9271 0.0985 +vn -0.0395 -0.9986 0.0357 +vn -0.1146 -0.9924 0.0459 +vn -0.0509 -0.9986 -0.0146 +vn -0.0119 -0.9932 -0.1159 +vn 0.0516 -0.9959 -0.0745 +vn 0.0616 -0.9959 -0.0658 +vn -0.3656 -0.9291 0.0561 +vn -0.3464 -0.9357 0.0664 +vn -0.3259 -0.9437 0.0569 +vn -0.4767 -0.6489 0.5930 +vn -0.5127 -0.6195 0.5945 +vn -0.5584 -0.6494 0.5162 +vn -0.0747 -0.9963 -0.0421 +vn -0.1236 -0.9728 -0.1960 +vn -0.3613 -0.9141 0.1844 +vn -0.4339 -0.7376 0.5174 +vn -0.0486 -0.9961 -0.0734 +vn -0.2549 -0.9594 -0.1212 +vn -0.4173 -0.8747 0.2465 +vn -0.3403 -0.8931 0.2941 +vn 0.0132 -0.9962 -0.0866 +vn -0.3000 -0.9528 -0.0472 +vn -0.5411 -0.6666 0.5127 +vn -0.1911 -0.9717 0.1388 +vn -0.0695 -0.9879 -0.1388 +vn -0.1693 -0.9711 -0.1681 +vn -0.1949 -0.9705 -0.1420 +vn -0.1280 -0.9818 -0.1403 +vn -0.1977 -0.9690 -0.1480 +vn -0.1214 -0.9756 -0.1831 +vn -0.1663 -0.9550 -0.2454 +vn -0.0819 -0.9627 -0.2580 +vn -0.1525 -0.9072 -0.3920 +vn -0.0600 -0.9280 -0.3677 +vn -0.2007 -0.9676 -0.1530 +vn -0.1429 -0.9752 -0.1690 +vn -0.1772 -0.9665 -0.1859 +vn -0.2361 -0.9297 -0.2826 +vn -0.2553 -0.8721 -0.4176 +vn -0.2410 -0.9694 -0.0476 +vn -0.1674 -0.9811 -0.0968 +vn -0.1577 -0.9559 -0.2476 +vn -0.2376 -0.9039 -0.3558 +vn -0.3041 -0.8484 -0.4332 +vn -0.3009 -0.9533 0.0270 +vn -0.2783 -0.9605 0.0016 +vn -0.2660 -0.9414 -0.2072 +vn -0.2616 -0.8773 -0.4024 +vn -0.2745 -0.8444 -0.4601 +vn 0.0249 -0.9955 -0.0913 +vn -0.0902 -0.8937 -0.4395 +vn -0.0265 -0.9235 -0.3828 +vn 0.0399 -0.9308 -0.3633 +vn -0.2547 -0.8406 -0.4780 +vn -0.2866 -0.8361 -0.4678 +vn -0.2609 -0.8504 -0.4569 +vn -0.3722 -0.9229 0.0989 +vn -0.0362 -0.9951 -0.0925 +vn -0.1672 -0.8706 -0.4626 +vn -0.3120 -0.8766 -0.3663 +vn -0.0204 -0.9811 -0.1925 +vn -0.2510 -0.8503 -0.4626 +vn -0.3513 -0.9260 -0.1383 +vn 0.0123 -0.9611 -0.2758 +vn -0.3076 -0.8324 -0.4610 +vn -0.3480 -0.9355 0.0608 +vn -0.1644 -0.8935 -0.4179 +vn -0.1770 -0.8679 -0.4642 +vn -0.2561 -0.8481 -0.4638 +vn -0.1723 -0.8683 -0.4651 +vn -0.2505 -0.8174 -0.5188 +vn -0.1632 -0.8183 -0.5512 +vn -0.1616 -0.7944 -0.5855 +vn -0.1507 -0.7818 -0.6050 +vn -0.1053 -0.7690 -0.6305 +vn -0.0745 -0.7457 -0.6621 +vn -0.2408 -0.8492 -0.4700 +vn -0.2574 -0.8265 -0.5006 +vn -0.3005 -0.8094 -0.5046 +vn -0.2630 -0.7948 -0.5470 +vn -0.2063 -0.7672 -0.6073 +vn -0.3138 -0.8347 -0.4525 +vn -0.2827 -0.8187 -0.4999 +vn -0.2752 -0.7999 -0.5333 +vn -0.3446 -0.7751 -0.5295 +vn -0.3352 -0.7317 -0.5935 +vn -0.3098 -0.8352 -0.4545 +vn -0.3052 -0.8248 -0.4760 +vn -0.2716 -0.7828 -0.5598 +vn -0.3655 -0.7364 -0.5693 +vn -0.4214 -0.6831 -0.5965 +vn -0.0444 -0.9098 -0.4127 +vn 0.0285 -0.6572 -0.7532 +vn 0.0684 -0.6335 -0.7707 +vn -0.0019 -0.7023 -0.7118 +vn -0.4440 -0.5926 -0.6721 +vn -0.4269 -0.5939 -0.6819 +vn -0.4577 -0.6602 -0.5955 +vn -0.2817 -0.8375 -0.4683 +vn -0.0172 -0.8756 -0.4827 +vn -0.0502 -0.6815 -0.7301 +vn -0.3490 -0.7117 -0.6096 +vn -0.0784 -0.8386 -0.5391 +vn -0.1578 -0.6824 -0.7137 +vn -0.2989 -0.7758 -0.5557 +vn -0.0763 -0.7747 -0.6277 +vn -0.3285 -0.6354 -0.6988 +vn -0.3104 -0.8262 -0.4701 +vn 0.0271 -0.5508 -0.8342 +vn -0.0147 -0.5472 -0.8369 +vn -0.0014 -0.4591 -0.8884 +vn -0.0038 -0.4541 -0.8909 +vn 0.0219 -0.4161 -0.9090 +vn -0.0102 -0.4215 -0.9068 +vn -0.0237 -0.4362 -0.8996 +vn 0.0322 -0.4409 -0.8970 +vn -0.0831 -0.3843 -0.9194 +vn 0.0209 -0.3912 -0.9201 +vn -0.0887 -0.5468 -0.8325 +vn -0.0576 -0.4555 -0.8884 +vn -0.0436 -0.3974 -0.9166 +vn -0.0626 -0.4015 -0.9137 +vn -0.1209 -0.3765 -0.9185 +vn -0.2457 -0.5217 -0.8170 +vn -0.1922 -0.4403 -0.8770 +vn -0.1371 -0.3824 -0.9138 +vn -0.0826 -0.3780 -0.9221 +vn -0.1471 -0.3548 -0.9233 +vn -0.3710 -0.4908 -0.7883 +vn -0.3271 -0.4137 -0.8497 +vn -0.2595 -0.3633 -0.8948 +vn -0.1255 -0.3580 -0.9252 +vn -0.1424 -0.3553 -0.9239 +vn 0.0421 -0.5623 -0.8258 +vn 0.0199 -0.3146 -0.9490 +vn 0.0931 -0.3238 -0.9416 +vn 0.1339 -0.3830 -0.9140 +vn -0.0305 -0.4214 -0.9064 +vn -0.1835 -0.3040 -0.9348 +vn -0.1372 -0.3467 -0.9279 +vn -0.4028 -0.5055 -0.7630 +vn -0.0343 -0.4689 -0.8826 +vn -0.0282 -0.3125 -0.9495 +vn -0.1781 -0.3647 -0.9140 +vn -0.0419 -0.4062 -0.9128 +vn -0.0378 -0.3270 -0.9443 +vn -0.3349 -0.3531 -0.8736 +vn 0.0853 -0.4205 -0.9033 +vn -0.0773 -0.3458 -0.9351 +vn -0.3798 -0.4086 -0.8300 +vn 0.5199 -0.7661 0.3778 +vn 0.4732 -0.8530 0.2200 +vn 0.4377 -0.8912 0.1192 +vn 0.4997 -0.8303 0.2467 +vn 0.4055 -0.9141 -0.0008 +vn 0.4350 -0.8954 0.0952 +vn 0.3609 -0.9308 -0.0578 +vn 0.3164 -0.9462 0.0683 +vn 0.2676 -0.9628 -0.0369 +vn 0.2210 -0.9727 0.0704 +vn 0.2846 -0.9539 0.0954 +vn 0.2802 -0.9599 0.0042 +vn 0.2946 -0.9519 -0.0844 +vn 0.2979 -0.9460 -0.1276 +vn 0.2940 -0.9479 -0.1226 +vn 0.1385 -0.9902 0.0191 +vn 0.1510 -0.9870 -0.0559 +vn 0.1604 -0.9813 -0.1060 +vn 0.1786 -0.9780 -0.1081 +vn 0.2175 -0.9701 -0.1074 +vn 0.0225 -0.9995 0.0202 +vn 0.0225 -0.9993 -0.0290 +vn 0.0720 -0.9917 -0.1063 +vn 0.0780 -0.9908 -0.1108 +vn 0.0928 -0.9922 -0.0834 +vn 0.5560 -0.6869 0.4680 +vn 0.5547 -0.7484 0.3637 +vn 0.5309 -0.7233 0.4415 +vn 0.2348 -0.9715 -0.0310 +vn 0.3049 -0.9504 -0.0616 +vn 0.2513 -0.9659 0.0616 +vn 0.1290 -0.9872 -0.0935 +vn 0.0456 -0.9985 0.0290 +vn 0.4910 -0.8295 0.2661 +vn 0.1971 -0.9802 -0.0211 +vn 0.1385 -0.9890 0.0513 +vn 0.3458 -0.9246 0.1598 +vn 0.2446 -0.9678 -0.0588 +vn 0.2803 -0.9529 0.1161 +vn 0.2489 -0.9587 0.1377 +vn 0.2445 -0.9641 -0.1041 +vn 0.4501 -0.8669 0.2141 +vn 0.2613 -0.9629 -0.0681 +vn 0.2051 -0.9778 -0.0437 +vn 0.2188 -0.9749 -0.0422 +vn 0.2806 -0.9585 -0.0511 +vn 0.2499 -0.9609 -0.1192 +vn 0.2918 -0.9460 -0.1416 +vn 0.2888 -0.9293 -0.2303 +vn 0.2850 -0.9279 -0.2406 +vn 0.3005 -0.9027 -0.3081 +vn 0.2913 -0.9043 -0.3120 +vn 0.2286 -0.9728 -0.0368 +vn 0.2264 -0.9726 -0.0528 +vn 0.1927 -0.9774 -0.0870 +vn 0.2211 -0.9564 -0.1906 +vn 0.2451 -0.9211 -0.3026 +vn 0.2020 -0.9784 -0.0443 +vn 0.1841 -0.9806 -0.0673 +vn 0.1649 -0.9748 -0.1500 +vn 0.1339 -0.9654 -0.2240 +vn 0.1130 -0.9441 -0.3098 +vn 0.1130 -0.9909 -0.0729 +vn 0.0893 -0.9907 -0.1028 +vn 0.0980 -0.9761 -0.1939 +vn 0.0958 -0.9585 -0.2684 +vn 0.0735 -0.9426 -0.3258 +vn 0.3062 -0.9495 -0.0687 +vn 0.2769 -0.8813 -0.3830 +vn 0.3069 -0.8768 -0.3702 +vn 0.3279 -0.8936 -0.3064 +vn 0.0689 -0.9295 -0.3624 +vn 0.3209 -0.9458 -0.0499 +vn 0.2839 -0.8791 -0.3829 +vn 0.3223 -0.9388 -0.1220 +vn 0.2511 -0.8791 -0.4052 +vn 0.3026 -0.9262 -0.2251 +vn 0.1583 -0.9011 -0.4038 +vn 0.2809 -0.8538 -0.4382 +vn 0.2833 -0.8658 -0.4125 +vn 0.3349 -0.8189 -0.4660 +vn 0.3357 -0.8044 -0.4901 +vn 0.3557 -0.7737 -0.5243 +vn 0.3779 -0.7476 -0.5462 +vn 0.3748 -0.6970 -0.6114 +vn 0.3915 -0.6856 -0.6138 +vn 0.3418 -0.6344 -0.6933 +vn 0.3814 -0.6199 -0.6857 +vn 0.2254 -0.8866 -0.4038 +vn 0.2711 -0.8506 -0.4506 +vn 0.2589 -0.8082 -0.5290 +vn 0.2655 -0.7394 -0.6187 +vn 0.2764 -0.6481 -0.7096 +vn 0.1784 -0.8919 -0.4155 +vn 0.1411 -0.8885 -0.4367 +vn 0.1487 -0.8280 -0.5407 +vn 0.1349 -0.7754 -0.6169 +vn 0.1524 -0.6877 -0.7099 +vn 0.1439 -0.8887 -0.4353 +vn 0.0674 -0.8894 -0.4520 +vn 0.0661 -0.8391 -0.5399 +vn 0.0743 -0.7702 -0.6335 +vn 0.0637 -0.6945 -0.7166 +vn 0.2749 -0.8574 -0.4351 +vn 0.3760 -0.5872 -0.7168 +vn 0.3911 -0.5753 -0.7184 +vn 0.3958 -0.6093 -0.6871 +vn 0.0476 -0.6423 -0.7650 +vn 0.3802 -0.7659 -0.5185 +vn 0.3362 -0.6112 -0.7165 +vn 0.4067 -0.7270 -0.5532 +vn 0.2591 -0.6329 -0.7296 +vn 0.3765 -0.7029 -0.6035 +vn 0.1435 -0.6369 -0.7574 +vn 0.4035 -0.5423 -0.7370 +vn 0.3541 -0.5623 -0.7473 +vn 0.2770 -0.4480 -0.8500 +vn 0.3994 -0.3991 -0.8253 +vn 0.2280 -0.2989 -0.9267 +vn 0.3173 -0.2968 -0.9007 +vn 0.1673 -0.3139 -0.9346 +vn 0.2625 -0.2612 -0.9289 +vn 0.2029 -0.3340 -0.9205 +vn 0.2176 -0.3193 -0.9223 +vn 0.2047 -0.6050 -0.7694 +vn 0.1370 -0.4684 -0.8728 +vn 0.1438 -0.3140 -0.9385 +vn 0.1265 -0.3354 -0.9335 +vn 0.1882 -0.3534 -0.9163 +vn 0.0668 -0.6053 -0.7932 +vn 0.0216 -0.4849 -0.8743 +vn 0.0840 -0.3348 -0.9386 +vn 0.1234 -0.3501 -0.9285 +vn 0.2340 -0.3444 -0.9092 +vn 0.0278 -0.5835 -0.8116 +vn -0.0143 -0.4841 -0.8749 +vn 0.0023 -0.3784 -0.9257 +vn 0.1066 -0.3864 -0.9162 +vn 0.2329 -0.3497 -0.9075 +vn 0.4351 -0.5147 -0.7388 +vn 0.2608 -0.3110 -0.9139 +vn -0.3843 -0.7853 -0.4854 +vn 0.2381 -0.2896 -0.9270 +vn 0.1426 -0.3474 -0.9268 +vn 0.4508 -0.4090 -0.7934 +vn 0.1484 -0.4056 -0.9019 +vn 0.3161 -0.3773 -0.8705 +vn 0.1397 -0.4010 -0.9054 +vn 0.3130 -0.2619 -0.9129 +vn 0.1322 -0.3887 -0.9118 +vn -0.0014 -0.0700 0.9975 +vn -0.0415 0.0029 0.9991 +vn -0.0282 -0.0176 0.9994 +vn -0.0024 -0.0737 0.9973 +vn -0.8194 0.3966 0.4138 +vn -0.8154 0.2896 0.5013 +vn -0.8088 0.2795 0.5175 +vn -0.8176 0.4011 0.4130 +vn -0.5311 0.6118 0.5863 +vn -0.4280 0.8012 0.4181 +vn -0.4415 0.7781 0.4469 +vn -0.5375 0.5924 0.6000 +vn 0.3779 0.5630 0.7350 +vn 0.3018 0.5047 0.8088 +vn 0.3104 0.5387 0.7833 +vn 0.3820 0.5820 0.7179 +vn -0.7131 0.4369 0.5483 +vn -0.7197 0.4162 0.5557 +vn 0.1403 0.3359 0.9314 +vn 0.1477 0.3873 0.9101 +vn -0.6363 0.5144 0.5749 +vn -0.6383 0.5032 0.5826 +vn 0.0286 0.2083 0.9776 +vn 0.0331 0.2632 0.9642 +vn -0.5867 0.5604 0.5846 +vn -0.5884 0.5537 0.5892 +vn -0.0255 -0.0381 0.9989 +vn -0.0269 0.0048 0.9996 +vn -0.9613 0.2681 0.0630 +vn -0.9455 0.3087 0.1038 +vn -0.9478 0.3018 0.1032 +vn -0.9598 0.2752 0.0551 +vn -0.8443 0.3615 0.3956 +vn -0.8444 0.3583 0.3982 +vn -0.9153 0.3794 0.1351 +vn -0.9188 0.3724 0.1308 +vn -0.8830 0.4061 0.2354 +vn -0.8833 0.3985 0.2467 +vn -0.8586 0.3792 0.3450 +vn -0.8571 0.3786 0.3494 +vn -0.8439 0.5271 -0.1003 +vn -0.8702 0.4926 0.0081 +vn -0.8686 0.4954 0.0108 +vn -0.8448 0.5252 -0.1026 +vn -0.9000 0.4252 0.0957 +vn -0.8981 0.4286 0.0984 +vn -0.9431 0.3326 0.0058 +vn -0.9412 0.3378 0.0066 +vn -0.9404 0.3291 0.0861 +vn -0.9415 0.3262 0.0850 +vn -0.9261 0.3615 0.1078 +vn -0.9276 0.3558 0.1134 +vn -0.1108 0.9755 -0.1900 +vn -0.2876 0.9395 -0.1862 +vn -0.2962 0.9364 -0.1883 +vn -0.1469 0.9642 -0.2209 +vn -0.7015 0.7120 -0.0312 +vn -0.7298 0.6797 -0.0737 +vn -0.7255 0.6849 -0.0671 +vn -0.7441 0.6653 -0.0610 +vn -0.7337 0.6531 -0.1876 +vn -0.7689 0.6007 -0.2188 +vn -0.8302 0.5379 -0.1461 +vn -0.8279 0.5431 -0.1398 +vn -0.4433 0.8713 -0.2106 +vn -0.4185 0.8885 -0.1884 +vn -0.7608 0.6343 -0.1375 +vn -0.7638 0.6294 -0.1429 +vn -0.5730 0.7779 -0.2580 +vn -0.5469 0.8038 -0.2341 +vn -0.7407 0.6703 0.0468 +vn -0.7399 0.6715 0.0408 +vn -0.6423 0.7171 -0.2705 +vn -0.6347 0.7271 -0.2618 +vn -0.8069 0.5905 -0.0147 +vn -0.8027 0.5964 -0.0001 +vn 0.3712 0.7456 0.5535 +vn 0.5026 0.6188 0.6037 +vn 0.4796 0.6436 0.5964 +vn 0.3414 0.7691 0.5403 +vn -0.2363 0.3264 0.9152 +vn -0.4030 0.4116 0.8174 +vn -0.3720 0.3946 0.8402 +vn -0.2042 0.3059 0.9299 +vn 0.8663 0.3161 0.3868 +vn 0.9104 0.3144 0.2691 +vn 0.9094 0.3219 0.2632 +vn 0.8634 0.3238 0.3870 +vn -0.1441 0.0588 0.9878 +vn -0.1375 0.0507 0.9892 +vn 0.6475 0.4977 0.5771 +vn 0.6302 0.5125 0.5832 +vn -0.1371 0.0630 0.9886 +vn -0.1357 0.0563 0.9892 +vn 0.7231 0.4567 0.5182 +vn 0.7179 0.4662 0.5169 +vn -0.0938 0.1403 0.9857 +vn -0.0837 0.1260 0.9885 +vn 0.7916 0.3945 0.4666 +vn 0.7834 0.4074 0.4694 +vn -0.0917 0.2252 0.9700 +vn -0.0684 0.2081 0.9757 +vn 0.9414 0.1987 0.2726 +vn 0.9405 0.2159 0.2624 +vn 0.8747 0.4348 0.2141 +vn 0.9396 0.3307 0.0877 +vn 0.9384 0.3348 0.0860 +vn 0.8753 0.4347 0.2118 +vn 0.9419 0.1094 0.3177 +vn 0.9403 0.1084 0.3226 +vn 0.9268 0.1995 0.3183 +vn 0.9294 0.1907 0.3159 +vn 0.9241 0.2795 0.2607 +vn 0.9284 0.2677 0.2575 +vn 0.9027 0.4211 0.0883 +vn 0.9059 0.4162 0.0790 +vn 0.8810 0.4672 0.0746 +vn 0.8363 0.5189 0.1770 +vn 0.8387 0.5156 0.1756 +vn 0.8817 0.4656 0.0758 +vn 0.8515 0.5103 0.1207 +vn 0.8521 0.5097 0.1190 +vn 0.8803 0.4694 0.0690 +vn 0.8813 0.4678 0.0672 +vn 0.8241 0.5491 0.1389 +vn 0.8243 0.5487 0.1394 +vn 0.8170 0.5719 0.0730 +vn 0.8135 0.5770 0.0722 +vn 0.7123 0.7012 0.0295 +vn 0.6468 0.6584 -0.3850 +vn 0.5762 0.6729 -0.4639 +vn 0.7038 0.7079 0.0588 +vn 0.6115 0.7786 -0.1406 +vn 0.5683 0.7855 -0.2451 +vn 0.0231 0.9728 -0.2305 +vn -0.0056 0.9667 -0.2557 +vn 0.7915 0.6111 -0.0067 +vn 0.7931 0.6088 -0.0171 +vn 0.5217 0.8410 -0.1432 +vn 0.5076 0.8447 -0.1697 +vn 0.7349 0.6588 0.1607 +vn 0.7402 0.6565 0.1453 +vn 0.3837 0.9077 -0.1696 +vn 0.3691 0.9105 -0.1865 +vn 0.6976 0.6802 0.2249 +vn 0.6956 0.6816 0.2272 +vn 0.2003 0.9561 -0.2138 +vn 0.1909 0.9568 -0.2194 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_05 +s 1 +f 3251/1626/3991 3252/1627/3992 3253/1628/3993 3254/1629/3994 +f 3255/1630/3995 3251/1626/3991 3254/1629/3994 3256/1631/3996 +f 3257/1632/3997 3255/1630/3995 3256/1631/3996 3258/1633/3998 +f 3259/1634/3999 3257/1632/3997 3258/1633/3998 3260/1635/4000 +f 3261/1636/4001 3262/1637/4002 3252/1627/3992 3251/1626/3991 +f 3263/1638/4003 3261/1636/4001 3251/1626/3991 3255/1630/3995 +f 3264/1639/4004 3263/1638/4003 3255/1630/3995 3257/1632/3997 +f 3265/1640/4005 3264/1639/4004 3257/1632/3997 3259/1634/3999 +f 3266/1641/4006 3267/1642/4007 3262/1637/4002 3261/1636/4001 +f 3268/1643/4008 3266/1641/4006 3261/1636/4001 3263/1638/4003 +f 3269/1644/4009 3268/1643/4008 3263/1638/4003 3264/1639/4004 +f 3270/1645/4010 3269/1644/4009 3264/1639/4004 3265/1640/4005 +f 3271/1646/4011 3272/1647/4012 3267/1642/4007 3266/1641/4006 +f 3273/1648/4013 3271/1646/4011 3266/1641/4006 3268/1643/4008 +f 3274/1649/4014 3273/1648/4013 3268/1643/4008 3269/1644/4009 +f 3275/1650/4015 3274/1649/4014 3269/1644/4009 3270/1645/4010 +f 3253/1628/3993 3276/1651/4016 3277/1652/4017 3278/1653/4018 +f 3279/1654/4019 3280/1655/4020 3281/1656/4021 3260/1635/4000 +f 3275/1650/4015 3282/1657/4022 3283/1658/4023 3284/1659/4024 +f 3285/1660/4025 3286/1661/4026 3287/1662/4027 3272/1647/4012 +f 3254/1629/3994 3253/1628/3993 3278/1653/4018 3288/1663/4028 +f 3260/1635/4000 3281/1656/4021 3289/1664/4029 3259/1634/3999 +f 3274/1649/4014 3275/1650/4015 3284/1659/4024 3290/1665/4030 +f 3272/1647/4012 3287/1662/4027 3291/1666/4031 3267/1642/4007 +f 3256/1631/3996 3254/1629/3994 3288/1663/4028 3292/1667/4032 +f 3259/1634/3999 3289/1664/4029 3293/1668/4033 3265/1640/4005 +f 3273/1648/4013 3274/1649/4014 3290/1665/4030 3294/1669/4034 +f 3267/1642/4007 3291/1666/4031 3295/1670/4035 3262/1637/4002 +f 3258/1633/3998 3256/1631/3996 3292/1667/4032 3296/1671/4036 +f 3265/1640/4005 3293/1668/4033 3297/1672/4037 3270/1645/4010 +f 3271/1646/4011 3273/1648/4013 3294/1669/4034 3298/1673/4038 +f 3262/1637/4002 3295/1670/4035 3299/1674/4039 3252/1627/3992 +f 3260/1635/4000 3258/1633/3998 3296/1671/4036 3279/1654/4019 +f 3270/1645/4010 3297/1672/4037 3282/1657/4022 3275/1650/4015 +f 3272/1647/4012 3271/1646/4011 3298/1673/4038 3285/1660/4025 +f 3252/1627/3992 3299/1674/4039 3276/1651/4016 3253/1628/3993 +f 3300/1675/4040 3301/1676/4041 3302/1677/4042 3303/1678/4043 +f 3304/1679/4044 3300/1675/4040 3303/1678/4043 3305/1680/4045 +f 3306/1681/4046 3304/1679/4044 3305/1680/4045 3307/1682/4047 +f 3308/1683/4048 3306/1681/4046 3307/1682/4047 3309/1684/4049 +f 3310/1685/4050 3311/1686/4051 3301/1676/4041 3300/1675/4040 +f 3312/1687/4052 3310/1685/4050 3300/1675/4040 3304/1679/4044 +f 3313/1688/4053 3312/1687/4052 3304/1679/4044 3306/1681/4046 +f 3314/1689/4054 3313/1688/4053 3306/1681/4046 3308/1683/4048 +f 3315/1690/4055 3316/1691/4056 3311/1686/4051 3310/1685/4050 +f 3317/1692/4057 3315/1690/4055 3310/1685/4050 3312/1687/4052 +f 3318/1693/4058 3317/1692/4057 3312/1687/4052 3313/1688/4053 +f 3319/1694/4059 3318/1693/4058 3313/1688/4053 3314/1689/4054 +f 3320/1695/4060 3321/1696/4061 3316/1691/4056 3315/1690/4055 +f 3322/1697/4062 3320/1695/4060 3315/1690/4055 3317/1692/4057 +f 3323/1698/4063 3322/1697/4062 3317/1692/4057 3318/1693/4058 +f 3324/1699/4064 3323/1698/4063 3318/1693/4058 3319/1694/4059 +f 3302/1677/4042 3281/1656/4021 3280/1655/4020 3325/1700/4065 +f 3326/1701/4066 3327/1702/4067 3328/1703/4068 3309/1684/4049 +f 3324/1699/4064 3329/1704/4069 3330/1705/4070 3331/1706/4071 +f 3332/1707/4072 3283/1658/4023 3282/1657/4022 3321/1696/4061 +f 3303/1678/4043 3302/1677/4042 3325/1700/4065 3333/1708/4073 +f 3309/1684/4049 3328/1703/4068 3334/1709/4074 3308/1683/4048 +f 3323/1698/4063 3324/1699/4064 3331/1706/4071 3335/1710/4075 +f 3321/1696/4061 3282/1657/4022 3297/1672/4037 3316/1691/4056 +f 3305/1680/4045 3303/1678/4043 3333/1708/4073 3336/1711/4076 +f 3308/1683/4048 3334/1709/4074 3337/1712/4077 3314/1689/4054 +f 3322/1697/4062 3323/1698/4063 3335/1710/4075 3338/1713/4078 +f 3316/1691/4056 3297/1672/4037 3293/1668/4033 3311/1686/4051 +f 3307/1682/4047 3305/1680/4045 3336/1711/4076 3339/1714/4079 +f 3314/1689/4054 3337/1712/4077 3340/1715/4080 3319/1694/4059 +f 3320/1695/4060 3322/1697/4062 3338/1713/4078 3341/1716/4081 +f 3311/1686/4051 3293/1668/4033 3289/1664/4029 3301/1676/4041 +f 3309/1684/4049 3307/1682/4047 3339/1714/4079 3326/1701/4066 +f 3319/1694/4059 3340/1715/4080 3329/1704/4069 3324/1699/4064 +f 3321/1696/4061 3320/1695/4060 3341/1716/4081 3332/1707/4072 +f 3301/1676/4041 3289/1664/4029 3281/1656/4021 3302/1677/4042 +f 3342/1717/4082 3343/1718/4083 3344/1719/4084 3345/1720/4085 +f 3346/1721/4086 3342/1717/4082 3345/1720/4085 3347/1722/4087 +f 3348/1723/4088 3346/1721/4086 3347/1722/4087 3349/1724/4089 +f 3350/1725/4090 3348/1723/4088 3349/1724/4089 3351/1726/4091 +f 3352/1727/4092 3353/1728/4093 3343/1718/4083 3342/1717/4082 +f 3354/1729/4094 3352/1727/4092 3342/1717/4082 3346/1721/4086 +f 3355/1730/4095 3354/1729/4094 3346/1721/4086 3348/1723/4088 +f 3356/1731/4096 3355/1730/4095 3348/1723/4088 3350/1725/4090 +f 3357/1732/4097 3358/1733/4098 3353/1728/4093 3352/1727/4092 +f 3359/1734/4099 3357/1732/4097 3352/1727/4092 3354/1729/4094 +f 3360/1735/4100 3359/1734/4099 3354/1729/4094 3355/1730/4095 +f 3361/1736/4101 3360/1735/4100 3355/1730/4095 3356/1731/4096 +f 3362/1737/4102 3363/1738/4103 3358/1733/4098 3357/1732/4097 +f 3364/1739/4104 3362/1737/4102 3357/1732/4097 3359/1734/4099 +f 3365/1740/4105 3364/1739/4104 3359/1734/4099 3360/1735/4100 +f 3366/1741/4106 3365/1740/4105 3360/1735/4100 3361/1736/4101 +f 3344/1719/4084 3328/1703/4068 3327/1702/4067 3367/1742/4107 +f 3368/1743/4108 3369/1744/4109 3370/1745/4110 3351/1726/4091 +f 3366/1741/4106 3371/1746/4111 3372/1747/4112 3373/1748/4113 +f 3374/1749/4114 3330/1705/4070 3329/1704/4069 3363/1738/4103 +f 3345/1720/4085 3344/1719/4084 3367/1742/4107 3375/1750/4115 +f 3351/1726/4091 3370/1745/4110 3376/1751/4116 3350/1725/4090 +f 3365/1740/4105 3366/1741/4106 3373/1748/4113 3377/1752/4117 +f 3363/1738/4103 3329/1704/4069 3340/1715/4080 3358/1733/4098 +f 3347/1722/4087 3345/1720/4085 3375/1750/4115 3378/1753/4118 +f 3350/1725/4090 3376/1751/4116 3379/1754/4119 3356/1731/4096 +f 3364/1739/4104 3365/1740/4105 3377/1752/4117 3380/1755/4120 +f 3358/1733/4098 3340/1715/4080 3337/1712/4077 3353/1728/4093 +f 3349/1724/4089 3347/1722/4087 3378/1753/4118 3381/1756/4121 +f 3356/1731/4096 3379/1754/4119 3382/1757/4122 3361/1736/4101 +f 3362/1737/4102 3364/1739/4104 3380/1755/4120 3383/1758/4123 +f 3353/1728/4093 3337/1712/4077 3334/1709/4074 3343/1718/4083 +f 3351/1726/4091 3349/1724/4089 3381/1756/4121 3368/1743/4108 +f 3361/1736/4101 3382/1757/4122 3371/1746/4111 3366/1741/4106 +f 3363/1738/4103 3362/1737/4102 3383/1758/4123 3374/1749/4114 +f 3343/1718/4083 3334/1709/4074 3328/1703/4068 3344/1719/4084 +f 3384/1759/4124 3385/1760/4125 3386/1761/4126 3387/1762/4127 +f 3388/1763/4128 3384/1759/4124 3387/1762/4127 3389/1764/4129 +f 3390/1765/4130 3388/1763/4128 3389/1764/4129 3391/1766/4131 +f 3392/1767/4132 3390/1765/4130 3391/1766/4131 3393/1768/4133 +f 3394/1769/4134 3395/1770/4135 3385/1760/4125 3384/1759/4124 +f 3396/1771/4136 3394/1769/4134 3384/1759/4124 3388/1763/4128 +f 3397/1772/4137 3396/1771/4136 3388/1763/4128 3390/1765/4130 +f 3398/1773/4138 3397/1772/4137 3390/1765/4130 3392/1767/4132 +f 3399/1774/4139 3400/1775/4140 3395/1770/4135 3394/1769/4134 +f 3401/1776/4141 3399/1774/4139 3394/1769/4134 3396/1771/4136 +f 3402/1777/4142 3401/1776/4141 3396/1771/4136 3397/1772/4137 +f 3403/1778/4143 3402/1777/4142 3397/1772/4137 3398/1773/4138 +f 3404/1779/4144 3405/1780/4145 3400/1775/4140 3399/1774/4139 +f 3406/1781/4146 3404/1779/4144 3399/1774/4139 3401/1776/4141 +f 3407/1782/4147 3406/1781/4146 3401/1776/4141 3402/1777/4142 +f 3408/1783/4148 3407/1782/4147 3402/1777/4142 3403/1778/4143 +f 3386/1761/4126 3370/1745/4110 3369/1744/4109 3409/1784/4149 +f 3410/1785/4150 3411/1786/4151 3412/1787/4152 3393/1768/4133 +f 3408/1783/4148 3413/1788/4153 3414/1789/4154 3415/1790/4155 +f 3416/1791/4156 3372/1747/4112 3371/1746/4111 3405/1780/4145 +f 3387/1762/4127 3386/1761/4126 3409/1784/4149 3417/1792/4157 +f 3393/1768/4133 3412/1787/4152 3418/1793/4158 3392/1767/4132 +f 3407/1782/4147 3408/1783/4148 3415/1790/4155 3419/1794/4159 +f 3405/1780/4145 3371/1746/4111 3382/1757/4122 3400/1775/4140 +f 3389/1764/4129 3387/1762/4127 3417/1792/4157 3420/1795/4160 +f 3392/1767/4132 3418/1793/4158 3421/1796/4161 3398/1773/4138 +f 3406/1781/4146 3407/1782/4147 3419/1794/4159 3422/1797/4162 +f 3400/1775/4140 3382/1757/4122 3379/1754/4119 3395/1770/4135 +f 3391/1766/4131 3389/1764/4129 3420/1795/4160 3423/1798/4163 +f 3398/1773/4138 3421/1796/4161 3424/1799/4164 3403/1778/4143 +f 3404/1779/4144 3406/1781/4146 3422/1797/4162 3425/1800/4165 +f 3395/1770/4135 3379/1754/4119 3376/1751/4116 3385/1760/4125 +f 3393/1768/4133 3391/1766/4131 3423/1798/4163 3410/1785/4150 +f 3403/1778/4143 3424/1799/4164 3413/1788/4153 3408/1783/4148 +f 3405/1780/4145 3404/1779/4144 3425/1800/4165 3416/1791/4156 +f 3385/1760/4125 3376/1751/4116 3370/1745/4110 3386/1761/4126 +f 3426/1801/4166 3427/1802/4167 3428/1803/4168 3429/1804/4169 +f 3430/1805/4170 3426/1801/4166 3429/1804/4169 3431/1806/4171 +f 3432/1807/4172 3430/1805/4170 3431/1806/4171 3433/1808/4173 +f 3434/1809/4174 3432/1807/4172 3433/1808/4173 3435/1810/4175 +f 3436/1811/4176 3437/1812/4177 3427/1802/4167 3426/1801/4166 +f 3438/1813/4178 3436/1811/4176 3426/1801/4166 3430/1805/4170 +f 3439/1814/4179 3438/1813/4178 3430/1805/4170 3432/1807/4172 +f 3440/1815/4180 3439/1814/4179 3432/1807/4172 3434/1809/4174 +f 3441/1816/4181 3442/1817/4182 3437/1812/4177 3436/1811/4176 +f 3443/1818/4183 3441/1816/4181 3436/1811/4176 3438/1813/4178 +f 3444/1819/4184 3443/1818/4183 3438/1813/4178 3439/1814/4179 +f 3445/1820/4185 3444/1819/4184 3439/1814/4179 3440/1815/4180 +f 3446/1821/4186 3447/1822/4187 3442/1817/4182 3441/1816/4181 +f 3448/1823/4188 3446/1821/4186 3441/1816/4181 3443/1818/4183 +f 3449/1824/4189 3448/1823/4188 3443/1818/4183 3444/1819/4184 +f 3450/1825/4190 3449/1824/4189 3444/1819/4184 3445/1820/4185 +f 3428/1803/4168 3451/1826/4191 3452/1827/4192 3453/1828/4193 +f 3454/1829/4194 3455/1830/4195 3456/1831/4196 3435/1810/4175 +f 3450/1825/4190 3457/1832/4197 3280/1655/4020 3279/1654/4019 +f 3278/1653/4018 3277/1652/4017 3458/1833/4198 3447/1822/4187 +f 3429/1804/4169 3428/1803/4168 3453/1828/4193 3459/1834/4199 +f 3435/1810/4175 3456/1831/4196 3460/1835/4200 3434/1809/4174 +f 3449/1824/4189 3450/1825/4190 3279/1654/4019 3296/1671/4036 +f 3447/1822/4187 3458/1833/4198 3461/1836/4201 3442/1817/4182 +f 3431/1806/4171 3429/1804/4169 3459/1834/4199 3462/1837/4202 +f 3434/1809/4174 3460/1835/4200 3463/1838/4203 3440/1815/4180 +f 3448/1823/4188 3449/1824/4189 3296/1671/4036 3292/1667/4032 +f 3442/1817/4182 3461/1836/4201 3464/1839/4204 3437/1812/4177 +f 3433/1808/4173 3431/1806/4171 3462/1837/4202 3465/1840/4205 +f 3440/1815/4180 3463/1838/4203 3466/1841/4206 3445/1820/4185 +f 3446/1821/4186 3448/1823/4188 3292/1667/4032 3288/1663/4028 +f 3437/1812/4177 3464/1839/4204 3467/1842/4207 3427/1802/4167 +f 3435/1810/4175 3433/1808/4173 3465/1840/4205 3454/1829/4194 +f 3445/1820/4185 3466/1841/4206 3457/1832/4197 3450/1825/4190 +f 3447/1822/4187 3446/1821/4186 3288/1663/4028 3278/1653/4018 +f 3427/1802/4167 3467/1842/4207 3451/1826/4191 3428/1803/4168 +f 3468/1843/4208 3469/1844/4209 3470/1845/4210 3471/1846/4211 +f 3472/1847/4212 3468/1843/4208 3471/1846/4211 3473/1848/4213 +f 3474/1849/4214 3472/1847/4212 3473/1848/4213 3475/1850/4215 +f 3476/1851/4216 3474/1849/4214 3475/1850/4215 3477/1852/4217 +f 3478/1853/4218 3479/1854/4219 3469/1844/4209 3468/1843/4208 +f 3480/1855/4220 3478/1853/4218 3468/1843/4208 3472/1847/4212 +f 3481/1856/4221 3480/1855/4220 3472/1847/4212 3474/1849/4214 +f 3482/1857/4222 3481/1856/4221 3474/1849/4214 3476/1851/4216 +f 3483/1858/4223 3484/1859/4224 3479/1854/4219 3478/1853/4218 +f 3485/1860/4225 3483/1858/4223 3478/1853/4218 3480/1855/4220 +f 3486/1861/4226 3485/1860/4225 3480/1855/4220 3481/1856/4221 +f 3487/1862/4227 3486/1861/4226 3481/1856/4221 3482/1857/4222 +f 3488/1863/4228 3489/1864/4229 3484/1859/4224 3483/1858/4223 +f 3490/1865/4230 3488/1863/4228 3483/1858/4223 3485/1860/4225 +f 3491/1866/4231 3490/1865/4230 3485/1860/4225 3486/1861/4226 +f 3492/1867/4232 3491/1866/4231 3486/1861/4226 3487/1862/4227 +f 3470/1845/4210 3456/1831/4196 3455/1830/4195 3493/1868/4233 +f 3494/1869/4234 3495/1870/4235 3496/1871/4236 3477/1852/4217 +f 3492/1867/4232 3497/1872/4237 3327/1702/4067 3326/1701/4066 +f 3325/1700/4065 3280/1655/4020 3457/1832/4197 3489/1864/4229 +f 3471/1846/4211 3470/1845/4210 3493/1868/4233 3498/1873/4238 +f 3477/1852/4217 3496/1871/4236 3499/1874/4239 3476/1851/4216 +f 3491/1866/4231 3492/1867/4232 3326/1701/4066 3339/1714/4079 +f 3489/1864/4229 3457/1832/4197 3466/1841/4206 3484/1859/4224 +f 3473/1848/4213 3471/1846/4211 3498/1873/4238 3500/1875/4240 +f 3476/1851/4216 3499/1874/4239 3501/1876/4241 3482/1857/4222 +f 3490/1865/4230 3491/1866/4231 3339/1714/4079 3336/1711/4076 +f 3484/1859/4224 3466/1841/4206 3463/1838/4203 3479/1854/4219 +f 3475/1850/4215 3473/1848/4213 3500/1875/4240 3502/1877/4242 +f 3482/1857/4222 3501/1876/4241 3503/1878/4243 3487/1862/4227 +f 3488/1863/4228 3490/1865/4230 3336/1711/4076 3333/1708/4073 +f 3479/1854/4219 3463/1838/4203 3460/1835/4200 3469/1844/4209 +f 3477/1852/4217 3475/1850/4215 3502/1877/4242 3494/1869/4234 +f 3487/1862/4227 3503/1878/4243 3497/1872/4237 3492/1867/4232 +f 3489/1864/4229 3488/1863/4228 3333/1708/4073 3325/1700/4065 +f 3469/1844/4209 3460/1835/4200 3456/1831/4196 3470/1845/4210 +f 3504/1879/4244 3505/1880/4245 3506/1881/4246 3507/1882/4247 +f 3508/1883/4248 3504/1879/4244 3507/1882/4247 3509/1884/4249 +f 3510/1885/4250 3508/1883/4248 3509/1884/4249 3511/1886/4251 +f 3512/1887/4252 3510/1885/4250 3511/1886/4251 3513/1888/4253 +f 3514/1889/4254 3515/1890/4255 3505/1880/4245 3504/1879/4244 +f 3516/1891/4256 3514/1889/4254 3504/1879/4244 3508/1883/4248 +f 3517/1892/4257 3516/1891/4256 3508/1883/4248 3510/1885/4250 +f 3518/1893/4258 3517/1892/4257 3510/1885/4250 3512/1887/4252 +f 3519/1894/4259 3520/1895/4260 3515/1890/4255 3514/1889/4254 +f 3521/1896/4261 3519/1894/4259 3514/1889/4254 3516/1891/4256 +f 3522/1897/4262 3521/1896/4261 3516/1891/4256 3517/1892/4257 +f 3523/1898/4263 3522/1897/4262 3517/1892/4257 3518/1893/4258 +f 3524/1899/4264 3525/1900/4265 3520/1895/4260 3519/1894/4259 +f 3526/1901/4266 3524/1899/4264 3519/1894/4259 3521/1896/4261 +f 3527/1902/4267 3526/1901/4266 3521/1896/4261 3522/1897/4262 +f 3528/1903/4268 3527/1902/4267 3522/1897/4262 3523/1898/4263 +f 3506/1881/4246 3496/1871/4236 3495/1870/4235 3529/1904/4269 +f 3530/1905/4270 3531/1906/4271 3532/1907/4272 3513/1888/4253 +f 3528/1903/4268 3533/1908/4273 3369/1744/4109 3368/1743/4108 +f 3367/1742/4107 3327/1702/4067 3497/1872/4237 3525/1900/4265 +f 3507/1882/4247 3506/1881/4246 3529/1904/4269 3534/1909/4274 +f 3513/1888/4253 3532/1907/4272 3535/1910/4275 3512/1887/4252 +f 3527/1902/4267 3528/1903/4268 3368/1743/4108 3381/1756/4121 +f 3525/1900/4265 3497/1872/4237 3503/1878/4243 3520/1895/4260 +f 3509/1884/4249 3507/1882/4247 3534/1909/4274 3536/1911/4276 +f 3512/1887/4252 3535/1910/4275 3537/1912/4277 3518/1893/4258 +f 3526/1901/4266 3527/1902/4267 3381/1756/4121 3378/1753/4118 +f 3520/1895/4260 3503/1878/4243 3501/1876/4241 3515/1890/4255 +f 3511/1886/4251 3509/1884/4249 3536/1911/4276 3538/1913/4278 +f 3518/1893/4258 3537/1912/4277 3539/1914/4279 3523/1898/4263 +f 3524/1899/4264 3526/1901/4266 3378/1753/4118 3375/1750/4115 +f 3515/1890/4255 3501/1876/4241 3499/1874/4239 3505/1880/4245 +f 3513/1888/4253 3511/1886/4251 3538/1913/4278 3530/1905/4270 +f 3523/1898/4263 3539/1914/4279 3533/1908/4273 3528/1903/4268 +f 3525/1900/4265 3524/1899/4264 3375/1750/4115 3367/1742/4107 +f 3505/1880/4245 3499/1874/4239 3496/1871/4236 3506/1881/4246 +f 3540/1915/4280 3541/1916/4281 3542/1917/4282 3543/1918/4283 +f 3544/1919/4284 3540/1915/4280 3543/1918/4283 3545/1920/4285 +f 3546/1921/4286 3544/1919/4284 3545/1920/4285 3547/1922/4287 +f 3548/1923/4288 3546/1921/4286 3547/1922/4287 3549/1924/4289 +f 3550/1925/4290 3551/1926/4291 3541/1916/4281 3540/1915/4280 +f 3552/1927/4292 3550/1925/4290 3540/1915/4280 3544/1919/4284 +f 3553/1928/4293 3552/1927/4292 3544/1919/4284 3546/1921/4286 +f 3554/1929/4294 3553/1928/4293 3546/1921/4286 3548/1923/4288 +f 3555/1930/4295 3556/1931/4296 3551/1926/4291 3550/1925/4290 +f 3557/1932/4297 3555/1930/4295 3550/1925/4290 3552/1927/4292 +f 3558/1933/4298 3557/1932/4297 3552/1927/4292 3553/1928/4293 +f 3559/1934/4299 3558/1933/4298 3553/1928/4293 3554/1929/4294 +f 3560/1935/4300 3561/1936/4301 3556/1931/4296 3555/1930/4295 +f 3562/1937/4302 3560/1935/4300 3555/1930/4295 3557/1932/4297 +f 3563/1938/4303 3562/1937/4302 3557/1932/4297 3558/1933/4298 +f 3564/1939/4304 3563/1938/4303 3558/1933/4298 3559/1934/4299 +f 3542/1917/4282 3532/1907/4272 3531/1906/4271 3565/1940/4305 +f 3566/1941/4306 3567/1942/4307 3568/1943/4308 3549/1924/4289 +f 3564/1939/4304 3569/1944/4309 3411/1786/4151 3410/1785/4150 +f 3409/1784/4149 3369/1744/4109 3533/1908/4273 3561/1936/4301 +f 3543/1918/4283 3542/1917/4282 3565/1940/4305 3570/1945/4310 +f 3549/1924/4289 3568/1943/4308 3571/1946/4311 3548/1923/4288 +f 3563/1938/4303 3564/1939/4304 3410/1785/4150 3423/1798/4163 +f 3561/1936/4301 3533/1908/4273 3539/1914/4279 3556/1931/4296 +f 3545/1920/4285 3543/1918/4283 3570/1945/4310 3572/1947/4312 +f 3548/1923/4288 3571/1946/4311 3573/1948/4313 3554/1929/4294 +f 3562/1937/4302 3563/1938/4303 3423/1798/4163 3420/1795/4160 +f 3556/1931/4296 3539/1914/4279 3537/1912/4277 3551/1926/4291 +f 3547/1922/4287 3545/1920/4285 3572/1947/4312 3574/1949/4314 +f 3554/1929/4294 3573/1948/4313 3575/1950/4315 3559/1934/4299 +f 3560/1935/4300 3562/1937/4302 3420/1795/4160 3417/1792/4157 +f 3551/1926/4291 3537/1912/4277 3535/1910/4275 3541/1916/4281 +f 3549/1924/4289 3547/1922/4287 3574/1949/4314 3566/1941/4306 +f 3559/1934/4299 3575/1950/4315 3569/1944/4309 3564/1939/4304 +f 3561/1936/4301 3560/1935/4300 3417/1792/4157 3409/1784/4149 +f 3541/1916/4281 3535/1910/4275 3532/1907/4272 3542/1917/4282 +f 3576/1628/4316 3577/1627/4317 3578/1626/4318 3579/1629/4319 +f 3579/1629/4319 3578/1626/4318 3580/1630/4320 3581/1631/4321 +f 3581/1631/4321 3580/1630/4320 3582/1632/4322 3583/1633/4323 +f 3583/1633/4323 3582/1632/4322 3584/1634/4324 3585/1635/4325 +f 3577/1627/4317 3586/1637/4326 3587/1636/4327 3578/1626/4318 +f 3578/1626/4318 3587/1636/4327 3588/1638/4328 3580/1630/4320 +f 3580/1630/4320 3588/1638/4328 3589/1639/4329 3582/1632/4322 +f 3582/1632/4322 3589/1639/4329 3590/1640/4330 3584/1634/4324 +f 3586/1637/4326 3591/1642/4331 3592/1641/4332 3587/1636/4327 +f 3587/1636/4327 3592/1641/4332 3593/1643/4333 3588/1638/4328 +f 3588/1638/4328 3593/1643/4333 3594/1644/4334 3589/1639/4329 +f 3589/1639/4329 3594/1644/4334 3595/1645/4335 3590/1640/4330 +f 3591/1642/4331 3596/1647/4336 3597/1646/4337 3592/1641/4332 +f 3592/1641/4332 3597/1646/4337 3598/1648/4338 3593/1643/4333 +f 3593/1643/4333 3598/1648/4338 3599/1649/4339 3594/1644/4334 +f 3594/1644/4334 3599/1649/4339 3600/1650/4340 3595/1645/4335 +f 3601/1652/4341 3602/1651/4342 3576/1628/4316 3603/1653/4343 +f 3604/1656/4344 3605/1655/4345 3606/1654/4346 3585/1635/4325 +f 3607/1658/4347 3608/1657/4348 3600/1650/4340 3609/1659/4349 +f 3610/1662/4350 3611/1661/4351 3612/1660/4352 3596/1647/4336 +f 3603/1653/4343 3576/1628/4316 3579/1629/4319 3613/1663/4353 +f 3614/1664/4354 3604/1656/4344 3585/1635/4325 3584/1634/4324 +f 3609/1659/4349 3600/1650/4340 3599/1649/4339 3615/1665/4355 +f 3616/1666/4356 3610/1662/4350 3596/1647/4336 3591/1642/4331 +f 3613/1663/4353 3579/1629/4319 3581/1631/4321 3617/1667/4357 +f 3618/1668/4358 3614/1664/4354 3584/1634/4324 3590/1640/4330 +f 3615/1665/4355 3599/1649/4339 3598/1648/4338 3619/1669/4359 +f 3620/1670/4360 3616/1666/4356 3591/1642/4331 3586/1637/4326 +f 3617/1667/4357 3581/1631/4321 3583/1633/4323 3621/1671/4361 +f 3622/1672/4362 3618/1668/4358 3590/1640/4330 3595/1645/4335 +f 3619/1669/4359 3598/1648/4338 3597/1646/4337 3623/1673/4363 +f 3624/1674/4364 3620/1670/4360 3586/1637/4326 3577/1627/4317 +f 3621/1671/4361 3583/1633/4323 3585/1635/4325 3606/1654/4346 +f 3608/1657/4348 3622/1672/4362 3595/1645/4335 3600/1650/4340 +f 3623/1673/4363 3597/1646/4337 3596/1647/4336 3612/1660/4352 +f 3602/1651/4342 3624/1674/4364 3577/1627/4317 3576/1628/4316 +f 3625/1677/4365 3626/1676/4366 3627/1675/4367 3628/1678/4368 +f 3628/1678/4368 3627/1675/4367 3629/1679/4369 3630/1680/4370 +f 3630/1680/4370 3629/1679/4369 3631/1681/4371 3632/1682/4372 +f 3632/1682/4372 3631/1681/4371 3633/1683/4373 3634/1684/4374 +f 3626/1676/4366 3635/1686/4375 3636/1685/4376 3627/1675/4367 +f 3627/1675/4367 3636/1685/4376 3637/1687/4377 3629/1679/4369 +f 3629/1679/4369 3637/1687/4377 3638/1688/4378 3631/1681/4371 +f 3631/1681/4371 3638/1688/4378 3639/1689/4379 3633/1683/4373 +f 3635/1686/4375 3640/1691/4380 3641/1690/4381 3636/1685/4376 +f 3636/1685/4376 3641/1690/4381 3642/1692/4382 3637/1687/4377 +f 3637/1687/4377 3642/1692/4382 3643/1693/4383 3638/1688/4378 +f 3638/1688/4378 3643/1693/4383 3644/1694/4384 3639/1689/4379 +f 3640/1691/4380 3645/1696/4385 3646/1695/4386 3641/1690/4381 +f 3641/1690/4381 3646/1695/4386 3647/1697/4387 3642/1692/4382 +f 3642/1692/4382 3647/1697/4387 3648/1698/4388 3643/1693/4383 +f 3643/1693/4383 3648/1698/4388 3649/1699/4389 3644/1694/4384 +f 3605/1655/4345 3604/1656/4344 3625/1677/4365 3650/1700/4390 +f 3651/1703/4391 3652/1702/4392 3653/1701/4393 3634/1684/4374 +f 3654/1705/4394 3655/1704/4395 3649/1699/4389 3656/1706/4396 +f 3608/1657/4348 3607/1658/4347 3657/1707/4397 3645/1696/4385 +f 3650/1700/4390 3625/1677/4365 3628/1678/4368 3658/1708/4398 +f 3659/1709/4399 3651/1703/4391 3634/1684/4374 3633/1683/4373 +f 3656/1706/4396 3649/1699/4389 3648/1698/4388 3660/1710/4400 +f 3622/1672/4362 3608/1657/4348 3645/1696/4385 3640/1691/4380 +f 3658/1708/4398 3628/1678/4368 3630/1680/4370 3661/1711/4401 +f 3662/1712/4402 3659/1709/4399 3633/1683/4373 3639/1689/4379 +f 3660/1710/4400 3648/1698/4388 3647/1697/4387 3663/1713/4403 +f 3618/1668/4358 3622/1672/4362 3640/1691/4380 3635/1686/4375 +f 3661/1711/4401 3630/1680/4370 3632/1682/4372 3664/1714/4404 +f 3665/1715/4405 3662/1712/4402 3639/1689/4379 3644/1694/4384 +f 3663/1713/4403 3647/1697/4387 3646/1695/4386 3666/1716/4406 +f 3614/1664/4354 3618/1668/4358 3635/1686/4375 3626/1676/4366 +f 3664/1714/4404 3632/1682/4372 3634/1684/4374 3653/1701/4393 +f 3655/1704/4395 3665/1715/4405 3644/1694/4384 3649/1699/4389 +f 3666/1716/4406 3646/1695/4386 3645/1696/4385 3657/1707/4397 +f 3604/1656/4344 3614/1664/4354 3626/1676/4366 3625/1677/4365 +f 3667/1719/4407 3668/1718/4408 3669/1717/4409 3670/1720/4410 +f 3670/1720/4410 3669/1717/4409 3671/1721/4411 3672/1722/4412 +f 3672/1722/4412 3671/1721/4411 3673/1723/4413 3674/1724/4414 +f 3674/1724/4414 3673/1723/4413 3675/1725/4415 3676/1726/4416 +f 3668/1718/4408 3677/1728/4417 3678/1727/4418 3669/1717/4409 +f 3669/1717/4409 3678/1727/4418 3679/1729/4419 3671/1721/4411 +f 3671/1721/4411 3679/1729/4419 3680/1730/4420 3673/1723/4413 +f 3673/1723/4413 3680/1730/4420 3681/1731/4421 3675/1725/4415 +f 3677/1728/4417 3682/1733/4422 3683/1732/4423 3678/1727/4418 +f 3678/1727/4418 3683/1732/4423 3684/1734/4424 3679/1729/4419 +f 3679/1729/4419 3684/1734/4424 3685/1735/4425 3680/1730/4420 +f 3680/1730/4420 3685/1735/4425 3686/1736/4426 3681/1731/4421 +f 3682/1733/4422 3687/1738/4427 3688/1737/4428 3683/1732/4423 +f 3683/1732/4423 3688/1737/4428 3689/1739/4429 3684/1734/4424 +f 3684/1734/4424 3689/1739/4429 3690/1740/4430 3685/1735/4425 +f 3685/1735/4425 3690/1740/4430 3691/1741/4431 3686/1736/4426 +f 3652/1702/4392 3651/1703/4391 3667/1719/4407 3692/1742/4432 +f 3693/1745/4433 3694/1744/4434 3695/1743/4435 3676/1726/4416 +f 3696/1747/4436 3697/1746/4437 3691/1741/4431 3698/1748/4438 +f 3655/1704/4395 3654/1705/4394 3699/1749/4439 3687/1738/4427 +f 3692/1742/4432 3667/1719/4407 3670/1720/4410 3700/1750/4440 +f 3701/1751/4441 3693/1745/4433 3676/1726/4416 3675/1725/4415 +f 3698/1748/4438 3691/1741/4431 3690/1740/4430 3702/1752/4442 +f 3665/1715/4405 3655/1704/4395 3687/1738/4427 3682/1733/4422 +f 3700/1750/4440 3670/1720/4410 3672/1722/4412 3703/1753/4443 +f 3704/1754/4444 3701/1751/4441 3675/1725/4415 3681/1731/4421 +f 3702/1752/4442 3690/1740/4430 3689/1739/4429 3705/1755/4445 +f 3662/1712/4402 3665/1715/4405 3682/1733/4422 3677/1728/4417 +f 3703/1753/4443 3672/1722/4412 3674/1724/4414 3706/1756/4446 +f 3707/1757/4447 3704/1754/4444 3681/1731/4421 3686/1736/4426 +f 3705/1755/4445 3689/1739/4429 3688/1737/4428 3708/1758/4448 +f 3659/1709/4399 3662/1712/4402 3677/1728/4417 3668/1718/4408 +f 3706/1756/4446 3674/1724/4414 3676/1726/4416 3695/1743/4435 +f 3697/1746/4437 3707/1757/4447 3686/1736/4426 3691/1741/4431 +f 3708/1758/4448 3688/1737/4428 3687/1738/4427 3699/1749/4439 +f 3651/1703/4391 3659/1709/4399 3668/1718/4408 3667/1719/4407 +f 3709/1761/4449 3710/1760/4450 3711/1759/4451 3712/1762/4452 +f 3712/1762/4452 3711/1759/4451 3713/1763/4453 3714/1764/4454 +f 3714/1764/4454 3713/1763/4453 3715/1765/4455 3716/1766/4456 +f 3716/1766/4456 3715/1765/4455 3717/1767/4457 3718/1768/4458 +f 3710/1760/4450 3719/1770/4459 3720/1769/4460 3711/1759/4451 +f 3711/1759/4451 3720/1769/4460 3721/1771/4461 3713/1763/4453 +f 3713/1763/4453 3721/1771/4461 3722/1772/4462 3715/1765/4455 +f 3715/1765/4455 3722/1772/4462 3723/1773/4463 3717/1767/4457 +f 3719/1770/4459 3724/1775/4464 3725/1774/4465 3720/1769/4460 +f 3720/1769/4460 3725/1774/4465 3726/1776/4466 3721/1771/4461 +f 3721/1771/4461 3726/1776/4466 3727/1777/4467 3722/1772/4462 +f 3722/1772/4462 3727/1777/4467 3728/1778/4468 3723/1773/4463 +f 3724/1775/4464 3729/1780/4469 3730/1779/4470 3725/1774/4465 +f 3725/1774/4465 3730/1779/4470 3731/1781/4471 3726/1776/4466 +f 3726/1776/4466 3731/1781/4471 3732/1782/4472 3727/1777/4467 +f 3727/1777/4467 3732/1782/4472 3733/1783/4473 3728/1778/4468 +f 3694/1744/4434 3693/1745/4433 3709/1761/4449 3734/1784/4474 +f 3735/1787/4475 3736/1786/4476 3737/1785/4477 3718/1768/4458 +f 3738/1789/4478 3739/1788/4479 3733/1783/4473 3740/1790/4480 +f 3697/1746/4437 3696/1747/4436 3741/1791/4481 3729/1780/4469 +f 3734/1784/4474 3709/1761/4449 3712/1762/4452 3742/1792/4482 +f 3743/1793/4483 3735/1787/4475 3718/1768/4458 3717/1767/4457 +f 3740/1790/4480 3733/1783/4473 3732/1782/4472 3744/1794/4484 +f 3707/1757/4447 3697/1746/4437 3729/1780/4469 3724/1775/4464 +f 3742/1792/4482 3712/1762/4452 3714/1764/4454 3745/1795/4485 +f 3746/1796/4486 3743/1793/4483 3717/1767/4457 3723/1773/4463 +f 3744/1794/4484 3732/1782/4472 3731/1781/4471 3747/1797/4487 +f 3704/1754/4444 3707/1757/4447 3724/1775/4464 3719/1770/4459 +f 3745/1795/4485 3714/1764/4454 3716/1766/4456 3748/1798/4488 +f 3749/1799/4489 3746/1796/4486 3723/1773/4463 3728/1778/4468 +f 3747/1797/4487 3731/1781/4471 3730/1779/4470 3750/1800/4490 +f 3701/1751/4441 3704/1754/4444 3719/1770/4459 3710/1760/4450 +f 3748/1798/4488 3716/1766/4456 3718/1768/4458 3737/1785/4477 +f 3739/1788/4479 3749/1799/4489 3728/1778/4468 3733/1783/4473 +f 3750/1800/4490 3730/1779/4470 3729/1780/4469 3741/1791/4481 +f 3693/1745/4433 3701/1751/4441 3710/1760/4450 3709/1761/4449 +f 3751/1803/4491 3752/1802/4492 3753/1801/4493 3754/1804/4494 +f 3754/1804/4494 3753/1801/4493 3755/1805/4495 3756/1806/4496 +f 3756/1806/4496 3755/1805/4495 3757/1807/4497 3758/1808/4498 +f 3758/1808/4498 3757/1807/4497 3759/1809/4499 3760/1810/4500 +f 3752/1802/4492 3761/1812/4501 3762/1811/4502 3753/1801/4493 +f 3753/1801/4493 3762/1811/4502 3763/1813/4503 3755/1805/4495 +f 3755/1805/4495 3763/1813/4503 3764/1814/4504 3757/1807/4497 +f 3757/1807/4497 3764/1814/4504 3765/1815/4505 3759/1809/4499 +f 3761/1812/4501 3766/1817/4506 3767/1816/4507 3762/1811/4502 +f 3762/1811/4502 3767/1816/4507 3768/1818/4508 3763/1813/4503 +f 3763/1813/4503 3768/1818/4508 3769/1819/4509 3764/1814/4504 +f 3764/1814/4504 3769/1819/4509 3770/1820/4510 3765/1815/4505 +f 3766/1817/4506 3771/1822/4511 3772/1821/4512 3767/1816/4507 +f 3767/1816/4507 3772/1821/4512 3773/1823/4513 3768/1818/4508 +f 3768/1818/4508 3773/1823/4513 3774/1824/4514 3769/1819/4509 +f 3769/1819/4509 3774/1824/4514 3775/1825/4515 3770/1820/4510 +f 3776/1827/4516 3777/1826/4517 3751/1803/4491 3778/1828/4518 +f 3779/1831/4519 3780/1830/4520 3781/1829/4521 3760/1810/4500 +f 3605/1655/4345 3782/1832/4522 3775/1825/4515 3606/1654/4346 +f 3783/1833/4523 3601/1652/4341 3603/1653/4343 3771/1822/4511 +f 3778/1828/4518 3751/1803/4491 3754/1804/4494 3784/1834/4524 +f 3785/1835/4525 3779/1831/4519 3760/1810/4500 3759/1809/4499 +f 3606/1654/4346 3775/1825/4515 3774/1824/4514 3621/1671/4361 +f 3786/1836/4526 3783/1833/4523 3771/1822/4511 3766/1817/4506 +f 3784/1834/4524 3754/1804/4494 3756/1806/4496 3787/1837/4527 +f 3788/1838/4528 3785/1835/4525 3759/1809/4499 3765/1815/4505 +f 3621/1671/4361 3774/1824/4514 3773/1823/4513 3617/1667/4357 +f 3789/1839/4529 3786/1836/4526 3766/1817/4506 3761/1812/4501 +f 3787/1837/4527 3756/1806/4496 3758/1808/4498 3790/1840/4530 +f 3791/1841/4531 3788/1838/4528 3765/1815/4505 3770/1820/4510 +f 3617/1667/4357 3773/1823/4513 3772/1821/4512 3613/1663/4353 +f 3792/1842/4532 3789/1839/4529 3761/1812/4501 3752/1802/4492 +f 3790/1840/4530 3758/1808/4498 3760/1810/4500 3781/1829/4521 +f 3782/1832/4522 3791/1841/4531 3770/1820/4510 3775/1825/4515 +f 3613/1663/4353 3772/1821/4512 3771/1822/4511 3603/1653/4343 +f 3777/1826/4517 3792/1842/4532 3752/1802/4492 3751/1803/4491 +f 3793/1845/4533 3794/1844/4534 3795/1843/4535 3796/1846/4536 +f 3796/1846/4536 3795/1843/4535 3797/1847/4537 3798/1848/4538 +f 3798/1848/4538 3797/1847/4537 3799/1849/4539 3800/1850/4540 +f 3800/1850/4540 3799/1849/4539 3801/1851/4541 3802/1852/4542 +f 3794/1844/4534 3803/1854/4543 3804/1853/4544 3795/1843/4535 +f 3795/1843/4535 3804/1853/4544 3805/1855/4545 3797/1847/4537 +f 3797/1847/4537 3805/1855/4545 3806/1856/4546 3799/1849/4539 +f 3799/1849/4539 3806/1856/4546 3807/1857/4547 3801/1851/4541 +f 3803/1854/4543 3808/1859/4548 3809/1858/4549 3804/1853/4544 +f 3804/1853/4544 3809/1858/4549 3810/1860/4550 3805/1855/4545 +f 3805/1855/4545 3810/1860/4550 3811/1861/4551 3806/1856/4546 +f 3806/1856/4546 3811/1861/4551 3812/1862/4552 3807/1857/4547 +f 3808/1859/4548 3813/1864/4553 3814/1863/4554 3809/1858/4549 +f 3809/1858/4549 3814/1863/4554 3815/1865/4555 3810/1860/4550 +f 3810/1860/4550 3815/1865/4555 3816/1866/4556 3811/1861/4551 +f 3811/1861/4551 3816/1866/4556 3817/1867/4557 3812/1862/4552 +f 3780/1830/4520 3779/1831/4519 3793/1845/4533 3818/1868/4558 +f 3819/1871/4559 3820/1870/4560 3821/1869/4561 3802/1852/4542 +f 3652/1702/4392 3822/1872/4562 3817/1867/4557 3653/1701/4393 +f 3782/1832/4522 3605/1655/4345 3650/1700/4390 3813/1864/4553 +f 3818/1868/4558 3793/1845/4533 3796/1846/4536 3823/1873/4563 +f 3824/1874/4564 3819/1871/4559 3802/1852/4542 3801/1851/4541 +f 3653/1701/4393 3817/1867/4557 3816/1866/4556 3664/1714/4404 +f 3791/1841/4531 3782/1832/4522 3813/1864/4553 3808/1859/4548 +f 3823/1873/4563 3796/1846/4536 3798/1848/4538 3825/1875/4565 +f 3826/1876/4566 3824/1874/4564 3801/1851/4541 3807/1857/4547 +f 3664/1714/4404 3816/1866/4556 3815/1865/4555 3661/1711/4401 +f 3788/1838/4528 3791/1841/4531 3808/1859/4548 3803/1854/4543 +f 3825/1875/4565 3798/1848/4538 3800/1850/4540 3827/1877/4567 +f 3828/1878/4568 3826/1876/4566 3807/1857/4547 3812/1862/4552 +f 3661/1711/4401 3815/1865/4555 3814/1863/4554 3658/1708/4398 +f 3785/1835/4525 3788/1838/4528 3803/1854/4543 3794/1844/4534 +f 3827/1877/4567 3800/1850/4540 3802/1852/4542 3821/1869/4561 +f 3822/1872/4562 3828/1878/4568 3812/1862/4552 3817/1867/4557 +f 3658/1708/4398 3814/1863/4554 3813/1864/4553 3650/1700/4390 +f 3779/1831/4519 3785/1835/4525 3794/1844/4534 3793/1845/4533 +f 3829/1881/4569 3830/1880/4570 3831/1879/4571 3832/1882/4572 +f 3832/1882/4572 3831/1879/4571 3833/1883/4573 3834/1884/4574 +f 3834/1884/4574 3833/1883/4573 3835/1885/4575 3836/1886/4576 +f 3836/1886/4576 3835/1885/4575 3837/1887/4577 3838/1888/4578 +f 3830/1880/4570 3839/1890/4579 3840/1889/4580 3831/1879/4571 +f 3831/1879/4571 3840/1889/4580 3841/1891/4581 3833/1883/4573 +f 3833/1883/4573 3841/1891/4581 3842/1892/4582 3835/1885/4575 +f 3835/1885/4575 3842/1892/4582 3843/1893/4583 3837/1887/4577 +f 3839/1890/4579 3844/1895/4584 3845/1894/4585 3840/1889/4580 +f 3840/1889/4580 3845/1894/4585 3846/1896/4586 3841/1891/4581 +f 3841/1891/4581 3846/1896/4586 3847/1897/4587 3842/1892/4582 +f 3842/1892/4582 3847/1897/4587 3848/1898/4588 3843/1893/4583 +f 3844/1895/4584 3849/1900/4589 3850/1899/4590 3845/1894/4585 +f 3845/1894/4585 3850/1899/4590 3851/1901/4591 3846/1896/4586 +f 3846/1896/4586 3851/1901/4591 3852/1902/4592 3847/1897/4587 +f 3847/1897/4587 3852/1902/4592 3853/1903/4593 3848/1898/4588 +f 3820/1870/4560 3819/1871/4559 3829/1881/4569 3854/1904/4594 +f 3855/1907/4595 3856/1906/4596 3857/1905/4597 3838/1888/4578 +f 3694/1744/4434 3858/1908/4598 3853/1903/4593 3695/1743/4435 +f 3822/1872/4562 3652/1702/4392 3692/1742/4432 3849/1900/4589 +f 3854/1904/4594 3829/1881/4569 3832/1882/4572 3859/1909/4599 +f 3860/1910/4600 3855/1907/4595 3838/1888/4578 3837/1887/4577 +f 3695/1743/4435 3853/1903/4593 3852/1902/4592 3706/1756/4446 +f 3828/1878/4568 3822/1872/4562 3849/1900/4589 3844/1895/4584 +f 3859/1909/4599 3832/1882/4572 3834/1884/4574 3861/1911/4601 +f 3862/1912/4602 3860/1910/4600 3837/1887/4577 3843/1893/4583 +f 3706/1756/4446 3852/1902/4592 3851/1901/4591 3703/1753/4443 +f 3826/1876/4566 3828/1878/4568 3844/1895/4584 3839/1890/4579 +f 3861/1911/4601 3834/1884/4574 3836/1886/4576 3863/1913/4603 +f 3864/1914/4604 3862/1912/4602 3843/1893/4583 3848/1898/4588 +f 3703/1753/4443 3851/1901/4591 3850/1899/4590 3700/1750/4440 +f 3824/1874/4564 3826/1876/4566 3839/1890/4579 3830/1880/4570 +f 3863/1913/4603 3836/1886/4576 3838/1888/4578 3857/1905/4597 +f 3858/1908/4598 3864/1914/4604 3848/1898/4588 3853/1903/4593 +f 3700/1750/4440 3850/1899/4590 3849/1900/4589 3692/1742/4432 +f 3819/1871/4559 3824/1874/4564 3830/1880/4570 3829/1881/4569 +f 3865/1917/4605 3866/1916/4606 3867/1915/4607 3868/1918/4608 +f 3868/1918/4608 3867/1915/4607 3869/1919/4609 3870/1920/4610 +f 3870/1920/4610 3869/1919/4609 3871/1921/4611 3872/1922/4612 +f 3872/1922/4612 3871/1921/4611 3873/1923/4613 3874/1924/4614 +f 3866/1916/4606 3875/1926/4615 3876/1925/4616 3867/1915/4607 +f 3867/1915/4607 3876/1925/4616 3877/1927/4617 3869/1919/4609 +f 3869/1919/4609 3877/1927/4617 3878/1928/4618 3871/1921/4611 +f 3871/1921/4611 3878/1928/4618 3879/1929/4619 3873/1923/4613 +f 3875/1926/4615 3880/1931/4620 3881/1930/4621 3876/1925/4616 +f 3876/1925/4616 3881/1930/4621 3882/1932/4622 3877/1927/4617 +f 3877/1927/4617 3882/1932/4622 3883/1933/4623 3878/1928/4618 +f 3878/1928/4618 3883/1933/4623 3884/1934/4624 3879/1929/4619 +f 3880/1931/4620 3885/1936/4625 3886/1935/4626 3881/1930/4621 +f 3881/1930/4621 3886/1935/4626 3887/1937/4627 3882/1932/4622 +f 3882/1932/4622 3887/1937/4627 3888/1938/4628 3883/1933/4623 +f 3883/1933/4623 3888/1938/4628 3889/1939/4629 3884/1934/4624 +f 3856/1906/4596 3855/1907/4595 3865/1917/4605 3890/1940/4630 +f 3891/1943/4631 3892/1942/4632 3893/1941/4633 3874/1924/4614 +f 3736/1786/4476 3894/1944/4634 3889/1939/4629 3737/1785/4477 +f 3858/1908/4598 3694/1744/4434 3734/1784/4474 3885/1936/4625 +f 3890/1940/4630 3865/1917/4605 3868/1918/4608 3895/1945/4635 +f 3896/1946/4636 3891/1943/4631 3874/1924/4614 3873/1923/4613 +f 3737/1785/4477 3889/1939/4629 3888/1938/4628 3748/1798/4488 +f 3864/1914/4604 3858/1908/4598 3885/1936/4625 3880/1931/4620 +f 3895/1945/4635 3868/1918/4608 3870/1920/4610 3897/1947/4637 +f 3898/1948/4638 3896/1946/4636 3873/1923/4613 3879/1929/4619 +f 3748/1798/4488 3888/1938/4628 3887/1937/4627 3745/1795/4485 +f 3862/1912/4602 3864/1914/4604 3880/1931/4620 3875/1926/4615 +f 3897/1947/4637 3870/1920/4610 3872/1922/4612 3899/1949/4639 +f 3900/1950/4640 3898/1948/4638 3879/1929/4619 3884/1934/4624 +f 3745/1795/4485 3887/1937/4627 3886/1935/4626 3742/1792/4482 +f 3860/1910/4600 3862/1912/4602 3875/1926/4615 3866/1916/4606 +f 3899/1949/4639 3872/1922/4612 3874/1924/4614 3893/1941/4633 +f 3894/1944/4634 3900/1950/4640 3884/1934/4624 3889/1939/4629 +f 3742/1792/4482 3886/1935/4626 3885/1936/4625 3734/1784/4474 +f 3855/1907/4595 3860/1910/4600 3866/1916/4606 3865/1917/4605 +s 2 +f 3602/1651/4641 3601/1652/4642 3277/1652/4643 3276/1651/4644 +s 4 +f 3607/1658/4645 3609/1659/4646 3284/1659/4647 3283/1658/4648 +f 3612/1660/4649 3611/1661/4650 3286/1661/4651 3285/1660/4652 +s 2 +f 3611/1661/4653 3610/1662/4654 3287/1662/4655 3286/1661/4656 +s 4 +f 3609/1659/4646 3615/1665/4657 3290/1665/4658 3284/1659/4647 +s 2 +f 3610/1662/4654 3616/1666/4659 3291/1666/4660 3287/1662/4655 +s 4 +f 3615/1665/4657 3619/1669/4661 3294/1669/4662 3290/1665/4658 +s 2 +f 3616/1666/4659 3620/1670/4663 3295/1670/4664 3291/1666/4660 +s 4 +f 3619/1669/4661 3623/1673/4665 3298/1673/4666 3294/1669/4662 +s 2 +f 3620/1670/4663 3624/1674/4667 3299/1674/4668 3295/1670/4664 +s 4 +f 3623/1673/4665 3612/1660/4649 3285/1660/4652 3298/1673/4666 +s 2 +f 3624/1674/4667 3602/1651/4641 3276/1651/4644 3299/1674/4668 +s 4 +f 3654/1705/4669 3656/1706/4670 3331/1706/4671 3330/1705/4672 +f 3657/1707/4673 3607/1658/4645 3283/1658/4648 3332/1707/4674 +f 3656/1706/4670 3660/1710/4675 3335/1710/4676 3331/1706/4671 +f 3660/1710/4675 3663/1713/4677 3338/1713/4678 3335/1710/4676 +f 3663/1713/4677 3666/1716/4679 3341/1716/4680 3338/1713/4678 +f 3666/1716/4679 3657/1707/4673 3332/1707/4674 3341/1716/4680 +f 3696/1747/4681 3698/1748/4682 3373/1748/4683 3372/1747/4684 +f 3699/1749/4685 3654/1705/4669 3330/1705/4672 3374/1749/4686 +f 3698/1748/4682 3702/1752/4687 3377/1752/4688 3373/1748/4683 +f 3702/1752/4687 3705/1755/4689 3380/1755/4690 3377/1752/4688 +f 3705/1755/4689 3708/1758/4691 3383/1758/4692 3380/1755/4690 +f 3708/1758/4691 3699/1749/4685 3374/1749/4686 3383/1758/4692 +f 3736/1786/4693 3735/1787/4694 3412/1787/4695 3411/1786/4696 +f 3738/1789/4697 3740/1790/4698 3415/1790/4699 3414/1789/4700 +f 3739/1788/4701 3738/1789/4697 3414/1789/4700 3413/1788/4702 +f 3741/1791/4703 3696/1747/4681 3372/1747/4684 3416/1791/4704 +f 3735/1787/4694 3743/1793/4705 3418/1793/4706 3412/1787/4695 +f 3740/1790/4698 3744/1794/4707 3419/1794/4708 3415/1790/4699 +f 3743/1793/4705 3746/1796/4709 3421/1796/4710 3418/1793/4706 +f 3744/1794/4707 3747/1797/4711 3422/1797/4712 3419/1794/4708 +f 3746/1796/4709 3749/1799/4713 3424/1799/4714 3421/1796/4710 +f 3747/1797/4711 3750/1800/4715 3425/1800/4716 3422/1797/4712 +f 3749/1799/4713 3739/1788/4701 3413/1788/4702 3424/1799/4714 +f 3750/1800/4715 3741/1791/4703 3416/1791/4704 3425/1800/4716 +f 3776/1827/4717 3778/1828/4718 3453/1828/4719 3452/1827/4720 +s 2 +f 3777/1826/4721 3776/1827/4722 3452/1827/4723 3451/1826/4724 +s 4 +f 3781/1829/4725 3780/1830/4726 3455/1830/4727 3454/1829/4728 +s 2 +f 3601/1652/4642 3783/1833/4729 3458/1833/4730 3277/1652/4643 +s 4 +f 3778/1828/4718 3784/1834/4731 3459/1834/4732 3453/1828/4719 +s 2 +f 3783/1833/4729 3786/1836/4733 3461/1836/4734 3458/1833/4730 +s 4 +f 3784/1834/4731 3787/1837/4735 3462/1837/4736 3459/1834/4732 +s 2 +f 3786/1836/4733 3789/1839/4737 3464/1839/4738 3461/1836/4734 +s 4 +f 3787/1837/4735 3790/1840/4739 3465/1840/4740 3462/1837/4736 +s 2 +f 3789/1839/4737 3792/1842/4741 3467/1842/4742 3464/1839/4738 +s 4 +f 3790/1840/4739 3781/1829/4725 3454/1829/4728 3465/1840/4740 +s 2 +f 3792/1842/4741 3777/1826/4721 3451/1826/4724 3467/1842/4742 +s 4 +f 3780/1830/4726 3818/1868/4743 3493/1868/4744 3455/1830/4727 +f 3821/1869/4745 3820/1870/4746 3495/1870/4747 3494/1869/4748 +f 3818/1868/4743 3823/1873/4749 3498/1873/4750 3493/1868/4744 +f 3823/1873/4749 3825/1875/4751 3500/1875/4752 3498/1873/4750 +f 3825/1875/4751 3827/1877/4753 3502/1877/4754 3500/1875/4752 +f 3827/1877/4753 3821/1869/4745 3494/1869/4748 3502/1877/4754 +f 3820/1870/4746 3854/1904/4755 3529/1904/4756 3495/1870/4747 +f 3857/1905/4757 3856/1906/4758 3531/1906/4759 3530/1905/4760 +f 3854/1904/4755 3859/1909/4761 3534/1909/4762 3529/1904/4756 +f 3859/1909/4761 3861/1911/4763 3536/1911/4764 3534/1909/4762 +f 3861/1911/4763 3863/1913/4765 3538/1913/4766 3536/1911/4764 +f 3863/1913/4765 3857/1905/4757 3530/1905/4760 3538/1913/4766 +f 3856/1906/4758 3890/1940/4767 3565/1940/4768 3531/1906/4759 +f 3893/1941/4769 3892/1942/4770 3567/1942/4771 3566/1941/4772 +f 3892/1942/4770 3891/1943/4773 3568/1943/4774 3567/1942/4771 +f 3894/1944/4775 3736/1786/4693 3411/1786/4696 3569/1944/4776 +f 3890/1940/4767 3895/1945/4777 3570/1945/4778 3565/1940/4768 +f 3891/1943/4773 3896/1946/4779 3571/1946/4780 3568/1943/4774 +f 3895/1945/4777 3897/1947/4781 3572/1947/4782 3570/1945/4778 +f 3896/1946/4779 3898/1948/4783 3573/1948/4784 3571/1946/4780 +f 3897/1947/4781 3899/1949/4785 3574/1949/4786 3572/1947/4782 +f 3898/1948/4783 3900/1950/4787 3575/1950/4788 3573/1948/4784 +f 3899/1949/4785 3893/1941/4769 3566/1941/4772 3574/1949/4786 +f 3900/1950/4787 3894/1944/4775 3569/1944/4776 3575/1950/4788 +# 648 polygons + +# +# object lotu_petal_06 +# + +v -0.2176 0.0613 0.0694 +v -0.1564 0.0641 0.0906 +v -0.0945 0.0466 0.0389 +v -0.1535 0.0405 0.0006 +v -0.2902 0.0703 0.0376 +v -0.2177 0.0480 -0.0349 +v -0.3666 0.0710 -0.0052 +v -0.2843 0.0607 -0.0795 +v -0.4424 0.0822 -0.0550 +v -0.3557 0.0695 -0.1390 +v -0.2914 0.0906 0.1328 +v -0.2194 0.0852 0.1517 +v -0.3673 0.0928 0.1088 +v -0.4473 0.0883 0.0715 +v -0.5268 0.0940 0.0300 +v -0.3589 0.1023 0.2013 +v -0.2788 0.1119 0.2056 +v -0.4433 0.1081 0.1750 +v -0.5307 0.1140 0.1513 +v -0.6173 0.1168 0.1139 +v -0.4330 0.1289 0.2567 +v -0.3449 0.1292 0.2673 +v -0.5219 0.1373 0.2499 +v -0.6080 0.1494 0.2307 +v -0.6992 0.1523 0.2147 +v -0.0469 0.0459 0.0702 +v 0.0007 0.0413 0.0239 +v -0.0447 0.0396 -0.0109 +v -0.2737 0.0593 -0.2218 +v -0.3459 0.0885 -0.2933 +v -0.4379 0.0954 -0.2050 +v -0.7974 0.1429 0.1734 +v -0.8778 0.1950 0.2520 +v -0.7787 0.1881 0.3033 +v -0.3928 0.1631 0.3131 +v -0.3017 0.1752 0.2934 +v -0.2569 0.1378 0.2527 +v -0.0924 0.0357 -0.0550 +v -0.5206 0.0996 -0.1129 +v -0.6809 0.1909 0.3203 +v -0.1982 0.1074 0.2045 +v -0.1437 0.0362 -0.1086 +v -0.6151 0.1033 -0.0205 +v -0.5828 0.1871 0.3158 +v -0.1504 0.0845 0.1567 +v -0.2054 0.0436 -0.1600 +v -0.7116 0.1198 0.0831 +v -0.4865 0.1745 0.3146 +v -0.0992 0.0627 0.1137 +v -0.6920 0.1291 -0.2372 +v -0.6084 0.1174 -0.1775 +v -0.5125 0.1201 -0.2751 +v -0.6064 0.1308 -0.3508 +v -0.7905 0.1464 -0.3176 +v -0.6944 0.1439 -0.4179 +v -0.8860 0.1724 -0.4206 +v -0.7879 0.1732 -0.5101 +v -0.9971 0.2222 -0.5397 +v -0.8934 0.2068 -0.6273 +v -0.7895 0.1291 -0.1374 +v -0.6994 0.1085 -0.0682 +v -0.8807 0.1548 -0.2269 +v -0.9806 0.1916 -0.3328 +v -1.0900 0.2531 -0.4540 +v -0.8854 0.1469 -0.0485 +v -0.7984 0.1292 0.0277 +v -0.9751 0.1727 -0.1404 +v -1.0753 0.2063 -0.2455 +v -1.1758 0.2662 -0.3654 +v -0.9876 0.1834 0.0338 +v -0.8942 0.1626 0.1096 +v -1.0751 0.2120 -0.0553 +v -1.1630 0.2464 -0.1595 +v -1.2618 0.2948 -0.2657 +v -0.4340 0.1153 -0.3711 +v -0.7896 0.2178 -0.7110 +v -0.9041 0.2836 -0.8382 +v -0.9994 0.2719 -0.7594 +v -1.3672 0.3744 -0.3892 +v -1.4571 0.4105 -0.2843 +v -1.3512 0.3487 -0.1691 +v -0.9724 0.2088 0.1893 +v -0.5141 0.1238 -0.4479 +v -1.1016 0.2801 -0.6771 +v -1.2629 0.3004 -0.0643 +v -0.5986 0.1415 -0.5322 +v -1.2048 0.3073 -0.5856 +v -1.1718 0.2661 0.0258 +v -0.6936 0.1724 -0.6078 +v -1.2941 0.3404 -0.4909 +v -1.0709 0.2364 0.1116 +v -1.3535 0.4741 -0.9852 +v -1.2170 0.3709 -0.8256 +v -1.1255 0.3734 -0.9177 +v -1.2745 0.4782 -1.0781 +v -1.4892 0.6126 -1.1387 +v -1.4203 0.5958 -1.2305 +v -1.6174 0.7567 -1.2744 +v -1.5360 0.7310 -1.3689 +v -1.7150 0.8930 -1.3901 +v -1.6389 0.8734 -1.4733 +v -1.4436 0.4874 -0.8900 +v -1.3173 0.3807 -0.7340 +v -1.5634 0.6315 -1.0362 +v -1.6916 0.7770 -1.1814 +v -1.7855 0.9212 -1.3018 +v -1.5265 0.5193 -0.7832 +v -1.4136 0.4118 -0.6329 +v -1.6387 0.6587 -0.9321 +v -1.7599 0.8022 -1.0715 +v -1.8485 0.9359 -1.2072 +v -1.6069 0.5567 -0.6740 +v -1.4945 0.4603 -0.5287 +v -1.7220 0.6809 -0.8277 +v -1.8173 0.8357 -0.9663 +v -1.9010 0.9779 -1.1082 +v -1.0366 0.3757 -1.0026 +v -1.5691 0.8691 -1.5544 +v -1.6691 0.9874 -1.6393 +v -1.7320 1.0107 -1.5688 +v -1.9640 1.1014 -1.2314 +v -2.0063 1.1343 -1.1357 +v -1.9607 1.0074 -1.0103 +v -1.5697 0.4980 -0.4173 +v -1.1921 0.4872 -1.1668 +v -1.7927 1.0222 -1.4898 +v -1.8945 0.8734 -0.8678 +v -1.3373 0.6058 -1.3063 +v -1.8547 1.0430 -1.4074 +v -1.8059 0.7323 -0.7133 +v -1.4480 0.7307 -1.4480 +v -1.9175 1.0668 -1.3260 +v -1.6921 0.6029 -0.5645 +v -1.9209 1.2687 -1.6602 +v -1.8655 1.1465 -1.5822 +v -1.8089 1.1240 -1.6515 +v -1.8752 1.2483 -1.7235 +v -1.9677 1.3825 -1.7328 +v -1.9319 1.3742 -1.7829 +v -1.9836 1.4941 -1.8105 +v -1.9514 1.4915 -1.8501 +v -1.9917 1.6004 -1.8714 +v -1.9699 1.5970 -1.9008 +v -1.9596 1.2867 -1.5953 +v -1.9114 1.1583 -1.5047 +v -1.9979 1.3958 -1.6750 +v -2.0150 1.5026 -1.7634 +v -2.0125 1.6017 -1.8368 +v -1.9959 1.2974 -1.5245 +v -1.9541 1.1790 -1.4310 +v -2.0253 1.4122 -1.6151 +v -2.0399 1.5163 -1.7138 +v -2.0361 1.5997 -1.7990 +v -2.0343 1.3149 -1.4454 +v -2.0053 1.2097 -1.3461 +v -2.0578 1.4198 -1.5504 +v -2.0584 1.5212 -1.6648 +v -2.0504 1.5980 -1.7640 +v -1.7442 1.1103 -1.7150 +v -1.9544 1.5917 -1.9211 +v -1.9705 1.6963 -1.9433 +v -1.9854 1.6977 -1.9283 +v -2.0196 1.6733 -1.8588 +v -2.0249 1.6547 -1.8433 +v -2.0563 1.5988 -1.7333 +v -2.0442 1.2395 -1.2547 +v -1.8268 1.2372 -1.7837 +v -1.9987 1.6967 -1.9113 +v -2.0767 1.5195 -1.6175 +v -1.8864 1.3657 -1.8309 +v -2.0086 1.6935 -1.8941 +v -2.0806 1.4303 -1.4910 +v -1.9263 1.4842 -1.8801 +v -2.0164 1.6861 -1.8769 +v -2.0669 1.3375 -1.3678 +v 0.1667 0.1038 -0.3074 +v 0.1725 0.0975 -0.2316 +v 0.2323 0.1429 -0.2888 +v 0.2244 0.1557 -0.3752 +v 0.1350 0.1133 -0.3868 +v 0.2094 0.1632 -0.4645 +v 0.1009 0.1201 -0.4726 +v 0.1837 0.1591 -0.5544 +v 0.0605 0.1255 -0.5634 +v 0.1477 0.1522 -0.6447 +v 0.0967 0.0672 -0.2442 +v 0.1223 0.0721 -0.1725 +v 0.0698 0.0718 -0.3229 +v 0.0191 0.0893 -0.3983 +v -0.0288 0.0970 -0.4760 +v 0.0337 0.0424 -0.1814 +v 0.0654 0.0507 -0.1194 +v -0.0046 0.0418 -0.2467 +v -0.0492 0.0624 -0.3167 +v -0.1148 0.0806 -0.3938 +v -0.0290 0.0308 -0.1146 +v 0.0078 0.0385 -0.0642 +v -0.0752 0.0307 -0.1738 +v -0.1274 0.0373 -0.2415 +v -0.1874 0.0645 -0.3077 +v 0.2168 0.1394 -0.2012 +v 0.2637 0.1857 -0.2437 +v 0.2829 0.1932 -0.3357 +v 0.2441 0.2064 -0.7277 +v 0.2015 0.2200 -0.8266 +v 0.1064 0.1683 -0.7410 +v -0.2681 0.0920 -0.3822 +v 0.0433 0.0453 -0.0207 +v 0.2888 0.2022 -0.4300 +v 0.0086 0.1324 -0.6504 +v 0.0876 0.0566 -0.0616 +v 0.2803 0.2104 -0.5269 +v -0.0820 0.1063 -0.5614 +v 0.1331 0.0774 -0.1038 +v 0.2678 0.2067 -0.6256 +v -0.1784 0.1011 -0.4711 +v 0.1776 0.0999 -0.1523 +v -0.1146 0.1579 -0.8300 +v -0.0441 0.1475 -0.7405 +v 0.0522 0.1819 -0.8441 +v -0.0070 0.2015 -0.9372 +v -0.1866 0.1990 -0.9290 +v -0.0869 0.2411 -1.0262 +v -0.2815 0.2460 -1.0322 +v -0.1620 0.2798 -1.1281 +v -0.3726 0.2915 -1.1350 +v -0.2694 0.3219 -1.2309 +v -0.2129 0.1332 -0.7323 +v -0.1485 0.1309 -0.6434 +v -0.2970 0.1657 -0.8293 +v -0.3831 0.2046 -0.9331 +v -0.4892 0.2652 -1.0412 +v -0.3210 0.1247 -0.6347 +v -0.2433 0.1154 -0.5516 +v -0.3969 0.1422 -0.7349 +v -0.4919 0.1731 -0.8349 +v -0.5900 0.2359 -0.9309 +v -0.4172 0.1198 -0.5484 +v -0.3430 0.1177 -0.4571 +v -0.5030 0.1388 -0.6327 +v -0.5915 0.1672 -0.7243 +v -0.6957 0.2161 -0.8108 +v 0.1541 0.2252 -0.9276 +v -0.1445 0.3534 -1.3227 +v -0.2505 0.4115 -1.4227 +v -0.3703 0.3885 -1.3325 +v -0.8046 0.2963 -0.9270 +v 0.0893 0.2442 -1.0296 +v -0.4926 0.3539 -1.2416 +v 0.0279 0.2763 -1.1371 +v -0.6010 0.3279 -1.1316 +v -0.0616 0.3145 -1.2273 +v -0.7051 0.3129 -1.0189 +v -0.7525 0.5327 -1.4717 +v -0.6153 0.4302 -1.3439 +v -0.4944 0.4712 -1.4452 +v -0.6430 0.5567 -1.5628 +v -0.9065 0.6465 -1.6140 +v -0.8038 0.6743 -1.7011 +v -1.0640 0.7953 -1.7171 +v -0.9589 0.8140 -1.7841 +v -1.2080 0.9289 -1.8100 +v -1.1136 0.9632 -1.8601 +v -0.8722 0.5207 -1.3914 +v -0.7316 0.4190 -1.2377 +v -1.0130 0.6333 -1.5408 +v -1.1693 0.7752 -1.6619 +v -1.3049 0.9076 -1.7580 +v -0.9883 0.5073 -1.3142 +v -0.8456 0.4214 -1.1561 +v -1.1199 0.6314 -1.4640 +v -1.2740 0.7493 -1.5983 +v -1.3984 0.8803 -1.7026 +v -1.0932 0.5046 -1.2406 +v -0.9391 0.3887 -1.0727 +v -1.2308 0.6135 -1.3921 +v -1.3596 0.7354 -1.5253 +v -1.4928 0.8686 -1.6348 +v -0.3754 0.4957 -1.5339 +v -1.0113 0.9915 -1.9190 +v -1.1533 1.1174 -1.9762 +v -1.2498 1.0723 -1.9362 +v -1.5913 0.9919 -1.7115 +v -0.5277 0.6006 -1.6509 +v -1.3406 1.0421 -1.8961 +v -0.6917 0.7192 -1.7730 +v -1.4252 1.0202 -1.8378 +v -0.8529 0.8541 -1.8561 +v -1.5148 0.9988 -1.7774 +v -1.5664 1.2441 -1.9800 +v -1.4640 1.1482 -1.9303 +v -1.3851 1.1751 -1.9781 +v -1.4875 1.2742 -2.0185 +v -1.6626 1.3520 -1.9947 +v -1.6023 1.3623 -2.0294 +v -1.7539 1.4710 -2.0031 +v -1.7010 1.4648 -2.0330 +v -1.8329 1.5740 -2.0021 +v -1.7992 1.5649 -2.0163 +v -1.6384 1.2293 -1.9343 +v -1.5342 1.1233 -1.8823 +v -1.7215 1.3552 -1.9502 +v -1.8051 1.4746 -1.9703 +v -1.8689 1.5831 -1.9813 +v -1.7049 1.2212 -1.8795 +v -1.6089 1.1066 -1.8326 +v -1.7839 1.3554 -1.9100 +v -1.8523 1.4774 -1.9391 +v -1.9027 1.5854 -1.9620 +v -1.7686 1.2285 -1.8304 +v -1.6778 1.1068 -1.7791 +v -1.8399 1.3622 -1.8736 +v -1.8963 1.4800 -1.9063 +v -1.9347 1.5885 -1.9407 +v -1.2937 1.2227 -2.0179 +v -1.7668 1.5545 -2.0304 +v -1.8648 1.6468 -2.0137 +v -1.8870 1.6575 -2.0022 +v -1.9562 1.6937 -1.9566 +v -1.4102 1.3060 -2.0457 +v -1.9072 1.6681 -1.9913 +v -1.5411 1.3857 -2.0597 +v -1.9253 1.6779 -1.9799 +v -1.6533 1.4598 -2.0498 +v -1.9418 1.6869 -1.9685 +v -0.0955 0.0204 0.0395 +v -0.1577 0.0380 0.0936 +v -0.2189 0.0350 0.0706 +v -0.1539 0.0138 0.0017 +v -0.2900 0.0436 0.0417 +v -0.2181 0.0212 -0.0368 +v -0.3684 0.0446 -0.0038 +v -0.2836 0.0339 -0.0801 +v -0.4464 0.0550 -0.0534 +v -0.3576 0.0431 -0.1403 +v -0.2215 0.0599 0.1590 +v -0.2931 0.0649 0.1426 +v -0.3706 0.0667 0.1119 +v -0.4470 0.0619 0.0761 +v -0.5319 0.0671 0.0324 +v -0.2814 0.0860 0.2184 +v -0.3607 0.0755 0.2102 +v -0.4451 0.0817 0.1850 +v -0.5322 0.0873 0.1579 +v -0.6203 0.0909 0.1200 +v -0.3403 0.1042 0.2812 +v -0.4306 0.1054 0.2704 +v -0.5229 0.1119 0.2622 +v -0.6124 0.1226 0.2377 +v -0.7033 0.1263 0.2195 +v 0.0001 0.0144 0.0205 +v -0.0473 0.0193 0.0708 +v -0.0434 0.0126 -0.0139 +v -0.4362 0.0694 -0.2066 +v -0.3456 0.0626 -0.2976 +v -0.2721 0.0329 -0.2249 +v -0.8856 0.1707 0.2564 +v -0.8039 0.1174 0.1775 +v -0.7892 0.1634 0.3101 +v -0.2503 0.1160 0.2698 +v -0.2955 0.1577 0.3158 +v -0.3907 0.1412 0.3314 +v -0.0905 0.0086 -0.0572 +v -0.5232 0.0728 -0.1134 +v -0.6856 0.1670 0.3332 +v -0.2003 0.0827 0.2165 +v -0.1408 0.0092 -0.1103 +v -0.6197 0.0756 -0.0183 +v -0.5853 0.1654 0.3309 +v -0.1514 0.0577 0.1646 +v -0.2043 0.0166 -0.1646 +v -0.7128 0.0929 0.0850 +v -0.4872 0.1562 0.3328 +v -0.0987 0.0365 0.1182 +v -0.5168 0.0930 -0.2784 +v -0.6132 0.0899 -0.1781 +v -0.6970 0.1030 -0.2400 +v -0.6124 0.1035 -0.3531 +v -0.7981 0.1199 -0.3224 +v -0.7017 0.1170 -0.4241 +v -0.8954 0.1459 -0.4236 +v -0.7948 0.1470 -0.5158 +v -0.9997 0.1981 -0.5445 +v -0.8996 0.1808 -0.6320 +v -0.7043 0.0811 -0.0683 +v -0.7973 0.1019 -0.1391 +v -0.8865 0.1286 -0.2259 +v -0.9914 0.1656 -0.3342 +v -1.0984 0.2285 -0.4565 +v -0.8035 0.1022 0.0280 +v -0.8947 0.1203 -0.0455 +v -0.9859 0.1476 -0.1388 +v -1.0847 0.1810 -0.2462 +v -1.1876 0.2423 -0.3666 +v -0.9031 0.1365 0.1148 +v -0.9963 0.1576 0.0362 +v -1.0856 0.1877 -0.0533 +v -1.1747 0.2221 -0.1581 +v -1.2760 0.2708 -0.2633 +v -0.4371 0.0884 -0.3748 +v -1.0087 0.2476 -0.7654 +v -0.9125 0.2582 -0.8476 +v -0.7992 0.1915 -0.7177 +v -1.4683 0.3875 -0.2825 +v -1.3806 0.3516 -0.3921 +v -1.3609 0.3259 -0.1684 +v -0.9844 0.1837 0.1924 +v -0.5209 0.0963 -0.4522 +v -1.1088 0.2560 -0.6813 +v -1.2747 0.2772 -0.0592 +v -0.6027 0.1152 -0.5381 +v -1.2142 0.2821 -0.5881 +v -1.1853 0.2414 0.0290 +v -0.6985 0.1466 -0.6148 +v -1.3042 0.3164 -0.4914 +v -1.0798 0.2117 0.1172 +v -1.1366 0.3491 -0.9259 +v -1.2253 0.3479 -0.8319 +v -1.3660 0.4507 -0.9956 +v -1.2849 0.4558 -1.0876 +v -1.5030 0.5911 -1.1501 +v -1.4350 0.5720 -1.2456 +v -1.6340 0.7363 -1.2883 +v -1.5510 0.7094 -1.3794 +v -1.7343 0.8736 -1.4045 +v -1.6529 0.8533 -1.4904 +v -1.3256 0.3567 -0.7394 +v -1.4592 0.4654 -0.8983 +v -1.5779 0.6127 -1.0453 +v -1.7104 0.7577 -1.1911 +v -1.8040 0.9010 -1.3131 +v -1.4258 0.3889 -0.6357 +v -1.5419 0.4976 -0.7897 +v -1.6568 0.6371 -0.9396 +v -1.7781 0.7832 -1.0825 +v -1.8681 0.9194 -1.2163 +v -1.5104 0.4372 -0.5301 +v -1.6208 0.5366 -0.6814 +v -1.7383 0.6620 -0.8339 +v -1.8344 0.8187 -0.9742 +v -1.9224 0.9630 -1.1171 +v -1.0444 0.3529 -1.0083 +v -1.7495 0.9901 -1.5843 +v -1.6822 0.9690 -1.6554 +v -1.5826 0.8481 -1.5714 +v -2.0302 1.1152 -1.1465 +v -1.9839 1.0838 -1.2395 +v -1.9799 0.9907 -1.0194 +v -1.5825 0.4750 -0.4194 +v -1.2022 0.4649 -1.1772 +v -1.8107 1.0027 -1.5028 +v -1.9100 0.8539 -0.8749 +v -1.3457 0.5843 -1.3180 +v -1.8717 1.0259 -1.4212 +v -1.8233 0.7144 -0.7211 +v -1.4607 0.7066 -1.4635 +v -1.9370 1.0506 -1.3365 +v -1.7074 0.5835 -0.5737 +v -1.8250 1.1035 -1.6663 +v -1.8846 1.1306 -1.5965 +v -1.9411 1.2514 -1.6736 +v -1.8935 1.2337 -1.7388 +v -1.9899 1.3691 -1.7451 +v -1.9513 1.3608 -1.7991 +v -2.0049 1.4816 -1.8250 +v -1.9742 1.4762 -1.8655 +v -2.0128 1.5914 -1.8864 +v -1.9929 1.5848 -1.9165 +v -1.9314 1.1420 -1.5170 +v -1.9819 1.2733 -1.6094 +v -2.0233 1.3856 -1.6851 +v -2.0384 1.4880 -1.7755 +v -2.0366 1.5906 -1.8495 +v -1.9773 1.1631 -1.4396 +v -2.0194 1.2826 -1.5345 +v -2.0479 1.3992 -1.6235 +v -2.0652 1.5050 -1.7251 +v -2.0578 1.5929 -1.8124 +v -2.0305 1.1929 -1.3565 +v -2.0566 1.3011 -1.4594 +v -2.0805 1.4057 -1.5586 +v -2.0829 1.5130 -1.6730 +v -2.0748 1.5928 -1.7762 +v -1.7590 1.0903 -1.7299 +v -2.0034 1.6861 -1.9435 +v -1.9900 1.6869 -1.9602 +v -1.9755 1.5798 -1.9399 +v -2.0498 1.6484 -1.8524 +v -2.0433 1.6613 -1.8729 +v -2.0809 1.5895 -1.7427 +v -2.0677 1.2216 -1.2614 +v -1.8451 1.2230 -1.7998 +v -2.0180 1.6850 -1.9265 +v -2.1011 1.5059 -1.6229 +v -1.9037 1.3522 -1.8478 +v -2.0300 1.6819 -1.9091 +v -2.1049 1.4148 -1.4985 +v -1.9460 1.4700 -1.8987 +v -2.0386 1.6732 -1.8913 +v -2.0901 1.3198 -1.3797 +v 0.2482 0.1203 -0.2871 +v 0.1867 0.0746 -0.2347 +v 0.1778 0.0812 -0.3126 +v 0.2388 0.1306 -0.3755 +v 0.1421 0.0893 -0.3929 +v 0.2188 0.1388 -0.4651 +v 0.1057 0.0950 -0.4795 +v 0.1929 0.1341 -0.5584 +v 0.0667 0.0989 -0.5717 +v 0.1543 0.1271 -0.6504 +v 0.1314 0.0459 -0.1796 +v 0.1087 0.0413 -0.2493 +v 0.0773 0.0467 -0.3259 +v 0.0231 0.0632 -0.4060 +v -0.0291 0.0700 -0.4851 +v 0.0739 0.0243 -0.1247 +v 0.0408 0.0168 -0.1860 +v 0.0026 0.0152 -0.2528 +v -0.0446 0.0362 -0.3234 +v -0.1145 0.0543 -0.4018 +v 0.0125 0.0114 -0.0704 +v -0.0235 0.0037 -0.1191 +v -0.0724 0.0038 -0.1787 +v -0.1243 0.0111 -0.2482 +v -0.1857 0.0378 -0.3137 +v 0.2839 0.1707 -0.2398 +v 0.2353 0.1221 -0.1979 +v 0.3021 0.1733 -0.3338 +v 0.1132 0.1426 -0.7469 +v 0.2078 0.1940 -0.8350 +v 0.2495 0.1812 -0.7314 +v -0.2699 0.0653 -0.3863 +v 0.0478 0.0187 -0.0248 +v 0.3023 0.1793 -0.4306 +v 0.0120 0.1068 -0.6596 +v 0.0959 0.0310 -0.0679 +v 0.2949 0.1876 -0.5283 +v -0.0799 0.0798 -0.5704 +v 0.1451 0.0521 -0.1122 +v 0.2757 0.1826 -0.6283 +v -0.1810 0.0742 -0.4809 +v 0.1936 0.0791 -0.1555 +v 0.0540 0.1560 -0.8496 +v -0.0417 0.1198 -0.7510 +v -0.1143 0.1316 -0.8391 +v -0.0049 0.1750 -0.9464 +v -0.1878 0.1752 -0.9357 +v -0.0863 0.2150 -1.0373 +v -0.2817 0.2217 -1.0384 +v -0.1639 0.2544 -1.1356 +v -0.3755 0.2643 -1.1465 +v -0.2640 0.2977 -1.2441 +v -0.1476 0.1046 -0.6542 +v -0.2151 0.1067 -0.7415 +v -0.2988 0.1400 -0.8374 +v -0.3853 0.1811 -0.9400 +v -0.4910 0.2413 -1.0498 +v -0.2442 0.0889 -0.5588 +v -0.3225 0.0971 -0.6448 +v -0.4000 0.1153 -0.7435 +v -0.4953 0.1479 -0.8393 +v -0.5950 0.2112 -0.9382 +v -0.3483 0.0911 -0.4646 +v -0.4196 0.0928 -0.5530 +v -0.5084 0.1124 -0.6383 +v -0.5949 0.1402 -0.7320 +v -0.7022 0.1915 -0.8170 +v 0.1590 0.1982 -0.9362 +v -0.3661 0.3654 -1.3466 +v -0.2467 0.3904 -1.4368 +v -0.1407 0.3295 -1.3356 +v -0.8138 0.2708 -0.9346 +v 0.0923 0.2178 -1.0379 +v -0.4919 0.3306 -1.2529 +v 0.0314 0.2510 -1.1445 +v -0.6001 0.3032 -1.1449 +v -0.0546 0.2883 -1.2387 +v -0.7112 0.2899 -1.0289 +v -0.4946 0.4464 -1.4589 +v -0.6140 0.4087 -1.3540 +v -0.7551 0.5081 -1.4828 +v -0.6512 0.5344 -1.5753 +v -0.9120 0.6269 -1.6298 +v -0.8065 0.6560 -1.7152 +v -1.0693 0.7762 -1.7395 +v -0.9608 0.7957 -1.8052 +v -1.2145 0.9084 -1.8314 +v -1.1164 0.9441 -1.8799 +v -0.7351 0.3947 -1.2481 +v -0.8741 0.4963 -1.4037 +v -1.0187 0.6103 -1.5568 +v -1.1772 0.7536 -1.6830 +v -1.3120 0.8875 -1.7792 +v -0.8498 0.3980 -1.1650 +v -0.9899 0.4832 -1.3262 +v -1.1223 0.6100 -1.4789 +v -1.2767 0.7282 -1.6157 +v -1.4075 0.8586 -1.7199 +v -0.9434 0.3653 -1.0818 +v -1.0981 0.4797 -1.2524 +v -1.2373 0.5902 -1.4058 +v -1.3707 0.7141 -1.5380 +v -1.5032 0.8485 -1.6511 +v -0.3772 0.4736 -1.5477 +v -1.2513 1.0558 -1.9579 +v -1.1568 1.1062 -1.9991 +v -1.0140 0.9761 -1.9363 +v -1.6047 0.9717 -1.7246 +v -0.5298 0.5801 -1.6661 +v -1.3474 1.0220 -1.9161 +v -0.6931 0.6989 -1.7875 +v -1.4340 0.9999 -1.8553 +v -0.8571 0.8349 -1.8755 +v -1.5231 0.9760 -1.7963 +v -1.3882 1.1596 -2.0007 +v -1.4730 1.1290 -1.9523 +v -1.5740 1.2269 -2.0009 +v -1.4966 1.2609 -2.0404 +v -1.6749 1.3401 -2.0155 +v -1.6129 1.3510 -2.0533 +v -1.7633 1.4588 -2.0231 +v -1.7113 1.4567 -2.0541 +v -1.8490 1.5627 -2.0246 +v -1.8119 1.5534 -2.0396 +v -1.5444 1.1035 -1.9020 +v -1.6501 1.2151 -1.9545 +v -1.7347 1.3425 -1.9693 +v -1.8164 1.4601 -1.9917 +v -1.8847 1.5713 -2.0038 +v -1.6160 1.0863 -1.8535 +v -1.7187 1.2056 -1.8998 +v -1.7953 1.3439 -1.9322 +v -1.8658 1.4635 -1.9594 +v -1.9195 1.5727 -1.9838 +v -1.6889 1.0836 -1.7944 +v -1.7810 1.2137 -1.8501 +v -1.8552 1.3505 -1.8919 +v -1.9100 1.4663 -1.9257 +v -1.9496 1.5768 -1.9592 +v -1.2951 1.2111 -2.0409 +v -1.9043 1.6418 -2.0226 +v -1.8829 1.6263 -2.0267 +v -1.7778 1.5440 -2.0533 +v -1.9761 1.6841 -1.9760 +v -1.4173 1.2948 -2.0712 +v -1.9245 1.6552 -2.0132 +v -1.5521 1.3756 -2.0846 +v -1.9433 1.6673 -2.0002 +v -1.6664 1.4524 -2.0731 +v -1.9603 1.6775 -1.9890 +# 650 vertices + +vn 0.2478 0.9648 -0.0877 +vn 0.2354 0.9652 -0.1137 +vn 0.1526 0.9854 -0.0760 +vn 0.1369 0.9904 -0.0211 +vn 0.2050 0.9786 -0.0152 +vn 0.1433 0.9870 0.0723 +vn 0.1292 0.9908 0.0392 +vn 0.1162 0.9876 0.1058 +vn 0.0907 0.9882 0.1233 +vn 0.0983 0.9827 0.1573 +vn 0.2044 0.9769 -0.0623 +vn 0.2642 0.9493 -0.1704 +vn 0.1955 0.9770 -0.0850 +vn 0.1877 0.9804 -0.0593 +vn 0.1394 0.9896 0.0348 +vn 0.2306 0.9512 -0.2052 +vn 0.2532 0.9288 -0.2704 +vn 0.2063 0.9776 -0.0425 +vn 0.2494 0.9644 -0.0883 +vn 0.2128 0.9744 -0.0731 +vn 0.3668 0.8922 -0.2634 +vn 0.3095 0.8621 -0.4011 +vn 0.3526 0.9220 -0.1603 +vn 0.3035 0.9444 -0.1263 +vn 0.2803 0.9457 -0.1643 +vn 0.1348 0.9906 -0.0246 +vn 0.0045 0.9997 -0.0242 +vn 0.0419 0.9971 -0.0642 +vn 0.0355 0.9729 0.2284 +vn 0.0185 0.9689 0.2468 +vn 0.0458 0.9723 0.2292 +vn 0.3100 0.9487 -0.0615 +vn 0.3904 0.9196 -0.0447 +vn 0.2892 0.9520 -0.1008 +vn 0.4232 0.8051 -0.4155 +vn 0.3708 0.5640 -0.7379 +vn 0.3447 0.6923 -0.6340 +vn 0.0604 0.9978 -0.0262 +vn 0.0346 0.9860 0.1633 +vn 0.3270 0.9106 -0.2528 +vn 0.2986 0.9123 -0.2803 +vn 0.0896 0.9948 0.0495 +vn 0.0853 0.9944 0.0622 +vn 0.4300 0.8099 -0.3989 +vn 0.3138 0.9111 -0.2672 +vn 0.0979 0.9888 0.1126 +vn 0.1673 0.9858 0.0142 +vn 0.4545 0.8256 -0.3342 +vn 0.2525 0.9614 -0.1091 +vn 0.0096 0.9917 0.1286 +vn -0.0153 0.9878 0.1552 +vn 0.0226 0.9863 0.1632 +vn 0.0320 0.9944 0.1010 +vn 0.0536 0.9851 0.1634 +vn 0.0279 0.9862 0.1635 +vn 0.0755 0.9650 0.2513 +vn 0.0155 0.9733 0.2291 +vn 0.1414 0.9448 0.2957 +vn 0.0018 0.9568 0.2907 +vn 0.0636 0.9822 0.1770 +vn 0.0639 0.9921 0.1081 +vn 0.0890 0.9739 0.2087 +vn 0.1118 0.9494 0.2934 +vn 0.1706 0.9276 0.3323 +vn 0.1973 0.9661 0.1662 +vn 0.1996 0.9763 0.0842 +vn 0.2040 0.9561 0.2104 +vn 0.1987 0.9368 0.2880 +vn 0.1766 0.9064 0.3837 +vn 0.3311 0.9299 0.1599 +vn 0.3157 0.9428 0.1071 +vn 0.3159 0.9215 0.2258 +vn 0.3231 0.9048 0.2773 +vn 0.2993 0.8807 0.3670 +vn 0.0207 0.9887 0.1486 +vn -0.0364 0.9418 0.3343 +vn -0.0879 0.9139 0.3964 +vn -0.0492 0.9157 0.3989 +vn 0.2869 0.8622 0.4175 +vn 0.2896 0.8580 0.4241 +vn 0.3662 0.8690 0.3329 +vn 0.3915 0.9142 0.1052 +vn 0.0337 0.9944 0.1005 +vn 0.0896 0.9198 0.3821 +vn 0.3511 0.8900 0.2909 +vn 0.0294 0.9805 0.1945 +vn 0.2096 0.9154 0.3436 +vn 0.3810 0.9002 0.2108 +vn 0.0171 0.9658 0.2587 +vn 0.2733 0.8893 0.3667 +vn 0.4081 0.9010 0.1470 +vn 0.0713 0.8580 0.5086 +vn 0.0285 0.8933 0.4485 +vn -0.0201 0.9014 0.4325 +vn 0.0047 0.8791 0.4767 +vn 0.2007 0.8020 0.5626 +vn 0.0669 0.8322 0.5505 +vn 0.2160 0.7418 0.6348 +vn 0.0853 0.7626 0.6412 +vn 0.2163 0.6917 0.6891 +vn 0.1213 0.7093 0.6943 +vn 0.1835 0.8229 0.5377 +vn 0.1476 0.8834 0.4448 +vn 0.2389 0.7718 0.5892 +vn 0.2524 0.7324 0.6323 +vn 0.2484 0.6802 0.6897 +vn 0.2750 0.7961 0.5390 +vn 0.2891 0.8541 0.4325 +vn 0.2541 0.7460 0.6155 +vn 0.3523 0.7038 0.6169 +vn 0.3553 0.6477 0.6740 +vn 0.3335 0.7897 0.5150 +vn 0.3461 0.8346 0.4285 +vn 0.2912 0.7302 0.6180 +vn 0.3334 0.6732 0.6600 +vn 0.4073 0.6116 0.6783 +vn -0.0874 0.9031 0.4204 +vn 0.0648 0.7485 0.6600 +vn 0.0923 0.7029 0.7053 +vn 0.1999 0.6900 0.6956 +vn 0.4589 0.5498 0.6980 +vn 0.4436 0.5502 0.7075 +vn 0.3388 0.6215 0.7064 +vn 0.3199 0.8374 0.4432 +vn -0.1147 0.8740 0.4721 +vn 0.2175 0.6627 0.7166 +vn 0.3096 0.6659 0.6787 +vn -0.0930 0.8387 0.5366 +vn 0.2614 0.6388 0.7236 +vn 0.3592 0.7189 0.5951 +vn -0.0369 0.7866 0.6164 +vn 0.3473 0.5938 0.7258 +vn 0.3372 0.7869 0.5167 +vn 0.3136 0.5494 0.7745 +vn 0.2657 0.6084 0.7478 +vn 0.1887 0.6383 0.7463 +vn 0.2264 0.5770 0.7847 +vn 0.2978 0.4800 0.8252 +vn 0.1668 0.4832 0.8595 +vn 0.1976 0.3942 0.8975 +vn 0.1504 0.4137 0.8979 +vn 0.2159 0.3198 0.9226 +vn 0.1939 0.3309 0.9235 +vn 0.3447 0.5159 0.7843 +vn 0.3164 0.5800 0.7506 +vn 0.3953 0.4553 0.7978 +vn 0.3227 0.3744 0.8693 +vn 0.2368 0.3100 0.9208 +vn 0.3636 0.4995 0.7863 +vn 0.3545 0.5431 0.7612 +vn 0.3806 0.4439 0.8112 +vn 0.4126 0.3543 0.8392 +vn 0.3226 0.2466 0.9139 +vn 0.4229 0.4724 0.7733 +vn 0.4286 0.5010 0.7519 +vn 0.3977 0.4251 0.8131 +vn 0.4082 0.3407 0.8469 +vn 0.4905 0.0924 0.8665 +vn 0.0628 0.6508 0.7567 +vn 0.1220 0.3362 0.9339 +vn 0.0294 0.2476 0.9684 +vn 0.0886 0.2656 0.9600 +vn 0.6780 -0.1832 0.7119 +vn -0.4945 0.0368 -0.8684 +vn 0.5604 0.1019 0.8219 +vn 0.4701 0.4937 0.7316 +vn 0.0846 0.5806 0.8098 +vn 0.1683 0.2779 0.9457 +vn 0.3882 0.3692 0.8444 +vn 0.0568 0.4859 0.8721 +vn 0.2361 0.2728 0.9326 +vn 0.4485 0.4203 0.7888 +vn 0.0915 0.4345 0.8960 +vn 0.2819 0.2442 0.9279 +vn 0.4628 0.4492 0.7643 +vn -0.4405 0.8809 -0.1731 +vn -0.4032 0.8525 -0.3328 +vn -0.4882 0.7603 -0.4286 +vn -0.4785 0.8434 -0.2444 +vn -0.4101 0.9095 -0.0682 +vn -0.4081 0.8871 -0.2156 +vn -0.3056 0.9499 -0.0658 +vn -0.3355 0.9184 -0.2099 +vn -0.2343 0.9719 -0.0233 +vn -0.3087 0.9474 -0.0850 +vn -0.3070 0.9413 -0.1401 +vn -0.2944 0.9225 -0.2495 +vn -0.3313 0.9431 0.0295 +vn -0.2560 0.9636 0.0775 +vn -0.1716 0.9834 0.0594 +vn -0.1953 0.9743 -0.1123 +vn -0.2091 0.9587 -0.1929 +vn -0.2086 0.9766 0.0527 +vn -0.2158 0.9586 0.1860 +vn -0.1335 0.9756 0.1740 +vn -0.0399 0.9967 -0.0710 +vn -0.0641 0.9900 -0.1256 +vn -0.0277 0.9991 0.0323 +vn -0.0802 0.9799 0.1827 +vn -0.0889 0.9626 0.2558 +vn -0.4631 0.7182 -0.5193 +vn -0.4645 0.6580 -0.5927 +vn -0.4926 0.7721 -0.4015 +vn -0.3804 0.9204 -0.0901 +vn -0.3523 0.9355 -0.0256 +vn -0.3186 0.9474 0.0287 +vn -0.0452 0.9713 0.2335 +vn -0.0965 0.9898 -0.1049 +vn -0.4392 0.8558 -0.2735 +vn -0.2093 0.9748 0.0771 +vn -0.2183 0.9590 -0.1809 +vn -0.3987 0.8739 -0.2782 +vn -0.1375 0.9826 0.1248 +vn -0.2916 0.9184 -0.2675 +vn -0.3692 0.8939 -0.2543 +vn -0.0554 0.9850 0.1635 +vn -0.3838 0.8505 -0.3597 +vn -0.2203 0.9596 0.1751 +vn -0.1914 0.9789 0.0715 +vn -0.2929 0.9545 0.0557 +vn -0.2888 0.9365 0.1991 +vn -0.2520 0.9242 0.2871 +vn -0.2485 0.9299 0.2712 +vn -0.2443 0.9210 0.3035 +vn -0.2230 0.9360 0.2725 +vn -0.1971 0.9210 0.3361 +vn -0.2251 0.9128 0.3408 +vn -0.1225 0.9857 0.1154 +vn -0.1190 0.9870 0.1079 +vn -0.1917 0.9501 0.2462 +vn -0.2238 0.9199 0.3219 +vn -0.1711 0.9034 0.3931 +vn -0.0559 0.9932 0.1021 +vn -0.0476 0.9927 0.1108 +vn -0.0824 0.9787 0.1883 +vn -0.1177 0.9414 0.3159 +vn -0.1239 0.8901 0.4386 +vn 0.0009 0.9954 0.0955 +vn -0.0068 0.9922 0.1247 +vn 0.0034 0.9822 0.1878 +vn 0.0135 0.9611 0.2758 +vn -0.0274 0.9206 0.3896 +vn -0.3105 0.9501 0.0299 +vn -0.2209 0.9167 0.3329 +vn -0.1904 0.8928 0.4082 +vn -0.2268 0.8771 0.4233 +vn -0.1089 0.8951 0.4324 +vn -0.2704 0.9460 0.1785 +vn -0.1853 0.8889 0.4191 +vn -0.2148 0.9461 0.2425 +vn -0.1059 0.8900 0.4435 +vn -0.2271 0.9331 0.2789 +vn -0.1103 0.8791 0.4638 +vn -0.1779 0.8641 0.4709 +vn -0.1708 0.8748 0.4533 +vn -0.2198 0.8687 0.4439 +vn -0.2354 0.8527 0.4664 +vn -0.1947 0.8090 0.5547 +vn -0.2849 0.7606 0.5833 +vn -0.2731 0.7150 0.6436 +vn -0.2973 0.6771 0.6732 +vn -0.3461 0.6907 0.6349 +vn -0.3686 0.6571 0.6575 +vn -0.1492 0.8718 0.4665 +vn -0.0782 0.8915 0.4461 +vn -0.1452 0.8391 0.5242 +vn -0.2968 0.7281 0.6179 +vn -0.3192 0.7003 0.6385 +vn -0.1271 0.8864 0.4452 +vn -0.1338 0.8896 0.4367 +vn -0.1498 0.8477 0.5088 +vn -0.2038 0.7880 0.5810 +vn -0.2449 0.7129 0.6571 +vn -0.1392 0.8821 0.4501 +vn -0.1909 0.8793 0.4363 +vn -0.1434 0.8447 0.5158 +vn -0.0994 0.8071 0.5820 +vn -0.0739 0.7454 0.6625 +vn -0.2216 0.8624 0.4552 +vn -0.3587 0.6348 0.6843 +vn -0.5098 0.5088 0.6937 +vn -0.4577 0.5783 0.6754 +vn -0.0673 0.6927 0.7180 +vn -0.3154 0.8094 0.4953 +vn -0.3574 0.6372 0.6828 +vn -0.3607 0.7288 0.5820 +vn -0.2635 0.6860 0.6782 +vn -0.3282 0.6627 0.6732 +vn -0.1787 0.6941 0.6973 +vn -0.3268 0.5246 0.7862 +vn -0.3282 0.6125 0.7191 +vn -0.4342 0.5556 0.7091 +vn -0.4658 0.4445 0.7651 +vn -0.1926 0.4757 0.8583 +vn -0.3439 0.4421 0.8284 +vn -0.1764 0.4074 0.8961 +vn -0.2901 0.3415 0.8940 +vn -0.2117 0.3209 0.9231 +vn -0.2623 0.2988 0.9176 +vn -0.1967 0.5552 0.8081 +vn -0.2660 0.6279 0.7314 +vn -0.1385 0.4643 0.8748 +vn -0.1476 0.4278 0.8918 +vn -0.1817 0.3307 0.9261 +vn -0.0885 0.5785 0.8108 +vn -0.1639 0.6406 0.7502 +vn -0.1407 0.4556 0.8790 +vn -0.1211 0.4397 0.8899 +vn -0.1730 0.3197 0.9316 +vn -0.0245 0.5759 0.8172 +vn -0.0307 0.6587 0.7517 +vn -0.0537 0.4814 0.8748 +vn -0.0435 0.4454 0.8943 +vn -0.0435 0.3334 0.9418 +vn -0.5142 0.4883 0.7051 +vn -0.2079 0.3929 0.8958 +vn -0.0404 0.4918 0.8698 +vn -0.0325 0.4652 0.8846 +vn 0.0053 0.2623 0.9650 +vn -0.5113 0.4407 0.7378 +vn -0.0098 0.4239 0.9056 +vn -0.4116 0.4567 0.7887 +vn 0.0054 0.3834 0.9236 +vn -0.3496 0.3687 0.8613 +vn 0.0095 0.3172 0.9483 +vn -0.1530 -0.9852 0.0769 +vn -0.2295 -0.9673 0.1080 +vn -0.2394 -0.9674 0.0827 +vn -0.1395 -0.9899 0.0265 +vn -0.2029 -0.9791 0.0138 +vn -0.1389 -0.9873 -0.0767 +vn -0.1286 -0.9910 -0.0362 +vn -0.1144 -0.9877 -0.1064 +vn -0.0870 -0.9889 -0.1201 +vn -0.0917 -0.9823 -0.1635 +vn -0.2482 -0.9571 0.1497 +vn -0.1890 -0.9807 0.0508 +vn -0.1924 -0.9778 0.0829 +vn -0.1857 -0.9805 0.0639 +vn -0.1430 -0.9894 -0.0245 +vn -0.2451 -0.9323 0.2661 +vn -0.2258 -0.9551 0.1919 +vn -0.2043 -0.9781 0.0397 +vn -0.2433 -0.9669 0.0770 +vn -0.2150 -0.9740 0.0714 +vn -0.3133 -0.8656 0.3906 +vn -0.3811 -0.8802 0.2831 +vn -0.3600 -0.9155 0.1799 +vn -0.3047 -0.9447 0.1210 +vn -0.2818 -0.9472 0.1530 +vn -0.0066 -0.9997 0.0253 +vn -0.1367 -0.9904 0.0199 +vn -0.0431 -0.9968 0.0670 +vn -0.0431 -0.9736 -0.2242 +vn -0.0233 -0.9706 -0.2394 +vn -0.0367 -0.9722 -0.2314 +vn -0.3927 -0.9183 0.0498 +vn -0.3128 -0.9475 0.0658 +vn -0.2895 -0.9531 0.0878 +vn -0.3282 -0.7210 0.6103 +vn -0.3679 -0.5983 0.7118 +vn -0.4265 -0.8163 0.3895 +vn -0.0599 -0.9979 0.0259 +vn -0.0278 -0.9862 -0.1632 +vn -0.3344 -0.9092 0.2482 +vn -0.2958 -0.9035 0.3101 +vn -0.0885 -0.9949 -0.0491 +vn -0.0868 -0.9944 -0.0598 +vn -0.4368 -0.7989 0.4135 +vn -0.2933 -0.9284 0.2280 +vn -0.0939 -0.9888 -0.1161 +vn -0.1717 -0.9851 -0.0074 +vn -0.4624 -0.8151 0.3491 +vn -0.2444 -0.9649 0.0964 +vn -0.0228 -0.9879 -0.1532 +vn 0.0181 -0.9877 -0.1554 +vn -0.0102 -0.9912 -0.1318 +vn -0.0358 -0.9945 -0.0985 +vn -0.0591 -0.9854 -0.1595 +vn -0.0269 -0.9855 -0.1676 +vn -0.0756 -0.9627 -0.2599 +vn -0.0147 -0.9718 -0.2352 +vn -0.1383 -0.9432 -0.3019 +vn -0.0145 -0.9564 -0.2916 +vn -0.0643 -0.9921 -0.1077 +vn -0.0619 -0.9813 -0.1825 +vn -0.0913 -0.9736 -0.2093 +vn -0.1171 -0.9485 -0.2944 +vn -0.1636 -0.9268 -0.3380 +vn -0.2002 -0.9764 -0.0808 +vn -0.2033 -0.9650 -0.1655 +vn -0.2065 -0.9546 -0.2146 +vn -0.2004 -0.9365 -0.2877 +vn -0.1743 -0.9051 -0.3877 +vn -0.3164 -0.9429 -0.1039 +vn -0.3315 -0.9293 -0.1629 +vn -0.3147 -0.9211 -0.2291 +vn -0.3279 -0.9037 -0.2754 +vn -0.3083 -0.8787 -0.3645 +vn -0.0211 -0.9898 -0.1407 +vn 0.0354 -0.9161 -0.3993 +vn 0.0860 -0.9127 -0.3995 +vn 0.0372 -0.9417 -0.3344 +vn -0.3025 -0.8555 -0.4202 +vn -0.2889 -0.8620 -0.4164 +vn -0.3846 -0.8627 -0.3283 +vn -0.3932 -0.9134 -0.1050 +vn -0.0313 -0.9942 -0.1027 +vn -0.0911 -0.9203 -0.3804 +vn -0.3518 -0.8876 -0.2972 +vn -0.0266 -0.9795 -0.1995 +vn -0.2065 -0.9166 -0.3423 +vn -0.3709 -0.9024 -0.2193 +vn -0.0192 -0.9664 -0.2563 +vn -0.2720 -0.8898 -0.3664 +vn -0.4100 -0.9006 -0.1441 +vn 0.0222 -0.9009 -0.4335 +vn -0.0365 -0.8957 -0.4431 +vn -0.0694 -0.8582 -0.5086 +vn 0.0021 -0.8815 -0.4722 +vn -0.2185 -0.8027 -0.5549 +vn -0.0565 -0.8329 -0.5506 +vn -0.2176 -0.7429 -0.6330 +vn -0.0903 -0.7645 -0.6382 +vn -0.2148 -0.6903 -0.6909 +vn -0.1191 -0.7113 -0.6927 +vn -0.1435 -0.8851 -0.4427 +vn -0.1845 -0.8240 -0.5358 +vn -0.2347 -0.7722 -0.5904 +vn -0.2591 -0.7343 -0.6274 +vn -0.2606 -0.6760 -0.6893 +vn -0.2846 -0.8552 -0.4331 +vn -0.2844 -0.7972 -0.5325 +vn -0.2546 -0.7446 -0.6170 +vn -0.3585 -0.7019 -0.6155 +vn -0.3621 -0.6451 -0.6728 +vn -0.3439 -0.8340 -0.4315 +vn -0.3360 -0.7872 -0.5170 +vn -0.3018 -0.7280 -0.6156 +vn -0.3429 -0.6717 -0.6567 +vn -0.4051 -0.6184 -0.6734 +vn 0.0935 -0.9006 -0.4246 +vn -0.1893 -0.6893 -0.6993 +vn -0.0695 -0.7005 -0.7102 +vn -0.0511 -0.7450 -0.6652 +vn -0.4148 -0.5683 -0.7106 +vn -0.4426 -0.5649 -0.6964 +vn -0.3421 -0.6335 -0.6940 +vn -0.3305 -0.8350 -0.4400 +vn 0.1108 -0.8775 -0.4667 +vn -0.2289 -0.6592 -0.7163 +vn -0.3075 -0.6684 -0.6773 +vn 0.1042 -0.8400 -0.5325 +vn -0.2686 -0.6361 -0.7233 +vn -0.3568 -0.7193 -0.5961 +vn 0.0398 -0.7898 -0.6121 +vn -0.3441 -0.6007 -0.7216 +vn -0.3364 -0.7841 -0.5215 +vn -0.1824 -0.6368 -0.7492 +vn -0.2700 -0.6071 -0.7473 +vn -0.3039 -0.5508 -0.7774 +vn -0.2136 -0.5754 -0.7895 +vn -0.2898 -0.4838 -0.8258 +vn -0.1619 -0.4892 -0.8570 +vn -0.2083 -0.3925 -0.8958 +vn -0.1654 -0.4139 -0.8952 +vn -0.2303 -0.3099 -0.9224 +vn -0.2239 -0.3095 -0.9242 +vn -0.3128 -0.5839 -0.7491 +vn -0.3463 -0.5144 -0.7845 +vn -0.4042 -0.4531 -0.7946 +vn -0.3147 -0.3727 -0.8730 +vn -0.2470 -0.3019 -0.9208 +vn -0.3407 -0.5515 -0.7614 +vn -0.3623 -0.4964 -0.7889 +vn -0.3888 -0.4386 -0.8102 +vn -0.4314 -0.3347 -0.8378 +vn -0.3249 -0.2569 -0.9102 +vn -0.4234 -0.5087 -0.7497 +vn -0.4100 -0.4725 -0.7802 +vn -0.3833 -0.4279 -0.8186 +vn -0.4190 -0.3370 -0.8431 +vn -0.4925 -0.0631 -0.8680 +vn -0.0593 -0.6514 -0.7564 +vn -0.1065 -0.2318 -0.9669 +vn -0.0958 -0.2450 -0.9648 +vn -0.0540 -0.3210 -0.9455 +vn -0.5559 0.1598 -0.8158 +vn -0.4976 -0.0411 -0.8664 +vn -0.5586 -0.1156 -0.8213 +vn -0.4719 -0.5023 -0.7246 +vn -0.0801 -0.5767 -0.8130 +vn -0.1261 -0.2639 -0.9563 +vn -0.3685 -0.3842 -0.8465 +vn -0.0411 -0.4939 -0.8686 +vn -0.1693 -0.2890 -0.9422 +vn -0.4256 -0.4310 -0.7957 +vn -0.0456 -0.4423 -0.8957 +vn -0.2395 -0.2666 -0.9336 +vn -0.4499 -0.4492 -0.7719 +vn 0.4765 -0.7622 0.4382 +vn 0.4103 -0.8468 0.3386 +vn 0.4427 -0.8819 0.1624 +vn 0.4806 -0.8444 0.2367 +vn 0.4073 -0.9109 0.0660 +vn 0.4072 -0.8896 0.2067 +vn 0.3028 -0.9500 0.0765 +vn 0.3382 -0.9172 0.2106 +vn 0.2375 -0.9710 0.0266 +vn 0.3159 -0.9448 0.0866 +vn 0.2984 -0.9205 0.2523 +vn 0.3188 -0.9377 0.1381 +vn 0.3422 -0.9392 -0.0278 +vn 0.2582 -0.9638 -0.0660 +vn 0.1690 -0.9840 -0.0559 +vn 0.2085 -0.9593 0.1904 +vn 0.1926 -0.9750 0.1111 +vn 0.2125 -0.9758 -0.0517 +vn 0.2193 -0.9586 -0.1818 +vn 0.1284 -0.9774 -0.1677 +vn 0.0646 -0.9892 0.1319 +vn 0.0459 -0.9965 0.0691 +vn 0.0302 -0.9989 -0.0345 +vn 0.0833 -0.9791 -0.1854 +vn 0.0849 -0.9637 -0.2531 +vn 0.4542 -0.6481 0.6112 +vn 0.4588 -0.7082 0.5366 +vn 0.4932 -0.7591 0.4249 +vn 0.3221 -0.9464 -0.0231 +vn 0.3431 -0.9388 0.0295 +vn 0.3807 -0.9191 0.1012 +vn 0.0368 -0.9732 -0.2269 +vn 0.0958 -0.9888 0.1145 +vn 0.4492 -0.8514 0.2710 +vn 0.2123 -0.9746 -0.0718 +vn 0.2118 -0.9584 0.1913 +vn 0.3984 -0.8758 0.2726 +vn 0.1409 -0.9818 -0.1272 +vn 0.2980 -0.9144 0.2740 +vn 0.3786 -0.8912 0.2499 +vn 0.0531 -0.9853 -0.1622 +vn 0.4053 -0.8320 0.3788 +vn 0.2909 -0.9552 -0.0548 +vn 0.1954 -0.9782 -0.0703 +vn 0.2249 -0.9559 -0.1888 +vn 0.2826 -0.9387 -0.1974 +vn 0.2468 -0.9222 -0.2976 +vn 0.2423 -0.9300 -0.2765 +vn 0.2332 -0.9270 -0.2938 +vn 0.2194 -0.9372 -0.2712 +vn 0.1936 -0.9231 -0.3322 +vn 0.2302 -0.9104 -0.3436 +vn 0.1169 -0.9878 -0.1030 +vn 0.1254 -0.9847 -0.1211 +vn 0.2010 -0.9444 -0.2600 +vn 0.2270 -0.9181 -0.3251 +vn 0.1605 -0.9100 -0.3823 +vn 0.0477 -0.9929 -0.1093 +vn 0.0549 -0.9935 -0.1002 +vn 0.0877 -0.9763 -0.1980 +vn 0.1250 -0.9381 -0.3229 +vn 0.1283 -0.8914 -0.4347 +vn 0.0053 -0.9929 -0.1186 +vn -0.0026 -0.9956 -0.0940 +vn -0.0081 -0.9822 -0.1875 +vn -0.0076 -0.9598 -0.2807 +vn 0.0370 -0.9198 -0.3907 +vn 0.2995 -0.9537 -0.0291 +vn 0.2259 -0.8773 -0.4234 +vn 0.2021 -0.8894 -0.4100 +vn 0.2253 -0.9123 -0.3419 +vn 0.1149 -0.8934 -0.4342 +vn 0.2758 -0.9437 -0.1825 +vn 0.1925 -0.8811 -0.4319 +vn 0.2193 -0.9446 -0.2441 +vn 0.1053 -0.8902 -0.4433 +vn 0.2190 -0.9366 -0.2736 +vn 0.1148 -0.8778 -0.4651 +vn 0.2153 -0.8717 -0.4402 +vn 0.1697 -0.8763 -0.4508 +vn 0.1773 -0.8666 -0.4664 +vn 0.2397 -0.8475 -0.4735 +vn 0.2132 -0.8054 -0.5530 +vn 0.2897 -0.7620 -0.5792 +vn 0.2863 -0.7164 -0.6362 +vn 0.3066 -0.6799 -0.6661 +vn 0.3552 -0.6849 -0.6362 +vn 0.3927 -0.6406 -0.6598 +vn 0.0840 -0.8908 -0.4466 +vn 0.1486 -0.8741 -0.4624 +vn 0.1439 -0.8418 -0.5203 +vn 0.2902 -0.7332 -0.6150 +vn 0.3167 -0.6983 -0.6419 +vn 0.1313 -0.8910 -0.4346 +vn 0.1303 -0.8866 -0.4437 +vn 0.1454 -0.8491 -0.5079 +vn 0.1899 -0.7951 -0.5760 +vn 0.2302 -0.7210 -0.6536 +vn 0.1872 -0.8802 -0.4361 +vn 0.1364 -0.8842 -0.4467 +vn 0.1471 -0.8450 -0.5141 +vn 0.1175 -0.8044 -0.5823 +vn 0.0792 -0.7440 -0.6635 +vn 0.2331 -0.8605 -0.4531 +vn 0.4719 -0.5714 -0.6714 +vn 0.5217 -0.5067 -0.6863 +vn 0.3874 -0.6117 -0.6897 +vn 0.0555 -0.6987 -0.7132 +vn 0.3171 -0.8059 -0.4999 +vn 0.3607 -0.6378 -0.6806 +vn 0.3529 -0.7368 -0.5768 +vn 0.2690 -0.6833 -0.6788 +vn 0.3334 -0.6637 -0.6696 +vn 0.1757 -0.6963 -0.6959 +vn 0.4531 -0.5400 -0.7093 +vn 0.3352 -0.6054 -0.7219 +vn 0.3264 -0.5195 -0.7896 +vn 0.4599 -0.4528 -0.7639 +vn 0.1851 -0.4762 -0.8596 +vn 0.3305 -0.4446 -0.8325 +vn 0.2001 -0.4055 -0.8919 +vn 0.2619 -0.3696 -0.8915 +vn 0.2157 -0.3378 -0.9162 +vn 0.2896 -0.2937 -0.9110 +vn 0.2628 -0.6281 -0.7324 +vn 0.2042 -0.5403 -0.8163 +vn 0.1433 -0.4645 -0.8739 +vn 0.1678 -0.4303 -0.8869 +vn 0.1856 -0.3343 -0.9240 +vn 0.1687 -0.6361 -0.7529 +vn 0.0869 -0.5728 -0.8151 +vn 0.1442 -0.4520 -0.8803 +vn 0.1110 -0.4500 -0.8861 +vn 0.1250 -0.3393 -0.9324 +vn 0.0289 -0.6586 -0.7519 +vn 0.0226 -0.5709 -0.8207 +vn 0.0596 -0.4832 -0.8735 +vn 0.0801 -0.4439 -0.8925 +vn 0.0620 -0.3419 -0.9377 +vn 0.5233 -0.4819 -0.7029 +vn -0.0298 -0.5236 -0.8514 +vn 0.7082 0.6754 -0.2057 +vn 0.2750 -0.3321 -0.9023 +vn -0.0707 -0.2842 -0.9561 +vn 0.4967 -0.4678 -0.7311 +vn -0.0974 -0.4887 -0.8670 +vn 0.4023 -0.4560 -0.7939 +vn -0.0178 -0.3870 -0.9219 +vn 0.2894 -0.4207 -0.8598 +vn 0.0036 -0.3073 -0.9516 +vn -0.0024 -0.0085 1.0000 +vn 0.0365 -0.0893 0.9953 +vn 0.0397 -0.0915 0.9950 +vn -0.0112 0.0214 0.9997 +vn -0.9087 0.3081 0.2817 +vn -0.8312 0.3910 0.3953 +vn -0.8197 0.3567 0.4482 +vn -0.9093 0.3005 0.2878 +vn -0.4589 0.6585 0.5965 +vn -0.4563 0.7830 0.4229 +vn -0.4610 0.7605 0.4573 +vn -0.4574 0.6470 0.6100 +vn 0.3522 0.5826 0.7325 +vn 0.2470 0.5041 0.8276 +vn 0.2653 0.5463 0.7944 +vn 0.3535 0.6074 0.7114 +vn -0.6627 0.4968 0.5603 +vn -0.6537 0.4738 0.5901 +vn 0.1242 0.2198 0.9676 +vn 0.1260 0.2683 0.9551 +vn -0.5280 0.5771 0.6231 +vn -0.5327 0.5566 0.6375 +vn 0.0454 0.1667 0.9850 +vn 0.0510 0.1800 0.9823 +vn -0.4401 0.6967 0.5665 +vn -0.4442 0.6909 0.5704 +vn -0.0206 0.1232 0.9922 +vn -0.0194 0.1446 0.9893 +vn -0.9323 0.3448 0.1091 +vn -0.9508 0.3015 0.0707 +vn -0.9527 0.2948 0.0735 +vn -0.9322 0.3454 0.1079 +vn -0.9153 0.3354 0.2231 +vn -0.9138 0.3375 0.2259 +vn -0.8923 0.4388 0.1060 +vn -0.8950 0.4347 0.0997 +vn -0.9060 0.3933 0.1561 +vn -0.9044 0.3964 0.1577 +vn -0.9120 0.3628 0.1916 +vn -0.9111 0.3657 0.1902 +vn -0.9016 0.4322 0.0166 +vn -0.9211 0.3889 0.0190 +vn -0.9196 0.3923 0.0222 +vn -0.8993 0.4367 0.0212 +vn -0.9540 0.2891 0.0793 +vn -0.9559 0.2834 0.0767 +vn -0.9502 0.3115 -0.0071 +vn -0.9495 0.3136 -0.0075 +vn -0.9478 0.3134 0.0595 +vn -0.9478 0.3125 0.0635 +vn -0.9783 0.2032 0.0409 +vn -0.9783 0.2032 0.0410 +vn 0.0340 0.9259 -0.3762 +vn -0.0893 0.8984 -0.4299 +vn -0.0548 0.9104 -0.4100 +vn 0.0849 0.9351 -0.3439 +vn -0.5212 0.8532 0.0204 +vn -0.5954 0.8027 -0.0355 +vn -0.5866 0.8093 -0.0301 +vn -0.6044 0.7967 -0.0014 +vn -0.6617 0.7457 -0.0788 +vn -0.7417 0.6611 -0.1134 +vn -0.8463 0.5319 0.0289 +vn -0.8451 0.5341 0.0260 +vn -0.1587 0.9031 -0.3990 +vn -0.1783 0.8953 -0.4083 +vn -0.6897 0.7237 -0.0225 +vn -0.6812 0.7317 -0.0213 +vn -0.3549 0.8733 -0.3338 +vn -0.3560 0.8718 -0.3365 +vn -0.7661 0.6416 -0.0375 +vn -0.7575 0.6521 -0.0308 +vn -0.5898 0.7737 -0.2313 +vn -0.6027 0.7622 -0.2362 +vn -0.8511 0.5197 -0.0742 +vn -0.8508 0.5205 -0.0719 +vn 0.3002 0.7879 0.5377 +vn 0.4318 0.6799 0.5928 +vn 0.4077 0.7046 0.5807 +vn 0.2773 0.8066 0.5220 +vn -0.3576 0.4859 0.7975 +vn -0.4267 0.5072 0.7488 +vn -0.4158 0.5005 0.7594 +vn -0.3281 0.4669 0.8212 +vn 0.8706 0.2458 0.4262 +vn 0.8788 0.3229 0.3514 +vn 0.8781 0.3201 0.3556 +vn 0.8704 0.2461 0.4263 +vn -0.0194 0.0088 0.9998 +vn -0.0085 -0.0090 0.9999 +vn 0.6163 0.5115 0.5988 +vn 0.6074 0.5267 0.5947 +vn -0.0395 0.0370 0.9985 +vn -0.0350 0.0297 0.9989 +vn 0.6647 0.5226 0.5339 +vn 0.6572 0.5357 0.5302 +vn -0.0320 0.1083 0.9936 +vn -0.0154 0.0759 0.9970 +vn 0.8092 0.3190 0.4934 +vn 0.7981 0.3444 0.4944 +vn -0.1533 0.3368 0.9290 +vn -0.1066 0.2926 0.9503 +vn 0.9182 0.2897 0.2702 +vn 0.9143 0.2962 0.2763 +vn 0.9026 0.4055 0.1448 +vn 0.8755 0.4569 0.1574 +vn 0.8734 0.4597 0.1607 +vn 0.9036 0.4043 0.1418 +vn 0.9350 0.2427 0.2586 +vn 0.9340 0.2455 0.2597 +vn 0.9403 0.2739 0.2022 +vn 0.9471 0.2662 0.1791 +vn 0.8950 0.4170 0.1587 +vn 0.8985 0.4098 0.1574 +vn 0.9436 0.3267 0.0534 +vn 0.9417 0.3317 0.0560 +vn 0.8595 0.5061 0.0718 +vn 0.7602 0.6276 0.1680 +vn 0.7665 0.6208 0.1648 +vn 0.8630 0.5011 0.0642 +vn 0.9273 0.3682 0.0675 +vn 0.9279 0.3668 0.0662 +vn 0.9210 0.3875 0.0406 +vn 0.9208 0.3886 0.0328 +vn 0.8895 0.4556 0.0358 +vn 0.8902 0.4546 0.0304 +vn 0.7106 0.6887 0.1444 +vn 0.7091 0.6898 0.1461 +vn 0.7408 0.6663 -0.0846 +vn 0.6662 0.5385 -0.5159 +vn 0.6006 0.5521 -0.5783 +vn 0.7381 0.6732 -0.0443 +vn 0.6383 0.6930 -0.3351 +vn 0.5422 0.6996 -0.4654 +vn 0.2153 0.9182 -0.3325 +vn 0.2330 0.9192 -0.3176 +vn 0.7051 0.7081 0.0372 +vn 0.7066 0.7060 0.0477 +vn 0.5334 0.7889 -0.3051 +vn 0.4914 0.7965 -0.3524 +vn 0.6812 0.7310 -0.0409 +vn 0.6828 0.7297 -0.0372 +vn 0.4765 0.8294 -0.2916 +vn 0.4544 0.8335 -0.3145 +vn 0.6915 0.7217 -0.0317 +vn 0.6875 0.7255 -0.0315 +vn 0.4041 0.8675 -0.2900 +vn 0.3992 0.8687 -0.2931 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_06 +s 1 +f 3901/1951/4789 3902/1952/4790 3903/1953/4791 3904/1954/4792 +f 3905/1955/4793 3901/1951/4789 3904/1954/4792 3906/1956/4794 +f 3907/1957/4795 3905/1955/4793 3906/1956/4794 3908/1958/4796 +f 3909/1959/4797 3907/1957/4795 3908/1958/4796 3910/1960/4798 +f 3911/1961/4799 3912/1962/4800 3902/1952/4790 3901/1951/4789 +f 3913/1963/4801 3911/1961/4799 3901/1951/4789 3905/1955/4793 +f 3914/1964/4802 3913/1963/4801 3905/1955/4793 3907/1957/4795 +f 3915/1965/4803 3914/1964/4802 3907/1957/4795 3909/1959/4797 +f 3916/1966/4804 3917/1967/4805 3912/1962/4800 3911/1961/4799 +f 3918/1968/4806 3916/1966/4804 3911/1961/4799 3913/1963/4801 +f 3919/1969/4807 3918/1968/4806 3913/1963/4801 3914/1964/4802 +f 3920/1970/4808 3919/1969/4807 3914/1964/4802 3915/1965/4803 +f 3921/1971/4809 3922/1972/4810 3917/1967/4805 3916/1966/4804 +f 3923/1973/4811 3921/1971/4809 3916/1966/4804 3918/1968/4806 +f 3924/1974/4812 3923/1973/4811 3918/1968/4806 3919/1969/4807 +f 3925/1975/4813 3924/1974/4812 3919/1969/4807 3920/1970/4808 +f 3903/1953/4791 3926/1976/4814 3927/1977/4815 3928/1978/4816 +f 3929/1979/4817 3930/1980/4818 3931/1981/4819 3910/1960/4798 +f 3925/1975/4813 3932/1982/4820 3933/1983/4821 3934/1984/4822 +f 3935/1985/4823 3936/1986/4824 3937/1987/4825 3922/1972/4810 +f 3904/1954/4792 3903/1953/4791 3928/1978/4816 3938/1988/4826 +f 3910/1960/4798 3931/1981/4819 3939/1989/4827 3909/1959/4797 +f 3924/1974/4812 3925/1975/4813 3934/1984/4822 3940/1990/4828 +f 3922/1972/4810 3937/1987/4825 3941/1991/4829 3917/1967/4805 +f 3906/1956/4794 3904/1954/4792 3938/1988/4826 3942/1992/4830 +f 3909/1959/4797 3939/1989/4827 3943/1993/4831 3915/1965/4803 +f 3923/1973/4811 3924/1974/4812 3940/1990/4828 3944/1994/4832 +f 3917/1967/4805 3941/1991/4829 3945/1995/4833 3912/1962/4800 +f 3908/1958/4796 3906/1956/4794 3942/1992/4830 3946/1996/4834 +f 3915/1965/4803 3943/1993/4831 3947/1997/4835 3920/1970/4808 +f 3921/1971/4809 3923/1973/4811 3944/1994/4832 3948/1998/4836 +f 3912/1962/4800 3945/1995/4833 3949/1999/4837 3902/1952/4790 +f 3910/1960/4798 3908/1958/4796 3946/1996/4834 3929/1979/4817 +f 3920/1970/4808 3947/1997/4835 3932/1982/4820 3925/1975/4813 +f 3922/1972/4810 3921/1971/4809 3948/1998/4836 3935/1985/4823 +f 3902/1952/4790 3949/1999/4837 3926/1976/4814 3903/1953/4791 +f 3950/2000/4838 3951/2001/4839 3952/2002/4840 3953/2003/4841 +f 3954/2004/4842 3950/2000/4838 3953/2003/4841 3955/2005/4843 +f 3956/2006/4844 3954/2004/4842 3955/2005/4843 3957/2007/4845 +f 3958/2008/4846 3956/2006/4844 3957/2007/4845 3959/2009/4847 +f 3960/2010/4848 3961/2011/4849 3951/2001/4839 3950/2000/4838 +f 3962/2012/4850 3960/2010/4848 3950/2000/4838 3954/2004/4842 +f 3963/2013/4851 3962/2012/4850 3954/2004/4842 3956/2006/4844 +f 3964/2014/4852 3963/2013/4851 3956/2006/4844 3958/2008/4846 +f 3965/2015/4853 3966/2016/4854 3961/2011/4849 3960/2010/4848 +f 3967/2017/4855 3965/2015/4853 3960/2010/4848 3962/2012/4850 +f 3968/2018/4856 3967/2017/4855 3962/2012/4850 3963/2013/4851 +f 3969/2019/4857 3968/2018/4856 3963/2013/4851 3964/2014/4852 +f 3970/2020/4858 3971/2021/4859 3966/2016/4854 3965/2015/4853 +f 3972/2022/4860 3970/2020/4858 3965/2015/4853 3967/2017/4855 +f 3973/2023/4861 3972/2022/4860 3967/2017/4855 3968/2018/4856 +f 3974/2024/4862 3973/2023/4861 3968/2018/4856 3969/2019/4857 +f 3952/2002/4840 3931/1981/4819 3930/1980/4818 3975/2025/4863 +f 3976/2026/4864 3977/2027/4865 3978/2028/4866 3959/2009/4847 +f 3974/2024/4862 3979/2029/4867 3980/2030/4868 3981/2031/4869 +f 3982/2032/4870 3933/1983/4821 3932/1982/4820 3971/2021/4859 +f 3953/2003/4841 3952/2002/4840 3975/2025/4863 3983/2033/4871 +f 3959/2009/4847 3978/2028/4866 3984/2034/4872 3958/2008/4846 +f 3973/2023/4861 3974/2024/4862 3981/2031/4869 3985/2035/4873 +f 3971/2021/4859 3932/1982/4820 3947/1997/4835 3966/2016/4854 +f 3955/2005/4843 3953/2003/4841 3983/2033/4871 3986/2036/4874 +f 3958/2008/4846 3984/2034/4872 3987/2037/4875 3964/2014/4852 +f 3972/2022/4860 3973/2023/4861 3985/2035/4873 3988/2038/4876 +f 3966/2016/4854 3947/1997/4835 3943/1993/4831 3961/2011/4849 +f 3957/2007/4845 3955/2005/4843 3986/2036/4874 3989/2039/4877 +f 3964/2014/4852 3987/2037/4875 3990/2040/4878 3969/2019/4857 +f 3970/2020/4858 3972/2022/4860 3988/2038/4876 3991/2041/4879 +f 3961/2011/4849 3943/1993/4831 3939/1989/4827 3951/2001/4839 +f 3959/2009/4847 3957/2007/4845 3989/2039/4877 3976/2026/4864 +f 3969/2019/4857 3990/2040/4878 3979/2029/4867 3974/2024/4862 +f 3971/2021/4859 3970/2020/4858 3991/2041/4879 3982/2032/4870 +f 3951/2001/4839 3939/1989/4827 3931/1981/4819 3952/2002/4840 +f 3992/2042/4880 3993/2043/4881 3994/2044/4882 3995/2045/4883 +f 3996/2046/4884 3992/2042/4880 3995/2045/4883 3997/2047/4885 +f 3998/2048/4886 3996/2046/4884 3997/2047/4885 3999/2049/4887 +f 4000/2050/4888 3998/2048/4886 3999/2049/4887 4001/2051/4889 +f 4002/2052/4890 4003/2053/4891 3993/2043/4881 3992/2042/4880 +f 4004/2054/4892 4002/2052/4890 3992/2042/4880 3996/2046/4884 +f 4005/2055/4893 4004/2054/4892 3996/2046/4884 3998/2048/4886 +f 4006/2056/4894 4005/2055/4893 3998/2048/4886 4000/2050/4888 +f 4007/2057/4895 4008/2058/4896 4003/2053/4891 4002/2052/4890 +f 4009/2059/4897 4007/2057/4895 4002/2052/4890 4004/2054/4892 +f 4010/2060/4898 4009/2059/4897 4004/2054/4892 4005/2055/4893 +f 4011/2061/4899 4010/2060/4898 4005/2055/4893 4006/2056/4894 +f 4012/2062/4900 4013/2063/4901 4008/2058/4896 4007/2057/4895 +f 4014/2064/4902 4012/2062/4900 4007/2057/4895 4009/2059/4897 +f 4015/2065/4903 4014/2064/4902 4009/2059/4897 4010/2060/4898 +f 4016/2066/4904 4015/2065/4903 4010/2060/4898 4011/2061/4899 +f 3994/2044/4882 3978/2028/4866 3977/2027/4865 4017/2067/4905 +f 4018/2068/4906 4019/2069/4907 4020/2070/4908 4001/2051/4889 +f 4016/2066/4904 4021/2071/4909 4022/2072/4910 4023/2073/4911 +f 4024/2074/4912 3980/2030/4868 3979/2029/4867 4013/2063/4901 +f 3995/2045/4883 3994/2044/4882 4017/2067/4905 4025/2075/4913 +f 4001/2051/4889 4020/2070/4908 4026/2076/4914 4000/2050/4888 +f 4015/2065/4903 4016/2066/4904 4023/2073/4911 4027/2077/4915 +f 4013/2063/4901 3979/2029/4867 3990/2040/4878 4008/2058/4896 +f 3997/2047/4885 3995/2045/4883 4025/2075/4913 4028/2078/4916 +f 4000/2050/4888 4026/2076/4914 4029/2079/4917 4006/2056/4894 +f 4014/2064/4902 4015/2065/4903 4027/2077/4915 4030/2080/4918 +f 4008/2058/4896 3990/2040/4878 3987/2037/4875 4003/2053/4891 +f 3999/2049/4887 3997/2047/4885 4028/2078/4916 4031/2081/4919 +f 4006/2056/4894 4029/2079/4917 4032/2082/4920 4011/2061/4899 +f 4012/2062/4900 4014/2064/4902 4030/2080/4918 4033/2083/4921 +f 4003/2053/4891 3987/2037/4875 3984/2034/4872 3993/2043/4881 +f 4001/2051/4889 3999/2049/4887 4031/2081/4919 4018/2068/4906 +f 4011/2061/4899 4032/2082/4920 4021/2071/4909 4016/2066/4904 +f 4013/2063/4901 4012/2062/4900 4033/2083/4921 4024/2074/4912 +f 3993/2043/4881 3984/2034/4872 3978/2028/4866 3994/2044/4882 +f 4034/2084/4922 4035/2085/4923 4036/2086/4924 4037/2087/4925 +f 4038/2088/4926 4034/2084/4922 4037/2087/4925 4039/2089/4927 +f 4040/2090/4928 4038/2088/4926 4039/2089/4927 4041/2091/4929 +f 4042/2092/4930 4040/2090/4928 4041/2091/4929 4043/2093/4931 +f 4044/2094/4932 4045/2095/4933 4035/2085/4923 4034/2084/4922 +f 4046/2096/4934 4044/2094/4932 4034/2084/4922 4038/2088/4926 +f 4047/2097/4935 4046/2096/4934 4038/2088/4926 4040/2090/4928 +f 4048/2098/4936 4047/2097/4935 4040/2090/4928 4042/2092/4930 +f 4049/2099/4937 4050/2100/4938 4045/2095/4933 4044/2094/4932 +f 4051/2101/4939 4049/2099/4937 4044/2094/4932 4046/2096/4934 +f 4052/2102/4940 4051/2101/4939 4046/2096/4934 4047/2097/4935 +f 4053/2103/4941 4052/2102/4940 4047/2097/4935 4048/2098/4936 +f 4054/2104/4942 4055/2105/4943 4050/2100/4938 4049/2099/4937 +f 4056/2106/4944 4054/2104/4942 4049/2099/4937 4051/2101/4939 +f 4057/2107/4945 4056/2106/4944 4051/2101/4939 4052/2102/4940 +f 4058/2108/4946 4057/2107/4945 4052/2102/4940 4053/2103/4941 +f 4036/2086/4924 4020/2070/4908 4019/2069/4907 4059/2109/4947 +f 4060/2110/4948 4061/2111/4949 4062/2112/4950 4043/2093/4931 +f 4058/2108/4946 4063/2113/4951 4064/2114/4952 4065/2115/4953 +f 4066/2116/4954 4022/2072/4910 4021/2071/4909 4055/2105/4943 +f 4037/2087/4925 4036/2086/4924 4059/2109/4947 4067/2117/4955 +f 4043/2093/4931 4062/2112/4950 4068/2118/4956 4042/2092/4930 +f 4057/2107/4945 4058/2108/4946 4065/2115/4953 4069/2119/4957 +f 4055/2105/4943 4021/2071/4909 4032/2082/4920 4050/2100/4938 +f 4039/2089/4927 4037/2087/4925 4067/2117/4955 4070/2120/4958 +f 4042/2092/4930 4068/2118/4956 4071/2121/4959 4048/2098/4936 +f 4056/2106/4944 4057/2107/4945 4069/2119/4957 4072/2122/4960 +f 4050/2100/4938 4032/2082/4920 4029/2079/4917 4045/2095/4933 +f 4041/2091/4929 4039/2089/4927 4070/2120/4958 4073/2123/4961 +f 4048/2098/4936 4071/2121/4959 4074/2124/4962 4053/2103/4941 +f 4054/2104/4942 4056/2106/4944 4072/2122/4960 4075/2125/4963 +f 4045/2095/4933 4029/2079/4917 4026/2076/4914 4035/2085/4923 +f 4043/2093/4931 4041/2091/4929 4073/2123/4961 4060/2110/4948 +f 4053/2103/4941 4074/2124/4962 4063/2113/4951 4058/2108/4946 +f 4055/2105/4943 4054/2104/4942 4075/2125/4963 4066/2116/4954 +f 4035/2085/4923 4026/2076/4914 4020/2070/4908 4036/2086/4924 +f 4076/2126/4964 4077/2127/4965 4078/2128/4966 4079/2129/4967 +f 4080/2130/4968 4076/2126/4964 4079/2129/4967 4081/2131/4969 +f 4082/2132/4970 4080/2130/4968 4081/2131/4969 4083/2133/4971 +f 4084/2134/4972 4082/2132/4970 4083/2133/4971 4085/2135/4973 +f 4086/2136/4974 4087/2137/4975 4077/2127/4965 4076/2126/4964 +f 4088/2138/4976 4086/2136/4974 4076/2126/4964 4080/2130/4968 +f 4089/2139/4977 4088/2138/4976 4080/2130/4968 4082/2132/4970 +f 4090/2140/4978 4089/2139/4977 4082/2132/4970 4084/2134/4972 +f 4091/2141/4979 4092/2142/4980 4087/2137/4975 4086/2136/4974 +f 4093/2143/4981 4091/2141/4979 4086/2136/4974 4088/2138/4976 +f 4094/2144/4982 4093/2143/4981 4088/2138/4976 4089/2139/4977 +f 4095/2145/4983 4094/2144/4982 4089/2139/4977 4090/2140/4978 +f 4096/2146/4984 4097/2147/4985 4092/2142/4980 4091/2141/4979 +f 4098/2148/4986 4096/2146/4984 4091/2141/4979 4093/2143/4981 +f 4099/2149/4987 4098/2148/4986 4093/2143/4981 4094/2144/4982 +f 4100/2150/4988 4099/2149/4987 4094/2144/4982 4095/2145/4983 +f 4078/2128/4966 4101/2151/4989 4102/2152/4990 4103/2153/4991 +f 4104/2154/4992 4105/2155/4993 4106/2156/4994 4085/2135/4973 +f 4100/2150/4988 4107/2157/4995 3930/1980/4818 3929/1979/4817 +f 3928/1978/4816 3927/1977/4815 4108/2158/4996 4097/2147/4985 +f 4079/2129/4967 4078/2128/4966 4103/2153/4991 4109/2159/4997 +f 4085/2135/4973 4106/2156/4994 4110/2160/4998 4084/2134/4972 +f 4099/2149/4987 4100/2150/4988 3929/1979/4817 3946/1996/4834 +f 4097/2147/4985 4108/2158/4996 4111/2161/4999 4092/2142/4980 +f 4081/2131/4969 4079/2129/4967 4109/2159/4997 4112/2162/5000 +f 4084/2134/4972 4110/2160/4998 4113/2163/5001 4090/2140/4978 +f 4098/2148/4986 4099/2149/4987 3946/1996/4834 3942/1992/4830 +f 4092/2142/4980 4111/2161/4999 4114/2164/5002 4087/2137/4975 +f 4083/2133/4971 4081/2131/4969 4112/2162/5000 4115/2165/5003 +f 4090/2140/4978 4113/2163/5001 4116/2166/5004 4095/2145/4983 +f 4096/2146/4984 4098/2148/4986 3942/1992/4830 3938/1988/4826 +f 4087/2137/4975 4114/2164/5002 4117/2167/5005 4077/2127/4965 +f 4085/2135/4973 4083/2133/4971 4115/2165/5003 4104/2154/4992 +f 4095/2145/4983 4116/2166/5004 4107/2157/4995 4100/2150/4988 +f 4097/2147/4985 4096/2146/4984 3938/1988/4826 3928/1978/4816 +f 4077/2127/4965 4117/2167/5005 4101/2151/4989 4078/2128/4966 +f 4118/2168/5006 4119/2169/5007 4120/2170/5008 4121/2171/5009 +f 4122/2172/5010 4118/2168/5006 4121/2171/5009 4123/2173/5011 +f 4124/2174/5012 4122/2172/5010 4123/2173/5011 4125/2175/5013 +f 4126/2176/5014 4124/2174/5012 4125/2175/5013 4127/2177/5015 +f 4128/2178/5016 4129/2179/5017 4119/2169/5007 4118/2168/5006 +f 4130/2180/5018 4128/2178/5016 4118/2168/5006 4122/2172/5010 +f 4131/2181/5019 4130/2180/5018 4122/2172/5010 4124/2174/5012 +f 4132/2182/5020 4131/2181/5019 4124/2174/5012 4126/2176/5014 +f 4133/2183/5021 4134/2184/5022 4129/2179/5017 4128/2178/5016 +f 4135/2185/5023 4133/2183/5021 4128/2178/5016 4130/2180/5018 +f 4136/2186/5024 4135/2185/5023 4130/2180/5018 4131/2181/5019 +f 4137/2187/5025 4136/2186/5024 4131/2181/5019 4132/2182/5020 +f 4138/2188/5026 4139/2189/5027 4134/2184/5022 4133/2183/5021 +f 4140/2190/5028 4138/2188/5026 4133/2183/5021 4135/2185/5023 +f 4141/2191/5029 4140/2190/5028 4135/2185/5023 4136/2186/5024 +f 4142/2192/5030 4141/2191/5029 4136/2186/5024 4137/2187/5025 +f 4120/2170/5008 4106/2156/4994 4105/2155/4993 4143/2193/5031 +f 4144/2194/5032 4145/2195/5033 4146/2196/5034 4127/2177/5015 +f 4142/2192/5030 4147/2197/5035 3977/2027/4865 3976/2026/4864 +f 3975/2025/4863 3930/1980/4818 4107/2157/4995 4139/2189/5027 +f 4121/2171/5009 4120/2170/5008 4143/2193/5031 4148/2198/5036 +f 4127/2177/5015 4146/2196/5034 4149/2199/5037 4126/2176/5014 +f 4141/2191/5029 4142/2192/5030 3976/2026/4864 3989/2039/4877 +f 4139/2189/5027 4107/2157/4995 4116/2166/5004 4134/2184/5022 +f 4123/2173/5011 4121/2171/5009 4148/2198/5036 4150/2200/5038 +f 4126/2176/5014 4149/2199/5037 4151/2201/5039 4132/2182/5020 +f 4140/2190/5028 4141/2191/5029 3989/2039/4877 3986/2036/4874 +f 4134/2184/5022 4116/2166/5004 4113/2163/5001 4129/2179/5017 +f 4125/2175/5013 4123/2173/5011 4150/2200/5038 4152/2202/5040 +f 4132/2182/5020 4151/2201/5039 4153/2203/5041 4137/2187/5025 +f 4138/2188/5026 4140/2190/5028 3986/2036/4874 3983/2033/4871 +f 4129/2179/5017 4113/2163/5001 4110/2160/4998 4119/2169/5007 +f 4127/2177/5015 4125/2175/5013 4152/2202/5040 4144/2194/5032 +f 4137/2187/5025 4153/2203/5041 4147/2197/5035 4142/2192/5030 +f 4139/2189/5027 4138/2188/5026 3983/2033/4871 3975/2025/4863 +f 4119/2169/5007 4110/2160/4998 4106/2156/4994 4120/2170/5008 +f 4154/2204/5042 4155/2205/5043 4156/2206/5044 4157/2207/5045 +f 4158/2208/5046 4154/2204/5042 4157/2207/5045 4159/2209/5047 +f 4160/2210/5048 4158/2208/5046 4159/2209/5047 4161/2211/5049 +f 4162/2212/5050 4160/2210/5048 4161/2211/5049 4163/2213/5051 +f 4164/2214/5052 4165/2215/5053 4155/2205/5043 4154/2204/5042 +f 4166/2216/5054 4164/2214/5052 4154/2204/5042 4158/2208/5046 +f 4167/2217/5055 4166/2216/5054 4158/2208/5046 4160/2210/5048 +f 4168/2218/5056 4167/2217/5055 4160/2210/5048 4162/2212/5050 +f 4169/2219/5057 4170/2220/5058 4165/2215/5053 4164/2214/5052 +f 4171/2221/5059 4169/2219/5057 4164/2214/5052 4166/2216/5054 +f 4172/2222/5060 4171/2221/5059 4166/2216/5054 4167/2217/5055 +f 4173/2223/5061 4172/2222/5060 4167/2217/5055 4168/2218/5056 +f 4174/2224/5062 4175/2225/5063 4170/2220/5058 4169/2219/5057 +f 4176/2226/5064 4174/2224/5062 4169/2219/5057 4171/2221/5059 +f 4177/2227/5065 4176/2226/5064 4171/2221/5059 4172/2222/5060 +f 4178/2228/5066 4177/2227/5065 4172/2222/5060 4173/2223/5061 +f 4156/2206/5044 4146/2196/5034 4145/2195/5033 4179/2229/5067 +f 4180/2230/5068 4181/2231/5069 4182/2232/5070 4163/2213/5051 +f 4178/2228/5066 4183/2233/5071 4019/2069/4907 4018/2068/4906 +f 4017/2067/4905 3977/2027/4865 4147/2197/5035 4175/2225/5063 +f 4157/2207/5045 4156/2206/5044 4179/2229/5067 4184/2234/5072 +f 4163/2213/5051 4182/2232/5070 4185/2235/5073 4162/2212/5050 +f 4177/2227/5065 4178/2228/5066 4018/2068/4906 4031/2081/4919 +f 4175/2225/5063 4147/2197/5035 4153/2203/5041 4170/2220/5058 +f 4159/2209/5047 4157/2207/5045 4184/2234/5072 4186/2236/5074 +f 4162/2212/5050 4185/2235/5073 4187/2237/5075 4168/2218/5056 +f 4176/2226/5064 4177/2227/5065 4031/2081/4919 4028/2078/4916 +f 4170/2220/5058 4153/2203/5041 4151/2201/5039 4165/2215/5053 +f 4161/2211/5049 4159/2209/5047 4186/2236/5074 4188/2238/5076 +f 4168/2218/5056 4187/2237/5075 4189/2239/5077 4173/2223/5061 +f 4174/2224/5062 4176/2226/5064 4028/2078/4916 4025/2075/4913 +f 4165/2215/5053 4151/2201/5039 4149/2199/5037 4155/2205/5043 +f 4163/2213/5051 4161/2211/5049 4188/2238/5076 4180/2230/5068 +f 4173/2223/5061 4189/2239/5077 4183/2233/5071 4178/2228/5066 +f 4175/2225/5063 4174/2224/5062 4025/2075/4913 4017/2067/4905 +f 4155/2205/5043 4149/2199/5037 4146/2196/5034 4156/2206/5044 +f 4190/2240/5078 4191/2241/5079 4192/2242/5080 4193/2243/5081 +f 4194/2244/5082 4190/2240/5078 4193/2243/5081 4195/2245/5083 +f 4196/2246/5084 4194/2244/5082 4195/2245/5083 4197/2247/5085 +f 4198/2248/5086 4196/2246/5084 4197/2247/5085 4199/2249/5087 +f 4200/2250/5088 4201/2251/5089 4191/2241/5079 4190/2240/5078 +f 4202/2252/5090 4200/2250/5088 4190/2240/5078 4194/2244/5082 +f 4203/2253/5091 4202/2252/5090 4194/2244/5082 4196/2246/5084 +f 4204/2254/5092 4203/2253/5091 4196/2246/5084 4198/2248/5086 +f 4205/2255/5093 4206/2256/5094 4201/2251/5089 4200/2250/5088 +f 4207/2257/5095 4205/2255/5093 4200/2250/5088 4202/2252/5090 +f 4208/2258/5096 4207/2257/5095 4202/2252/5090 4203/2253/5091 +f 4209/2259/5097 4208/2258/5096 4203/2253/5091 4204/2254/5092 +f 4210/2260/5098 4211/2261/5099 4206/2256/5094 4205/2255/5093 +f 4212/2262/5100 4210/2260/5098 4205/2255/5093 4207/2257/5095 +f 4213/2263/5101 4212/2262/5100 4207/2257/5095 4208/2258/5096 +f 4214/2264/5102 4213/2263/5101 4208/2258/5096 4209/2259/5097 +f 4192/2242/5080 4182/2232/5070 4181/2231/5069 4215/2265/5103 +f 4216/2266/5104 4217/2267/5105 4218/2268/5106 4199/2249/5087 +f 4214/2264/5102 4219/2269/5107 4061/2111/4949 4060/2110/4948 +f 4059/2109/4947 4019/2069/4907 4183/2233/5071 4211/2261/5099 +f 4193/2243/5081 4192/2242/5080 4215/2265/5103 4220/2270/5108 +f 4199/2249/5087 4218/2268/5106 4221/2271/5109 4198/2248/5086 +f 4213/2263/5101 4214/2264/5102 4060/2110/4948 4073/2123/4961 +f 4211/2261/5099 4183/2233/5071 4189/2239/5077 4206/2256/5094 +f 4195/2245/5083 4193/2243/5081 4220/2270/5108 4222/2272/5110 +f 4198/2248/5086 4221/2271/5109 4223/2273/5111 4204/2254/5092 +f 4212/2262/5100 4213/2263/5101 4073/2123/4961 4070/2120/4958 +f 4206/2256/5094 4189/2239/5077 4187/2237/5075 4201/2251/5089 +f 4197/2247/5085 4195/2245/5083 4222/2272/5110 4224/2274/5112 +f 4204/2254/5092 4223/2273/5111 4225/2275/5113 4209/2259/5097 +f 4210/2260/5098 4212/2262/5100 4070/2120/4958 4067/2117/4955 +f 4201/2251/5089 4187/2237/5075 4185/2235/5073 4191/2241/5079 +f 4199/2249/5087 4197/2247/5085 4224/2274/5112 4216/2266/5104 +f 4209/2259/5097 4225/2275/5113 4219/2269/5107 4214/2264/5102 +f 4211/2261/5099 4210/2260/5098 4067/2117/4955 4059/2109/4947 +f 4191/2241/5079 4185/2235/5073 4182/2232/5070 4192/2242/5080 +f 4226/1953/5114 4227/1952/5115 4228/1951/5116 4229/1954/5117 +f 4229/1954/5117 4228/1951/5116 4230/1955/5118 4231/1956/5119 +f 4231/1956/5119 4230/1955/5118 4232/1957/5120 4233/1958/5121 +f 4233/1958/5121 4232/1957/5120 4234/1959/5122 4235/1960/5123 +f 4227/1952/5115 4236/1962/5124 4237/1961/5125 4228/1951/5116 +f 4228/1951/5116 4237/1961/5125 4238/1963/5126 4230/1955/5118 +f 4230/1955/5118 4238/1963/5126 4239/1964/5127 4232/1957/5120 +f 4232/1957/5120 4239/1964/5127 4240/1965/5128 4234/1959/5122 +f 4236/1962/5124 4241/1967/5129 4242/1966/5130 4237/1961/5125 +f 4237/1961/5125 4242/1966/5130 4243/1968/5131 4238/1963/5126 +f 4238/1963/5126 4243/1968/5131 4244/1969/5132 4239/1964/5127 +f 4239/1964/5127 4244/1969/5132 4245/1970/5133 4240/1965/5128 +f 4241/1967/5129 4246/1972/5134 4247/1971/5135 4242/1966/5130 +f 4242/1966/5130 4247/1971/5135 4248/1973/5136 4243/1968/5131 +f 4243/1968/5131 4248/1973/5136 4249/1974/5137 4244/1969/5132 +f 4244/1969/5132 4249/1974/5137 4250/1975/5138 4245/1970/5133 +f 4251/1977/5139 4252/1976/5140 4226/1953/5114 4253/1978/5141 +f 4254/1981/5142 4255/1980/5143 4256/1979/5144 4235/1960/5123 +f 4257/1983/5145 4258/1982/5146 4250/1975/5138 4259/1984/5147 +f 4260/1987/5148 4261/1986/5149 4262/1985/5150 4246/1972/5134 +f 4253/1978/5141 4226/1953/5114 4229/1954/5117 4263/1988/5151 +f 4264/1989/5152 4254/1981/5142 4235/1960/5123 4234/1959/5122 +f 4259/1984/5147 4250/1975/5138 4249/1974/5137 4265/1990/5153 +f 4266/1991/5154 4260/1987/5148 4246/1972/5134 4241/1967/5129 +f 4263/1988/5151 4229/1954/5117 4231/1956/5119 4267/1992/5155 +f 4268/1993/5156 4264/1989/5152 4234/1959/5122 4240/1965/5128 +f 4265/1990/5153 4249/1974/5137 4248/1973/5136 4269/1994/5157 +f 4270/1995/5158 4266/1991/5154 4241/1967/5129 4236/1962/5124 +f 4267/1992/5155 4231/1956/5119 4233/1958/5121 4271/1996/5159 +f 4272/1997/5160 4268/1993/5156 4240/1965/5128 4245/1970/5133 +f 4269/1994/5157 4248/1973/5136 4247/1971/5135 4273/1998/5161 +f 4274/1999/5162 4270/1995/5158 4236/1962/5124 4227/1952/5115 +f 4271/1996/5159 4233/1958/5121 4235/1960/5123 4256/1979/5144 +f 4258/1982/5146 4272/1997/5160 4245/1970/5133 4250/1975/5138 +f 4273/1998/5161 4247/1971/5135 4246/1972/5134 4262/1985/5150 +f 4252/1976/5140 4274/1999/5162 4227/1952/5115 4226/1953/5114 +f 4275/2002/5163 4276/2001/5164 4277/2000/5165 4278/2003/5166 +f 4278/2003/5166 4277/2000/5165 4279/2004/5167 4280/2005/5168 +f 4280/2005/5168 4279/2004/5167 4281/2006/5169 4282/2007/5170 +f 4282/2007/5170 4281/2006/5169 4283/2008/5171 4284/2009/5172 +f 4276/2001/5164 4285/2011/5173 4286/2010/5174 4277/2000/5165 +f 4277/2000/5165 4286/2010/5174 4287/2012/5175 4279/2004/5167 +f 4279/2004/5167 4287/2012/5175 4288/2013/5176 4281/2006/5169 +f 4281/2006/5169 4288/2013/5176 4289/2014/5177 4283/2008/5171 +f 4285/2011/5173 4290/2016/5178 4291/2015/5179 4286/2010/5174 +f 4286/2010/5174 4291/2015/5179 4292/2017/5180 4287/2012/5175 +f 4287/2012/5175 4292/2017/5180 4293/2018/5181 4288/2013/5176 +f 4288/2013/5176 4293/2018/5181 4294/2019/5182 4289/2014/5177 +f 4290/2016/5178 4295/2021/5183 4296/2020/5184 4291/2015/5179 +f 4291/2015/5179 4296/2020/5184 4297/2022/5185 4292/2017/5180 +f 4292/2017/5180 4297/2022/5185 4298/2023/5186 4293/2018/5181 +f 4293/2018/5181 4298/2023/5186 4299/2024/5187 4294/2019/5182 +f 4255/1980/5143 4254/1981/5142 4275/2002/5163 4300/2025/5188 +f 4301/2028/5189 4302/2027/5190 4303/2026/5191 4284/2009/5172 +f 4304/2030/5192 4305/2029/5193 4299/2024/5187 4306/2031/5194 +f 4258/1982/5146 4257/1983/5145 4307/2032/5195 4295/2021/5183 +f 4300/2025/5188 4275/2002/5163 4278/2003/5166 4308/2033/5196 +f 4309/2034/5197 4301/2028/5189 4284/2009/5172 4283/2008/5171 +f 4306/2031/5194 4299/2024/5187 4298/2023/5186 4310/2035/5198 +f 4272/1997/5160 4258/1982/5146 4295/2021/5183 4290/2016/5178 +f 4308/2033/5196 4278/2003/5166 4280/2005/5168 4311/2036/5199 +f 4312/2037/5200 4309/2034/5197 4283/2008/5171 4289/2014/5177 +f 4310/2035/5198 4298/2023/5186 4297/2022/5185 4313/2038/5201 +f 4268/1993/5156 4272/1997/5160 4290/2016/5178 4285/2011/5173 +f 4311/2036/5199 4280/2005/5168 4282/2007/5170 4314/2039/5202 +f 4315/2040/5203 4312/2037/5200 4289/2014/5177 4294/2019/5182 +f 4313/2038/5201 4297/2022/5185 4296/2020/5184 4316/2041/5204 +f 4264/1989/5152 4268/1993/5156 4285/2011/5173 4276/2001/5164 +f 4314/2039/5202 4282/2007/5170 4284/2009/5172 4303/2026/5191 +f 4305/2029/5193 4315/2040/5203 4294/2019/5182 4299/2024/5187 +f 4316/2041/5204 4296/2020/5184 4295/2021/5183 4307/2032/5195 +f 4254/1981/5142 4264/1989/5152 4276/2001/5164 4275/2002/5163 +f 4317/2044/5205 4318/2043/5206 4319/2042/5207 4320/2045/5208 +f 4320/2045/5208 4319/2042/5207 4321/2046/5209 4322/2047/5210 +f 4322/2047/5210 4321/2046/5209 4323/2048/5211 4324/2049/5212 +f 4324/2049/5212 4323/2048/5211 4325/2050/5213 4326/2051/5214 +f 4318/2043/5206 4327/2053/5215 4328/2052/5216 4319/2042/5207 +f 4319/2042/5207 4328/2052/5216 4329/2054/5217 4321/2046/5209 +f 4321/2046/5209 4329/2054/5217 4330/2055/5218 4323/2048/5211 +f 4323/2048/5211 4330/2055/5218 4331/2056/5219 4325/2050/5213 +f 4327/2053/5215 4332/2058/5220 4333/2057/5221 4328/2052/5216 +f 4328/2052/5216 4333/2057/5221 4334/2059/5222 4329/2054/5217 +f 4329/2054/5217 4334/2059/5222 4335/2060/5223 4330/2055/5218 +f 4330/2055/5218 4335/2060/5223 4336/2061/5224 4331/2056/5219 +f 4332/2058/5220 4337/2063/5225 4338/2062/5226 4333/2057/5221 +f 4333/2057/5221 4338/2062/5226 4339/2064/5227 4334/2059/5222 +f 4334/2059/5222 4339/2064/5227 4340/2065/5228 4335/2060/5223 +f 4335/2060/5223 4340/2065/5228 4341/2066/5229 4336/2061/5224 +f 4302/2027/5190 4301/2028/5189 4317/2044/5205 4342/2067/5230 +f 4343/2070/5231 4344/2069/5232 4345/2068/5233 4326/2051/5214 +f 4346/2072/5234 4347/2071/5235 4341/2066/5229 4348/2073/5236 +f 4305/2029/5193 4304/2030/5192 4349/2074/5237 4337/2063/5225 +f 4342/2067/5230 4317/2044/5205 4320/2045/5208 4350/2075/5238 +f 4351/2076/5239 4343/2070/5231 4326/2051/5214 4325/2050/5213 +f 4348/2073/5236 4341/2066/5229 4340/2065/5228 4352/2077/5240 +f 4315/2040/5203 4305/2029/5193 4337/2063/5225 4332/2058/5220 +f 4350/2075/5238 4320/2045/5208 4322/2047/5210 4353/2078/5241 +f 4354/2079/5242 4351/2076/5239 4325/2050/5213 4331/2056/5219 +f 4352/2077/5240 4340/2065/5228 4339/2064/5227 4355/2080/5243 +f 4312/2037/5200 4315/2040/5203 4332/2058/5220 4327/2053/5215 +f 4353/2078/5241 4322/2047/5210 4324/2049/5212 4356/2081/5244 +f 4357/2082/5245 4354/2079/5242 4331/2056/5219 4336/2061/5224 +f 4355/2080/5243 4339/2064/5227 4338/2062/5226 4358/2083/5246 +f 4309/2034/5197 4312/2037/5200 4327/2053/5215 4318/2043/5206 +f 4356/2081/5244 4324/2049/5212 4326/2051/5214 4345/2068/5233 +f 4347/2071/5235 4357/2082/5245 4336/2061/5224 4341/2066/5229 +f 4358/2083/5246 4338/2062/5226 4337/2063/5225 4349/2074/5237 +f 4301/2028/5189 4309/2034/5197 4318/2043/5206 4317/2044/5205 +f 4359/2086/5247 4360/2085/5248 4361/2084/5249 4362/2087/5250 +f 4362/2087/5250 4361/2084/5249 4363/2088/5251 4364/2089/5252 +f 4364/2089/5252 4363/2088/5251 4365/2090/5253 4366/2091/5254 +f 4366/2091/5254 4365/2090/5253 4367/2092/5255 4368/2093/5256 +f 4360/2085/5248 4369/2095/5257 4370/2094/5258 4361/2084/5249 +f 4361/2084/5249 4370/2094/5258 4371/2096/5259 4363/2088/5251 +f 4363/2088/5251 4371/2096/5259 4372/2097/5260 4365/2090/5253 +f 4365/2090/5253 4372/2097/5260 4373/2098/5261 4367/2092/5255 +f 4369/2095/5257 4374/2100/5262 4375/2099/5263 4370/2094/5258 +f 4370/2094/5258 4375/2099/5263 4376/2101/5264 4371/2096/5259 +f 4371/2096/5259 4376/2101/5264 4377/2102/5265 4372/2097/5260 +f 4372/2097/5260 4377/2102/5265 4378/2103/5266 4373/2098/5261 +f 4374/2100/5262 4379/2105/5267 4380/2104/5268 4375/2099/5263 +f 4375/2099/5263 4380/2104/5268 4381/2106/5269 4376/2101/5264 +f 4376/2101/5264 4381/2106/5269 4382/2107/5270 4377/2102/5265 +f 4377/2102/5265 4382/2107/5270 4383/2108/5271 4378/2103/5266 +f 4344/2069/5232 4343/2070/5231 4359/2086/5247 4384/2109/5272 +f 4385/2112/5273 4386/2111/5274 4387/2110/5275 4368/2093/5256 +f 4388/2114/5276 4389/2113/5277 4383/2108/5271 4390/2115/5278 +f 4347/2071/5235 4346/2072/5234 4391/2116/5279 4379/2105/5267 +f 4384/2109/5272 4359/2086/5247 4362/2087/5250 4392/2117/5280 +f 4393/2118/5281 4385/2112/5273 4368/2093/5256 4367/2092/5255 +f 4390/2115/5278 4383/2108/5271 4382/2107/5270 4394/2119/5282 +f 4357/2082/5245 4347/2071/5235 4379/2105/5267 4374/2100/5262 +f 4392/2117/5280 4362/2087/5250 4364/2089/5252 4395/2120/5283 +f 4396/2121/5284 4393/2118/5281 4367/2092/5255 4373/2098/5261 +f 4394/2119/5282 4382/2107/5270 4381/2106/5269 4397/2122/5285 +f 4354/2079/5242 4357/2082/5245 4374/2100/5262 4369/2095/5257 +f 4395/2120/5283 4364/2089/5252 4366/2091/5254 4398/2123/5286 +f 4399/2124/5287 4396/2121/5284 4373/2098/5261 4378/2103/5266 +f 4397/2122/5285 4381/2106/5269 4380/2104/5268 4400/2125/5288 +f 4351/2076/5239 4354/2079/5242 4369/2095/5257 4360/2085/5248 +f 4398/2123/5286 4366/2091/5254 4368/2093/5256 4387/2110/5275 +f 4389/2113/5277 4399/2124/5287 4378/2103/5266 4383/2108/5271 +f 4400/2125/5288 4380/2104/5268 4379/2105/5267 4391/2116/5279 +f 4343/2070/5231 4351/2076/5239 4360/2085/5248 4359/2086/5247 +f 4401/2128/5289 4402/2127/5290 4403/2126/5291 4404/2129/5292 +f 4404/2129/5292 4403/2126/5291 4405/2130/5293 4406/2131/5294 +f 4406/2131/5294 4405/2130/5293 4407/2132/5295 4408/2133/5296 +f 4408/2133/5296 4407/2132/5295 4409/2134/5297 4410/2135/5298 +f 4402/2127/5290 4411/2137/5299 4412/2136/5300 4403/2126/5291 +f 4403/2126/5291 4412/2136/5300 4413/2138/5301 4405/2130/5293 +f 4405/2130/5293 4413/2138/5301 4414/2139/5302 4407/2132/5295 +f 4407/2132/5295 4414/2139/5302 4415/2140/5303 4409/2134/5297 +f 4411/2137/5299 4416/2142/5304 4417/2141/5305 4412/2136/5300 +f 4412/2136/5300 4417/2141/5305 4418/2143/5306 4413/2138/5301 +f 4413/2138/5301 4418/2143/5306 4419/2144/5307 4414/2139/5302 +f 4414/2139/5302 4419/2144/5307 4420/2145/5308 4415/2140/5303 +f 4416/2142/5304 4421/2147/5309 4422/2146/5310 4417/2141/5305 +f 4417/2141/5305 4422/2146/5310 4423/2148/5311 4418/2143/5306 +f 4418/2143/5306 4423/2148/5311 4424/2149/5312 4419/2144/5307 +f 4419/2144/5307 4424/2149/5312 4425/2150/5313 4420/2145/5308 +f 4426/2152/5314 4427/2151/5315 4401/2128/5289 4428/2153/5316 +f 4429/2156/5317 4430/2155/5318 4431/2154/5319 4410/2135/5298 +f 4255/1980/5143 4432/2157/5320 4425/2150/5313 4256/1979/5144 +f 4433/2158/5321 4251/1977/5139 4253/1978/5141 4421/2147/5309 +f 4428/2153/5316 4401/2128/5289 4404/2129/5292 4434/2159/5322 +f 4435/2160/5323 4429/2156/5317 4410/2135/5298 4409/2134/5297 +f 4256/1979/5144 4425/2150/5313 4424/2149/5312 4271/1996/5159 +f 4436/2161/5324 4433/2158/5321 4421/2147/5309 4416/2142/5304 +f 4434/2159/5322 4404/2129/5292 4406/2131/5294 4437/2162/5325 +f 4438/2163/5326 4435/2160/5323 4409/2134/5297 4415/2140/5303 +f 4271/1996/5159 4424/2149/5312 4423/2148/5311 4267/1992/5155 +f 4439/2164/5327 4436/2161/5324 4416/2142/5304 4411/2137/5299 +f 4437/2162/5325 4406/2131/5294 4408/2133/5296 4440/2165/5328 +f 4441/2166/5329 4438/2163/5326 4415/2140/5303 4420/2145/5308 +f 4267/1992/5155 4423/2148/5311 4422/2146/5310 4263/1988/5151 +f 4442/2167/5330 4439/2164/5327 4411/2137/5299 4402/2127/5290 +f 4440/2165/5328 4408/2133/5296 4410/2135/5298 4431/2154/5319 +f 4432/2157/5320 4441/2166/5329 4420/2145/5308 4425/2150/5313 +f 4263/1988/5151 4422/2146/5310 4421/2147/5309 4253/1978/5141 +f 4427/2151/5315 4442/2167/5330 4402/2127/5290 4401/2128/5289 +f 4443/2170/5331 4444/2169/5332 4445/2168/5333 4446/2171/5334 +f 4446/2171/5334 4445/2168/5333 4447/2172/5335 4448/2173/5336 +f 4448/2173/5336 4447/2172/5335 4449/2174/5337 4450/2175/5338 +f 4450/2175/5338 4449/2174/5337 4451/2176/5339 4452/2177/5340 +f 4444/2169/5332 4453/2179/5341 4454/2178/5342 4445/2168/5333 +f 4445/2168/5333 4454/2178/5342 4455/2180/5343 4447/2172/5335 +f 4447/2172/5335 4455/2180/5343 4456/2181/5344 4449/2174/5337 +f 4449/2174/5337 4456/2181/5344 4457/2182/5345 4451/2176/5339 +f 4453/2179/5341 4458/2184/5346 4459/2183/5347 4454/2178/5342 +f 4454/2178/5342 4459/2183/5347 4460/2185/5348 4455/2180/5343 +f 4455/2180/5343 4460/2185/5348 4461/2186/5349 4456/2181/5344 +f 4456/2181/5344 4461/2186/5349 4462/2187/5350 4457/2182/5345 +f 4458/2184/5346 4463/2189/5351 4464/2188/5352 4459/2183/5347 +f 4459/2183/5347 4464/2188/5352 4465/2190/5353 4460/2185/5348 +f 4460/2185/5348 4465/2190/5353 4466/2191/5354 4461/2186/5349 +f 4461/2186/5349 4466/2191/5354 4467/2192/5355 4462/2187/5350 +f 4430/2155/5318 4429/2156/5317 4443/2170/5331 4468/2193/5356 +f 4469/2196/5357 4470/2195/5358 4471/2194/5359 4452/2177/5340 +f 4302/2027/5190 4472/2197/5360 4467/2192/5355 4303/2026/5191 +f 4432/2157/5320 4255/1980/5143 4300/2025/5188 4463/2189/5351 +f 4468/2193/5356 4443/2170/5331 4446/2171/5334 4473/2198/5361 +f 4474/2199/5362 4469/2196/5357 4452/2177/5340 4451/2176/5339 +f 4303/2026/5191 4467/2192/5355 4466/2191/5354 4314/2039/5202 +f 4441/2166/5329 4432/2157/5320 4463/2189/5351 4458/2184/5346 +f 4473/2198/5361 4446/2171/5334 4448/2173/5336 4475/2200/5363 +f 4476/2201/5364 4474/2199/5362 4451/2176/5339 4457/2182/5345 +f 4314/2039/5202 4466/2191/5354 4465/2190/5353 4311/2036/5199 +f 4438/2163/5326 4441/2166/5329 4458/2184/5346 4453/2179/5341 +f 4475/2200/5363 4448/2173/5336 4450/2175/5338 4477/2202/5365 +f 4478/2203/5366 4476/2201/5364 4457/2182/5345 4462/2187/5350 +f 4311/2036/5199 4465/2190/5353 4464/2188/5352 4308/2033/5196 +f 4435/2160/5323 4438/2163/5326 4453/2179/5341 4444/2169/5332 +f 4477/2202/5365 4450/2175/5338 4452/2177/5340 4471/2194/5359 +f 4472/2197/5360 4478/2203/5366 4462/2187/5350 4467/2192/5355 +f 4308/2033/5196 4464/2188/5352 4463/2189/5351 4300/2025/5188 +f 4429/2156/5317 4435/2160/5323 4444/2169/5332 4443/2170/5331 +f 4479/2206/5367 4480/2205/5368 4481/2204/5369 4482/2207/5370 +f 4482/2207/5370 4481/2204/5369 4483/2208/5371 4484/2209/5372 +f 4484/2209/5372 4483/2208/5371 4485/2210/5373 4486/2211/5374 +f 4486/2211/5374 4485/2210/5373 4487/2212/5375 4488/2213/5376 +f 4480/2205/5368 4489/2215/5377 4490/2214/5378 4481/2204/5369 +f 4481/2204/5369 4490/2214/5378 4491/2216/5379 4483/2208/5371 +f 4483/2208/5371 4491/2216/5379 4492/2217/5380 4485/2210/5373 +f 4485/2210/5373 4492/2217/5380 4493/2218/5381 4487/2212/5375 +f 4489/2215/5377 4494/2220/5382 4495/2219/5383 4490/2214/5378 +f 4490/2214/5378 4495/2219/5383 4496/2221/5384 4491/2216/5379 +f 4491/2216/5379 4496/2221/5384 4497/2222/5385 4492/2217/5380 +f 4492/2217/5380 4497/2222/5385 4498/2223/5386 4493/2218/5381 +f 4494/2220/5382 4499/2225/5387 4500/2224/5388 4495/2219/5383 +f 4495/2219/5383 4500/2224/5388 4501/2226/5389 4496/2221/5384 +f 4496/2221/5384 4501/2226/5389 4502/2227/5390 4497/2222/5385 +f 4497/2222/5385 4502/2227/5390 4503/2228/5391 4498/2223/5386 +f 4470/2195/5358 4469/2196/5357 4479/2206/5367 4504/2229/5392 +f 4505/2232/5393 4506/2231/5394 4507/2230/5395 4488/2213/5376 +f 4344/2069/5232 4508/2233/5396 4503/2228/5391 4345/2068/5233 +f 4472/2197/5360 4302/2027/5190 4342/2067/5230 4499/2225/5387 +f 4504/2229/5392 4479/2206/5367 4482/2207/5370 4509/2234/5397 +f 4510/2235/5398 4505/2232/5393 4488/2213/5376 4487/2212/5375 +f 4345/2068/5233 4503/2228/5391 4502/2227/5390 4356/2081/5244 +f 4478/2203/5366 4472/2197/5360 4499/2225/5387 4494/2220/5382 +f 4509/2234/5397 4482/2207/5370 4484/2209/5372 4511/2236/5399 +f 4512/2237/5400 4510/2235/5398 4487/2212/5375 4493/2218/5381 +f 4356/2081/5244 4502/2227/5390 4501/2226/5389 4353/2078/5241 +f 4476/2201/5364 4478/2203/5366 4494/2220/5382 4489/2215/5377 +f 4511/2236/5399 4484/2209/5372 4486/2211/5374 4513/2238/5401 +f 4514/2239/5402 4512/2237/5400 4493/2218/5381 4498/2223/5386 +f 4353/2078/5241 4501/2226/5389 4500/2224/5388 4350/2075/5238 +f 4474/2199/5362 4476/2201/5364 4489/2215/5377 4480/2205/5368 +f 4513/2238/5401 4486/2211/5374 4488/2213/5376 4507/2230/5395 +f 4508/2233/5396 4514/2239/5402 4498/2223/5386 4503/2228/5391 +f 4350/2075/5238 4500/2224/5388 4499/2225/5387 4342/2067/5230 +f 4469/2196/5357 4474/2199/5362 4480/2205/5368 4479/2206/5367 +f 4515/2242/5403 4516/2241/5404 4517/2240/5405 4518/2243/5406 +f 4518/2243/5406 4517/2240/5405 4519/2244/5407 4520/2245/5408 +f 4520/2245/5408 4519/2244/5407 4521/2246/5409 4522/2247/5410 +f 4522/2247/5410 4521/2246/5409 4523/2248/5411 4524/2249/5412 +f 4516/2241/5404 4525/2251/5413 4526/2250/5414 4517/2240/5405 +f 4517/2240/5405 4526/2250/5414 4527/2252/5415 4519/2244/5407 +f 4519/2244/5407 4527/2252/5415 4528/2253/5416 4521/2246/5409 +f 4521/2246/5409 4528/2253/5416 4529/2254/5417 4523/2248/5411 +f 4525/2251/5413 4530/2256/5418 4531/2255/5419 4526/2250/5414 +f 4526/2250/5414 4531/2255/5419 4532/2257/5420 4527/2252/5415 +f 4527/2252/5415 4532/2257/5420 4533/2258/5421 4528/2253/5416 +f 4528/2253/5416 4533/2258/5421 4534/2259/5422 4529/2254/5417 +f 4530/2256/5418 4535/2261/5423 4536/2260/5424 4531/2255/5419 +f 4531/2255/5419 4536/2260/5424 4537/2262/5425 4532/2257/5420 +f 4532/2257/5420 4537/2262/5425 4538/2263/5426 4533/2258/5421 +f 4533/2258/5421 4538/2263/5426 4539/2264/5427 4534/2259/5422 +f 4506/2231/5394 4505/2232/5393 4515/2242/5403 4540/2265/5428 +f 4541/2268/5429 4542/2267/5430 4543/2266/5431 4524/2249/5412 +f 4386/2111/5274 4544/2269/5432 4539/2264/5427 4387/2110/5275 +f 4508/2233/5396 4344/2069/5232 4384/2109/5272 4535/2261/5423 +f 4540/2265/5428 4515/2242/5403 4518/2243/5406 4545/2270/5433 +f 4546/2271/5434 4541/2268/5429 4524/2249/5412 4523/2248/5411 +f 4387/2110/5275 4539/2264/5427 4538/2263/5426 4398/2123/5286 +f 4514/2239/5402 4508/2233/5396 4535/2261/5423 4530/2256/5418 +f 4545/2270/5433 4518/2243/5406 4520/2245/5408 4547/2272/5435 +f 4548/2273/5436 4546/2271/5434 4523/2248/5411 4529/2254/5417 +f 4398/2123/5286 4538/2263/5426 4537/2262/5425 4395/2120/5283 +f 4512/2237/5400 4514/2239/5402 4530/2256/5418 4525/2251/5413 +f 4547/2272/5435 4520/2245/5408 4522/2247/5410 4549/2274/5437 +f 4550/2275/5438 4548/2273/5436 4529/2254/5417 4534/2259/5422 +f 4395/2120/5283 4537/2262/5425 4536/2260/5424 4392/2117/5280 +f 4510/2235/5398 4512/2237/5400 4525/2251/5413 4516/2241/5404 +f 4549/2274/5437 4522/2247/5410 4524/2249/5412 4543/2266/5431 +f 4544/2269/5432 4550/2275/5438 4534/2259/5422 4539/2264/5427 +f 4392/2117/5280 4536/2260/5424 4535/2261/5423 4384/2109/5272 +f 4505/2232/5393 4510/2235/5398 4516/2241/5404 4515/2242/5403 +s 2 +f 4252/1976/5439 4251/1977/5440 3927/1977/5441 3926/1976/5442 +s 4 +f 4257/1983/5443 4259/1984/5444 3934/1984/5445 3933/1983/5446 +f 4262/1985/5447 4261/1986/5448 3936/1986/5449 3935/1985/5450 +s 2 +f 4261/1986/5451 4260/1987/5452 3937/1987/5453 3936/1986/5454 +s 4 +f 4259/1984/5444 4265/1990/5455 3940/1990/5456 3934/1984/5445 +s 2 +f 4260/1987/5452 4266/1991/5457 3941/1991/5458 3937/1987/5453 +s 4 +f 4265/1990/5455 4269/1994/5459 3944/1994/5460 3940/1990/5456 +s 2 +f 4266/1991/5457 4270/1995/5461 3945/1995/5462 3941/1991/5458 +s 4 +f 4269/1994/5459 4273/1998/5463 3948/1998/5464 3944/1994/5460 +s 2 +f 4270/1995/5461 4274/1999/5465 3949/1999/5466 3945/1995/5462 +s 4 +f 4273/1998/5463 4262/1985/5447 3935/1985/5450 3948/1998/5464 +s 2 +f 4274/1999/5465 4252/1976/5439 3926/1976/5442 3949/1999/5466 +s 4 +f 4304/2030/5467 4306/2031/5468 3981/2031/5469 3980/2030/5470 +f 4307/2032/5471 4257/1983/5443 3933/1983/5446 3982/2032/5472 +f 4306/2031/5468 4310/2035/5473 3985/2035/5474 3981/2031/5469 +f 4310/2035/5473 4313/2038/5475 3988/2038/5476 3985/2035/5474 +f 4313/2038/5475 4316/2041/5477 3991/2041/5478 3988/2038/5476 +f 4316/2041/5477 4307/2032/5471 3982/2032/5472 3991/2041/5478 +f 4346/2072/5479 4348/2073/5480 4023/2073/5481 4022/2072/5482 +f 4349/2074/5483 4304/2030/5467 3980/2030/5470 4024/2074/5484 +f 4348/2073/5480 4352/2077/5485 4027/2077/5486 4023/2073/5481 +f 4352/2077/5485 4355/2080/5487 4030/2080/5488 4027/2077/5486 +f 4355/2080/5487 4358/2083/5489 4033/2083/5490 4030/2080/5488 +f 4358/2083/5489 4349/2074/5483 4024/2074/5484 4033/2083/5490 +f 4386/2111/5491 4385/2112/5492 4062/2112/5493 4061/2111/5494 +f 4388/2114/5495 4390/2115/5496 4065/2115/5497 4064/2114/5498 +f 4389/2113/5499 4388/2114/5495 4064/2114/5498 4063/2113/5500 +f 4391/2116/5501 4346/2072/5479 4022/2072/5482 4066/2116/5502 +f 4385/2112/5492 4393/2118/5503 4068/2118/5504 4062/2112/5493 +f 4390/2115/5496 4394/2119/5505 4069/2119/5506 4065/2115/5497 +f 4393/2118/5503 4396/2121/5507 4071/2121/5508 4068/2118/5504 +f 4394/2119/5505 4397/2122/5509 4072/2122/5510 4069/2119/5506 +f 4396/2121/5507 4399/2124/5511 4074/2124/5512 4071/2121/5508 +f 4397/2122/5509 4400/2125/5513 4075/2125/5514 4072/2122/5510 +f 4399/2124/5511 4389/2113/5499 4063/2113/5500 4074/2124/5512 +f 4400/2125/5513 4391/2116/5501 4066/2116/5502 4075/2125/5514 +f 4426/2152/5515 4428/2153/5516 4103/2153/5517 4102/2152/5518 +s 2 +f 4427/2151/5519 4426/2152/5520 4102/2152/5521 4101/2151/5522 +s 4 +f 4431/2154/5523 4430/2155/5524 4105/2155/5525 4104/2154/5526 +s 2 +f 4251/1977/5440 4433/2158/5527 4108/2158/5528 3927/1977/5441 +s 4 +f 4428/2153/5516 4434/2159/5529 4109/2159/5530 4103/2153/5517 +s 2 +f 4433/2158/5527 4436/2161/5531 4111/2161/5532 4108/2158/5528 +s 4 +f 4434/2159/5529 4437/2162/5533 4112/2162/5534 4109/2159/5530 +s 2 +f 4436/2161/5531 4439/2164/5535 4114/2164/5536 4111/2161/5532 +s 4 +f 4437/2162/5533 4440/2165/5537 4115/2165/5538 4112/2162/5534 +s 2 +f 4439/2164/5535 4442/2167/5539 4117/2167/5540 4114/2164/5536 +s 4 +f 4440/2165/5537 4431/2154/5523 4104/2154/5526 4115/2165/5538 +s 2 +f 4442/2167/5539 4427/2151/5519 4101/2151/5522 4117/2167/5540 +s 4 +f 4430/2155/5524 4468/2193/5541 4143/2193/5542 4105/2155/5525 +f 4471/2194/5543 4470/2195/5544 4145/2195/5545 4144/2194/5546 +f 4468/2193/5541 4473/2198/5547 4148/2198/5548 4143/2193/5542 +f 4473/2198/5547 4475/2200/5549 4150/2200/5550 4148/2198/5548 +f 4475/2200/5549 4477/2202/5551 4152/2202/5552 4150/2200/5550 +f 4477/2202/5551 4471/2194/5543 4144/2194/5546 4152/2202/5552 +f 4470/2195/5544 4504/2229/5553 4179/2229/5554 4145/2195/5545 +f 4507/2230/5555 4506/2231/5556 4181/2231/5557 4180/2230/5558 +f 4504/2229/5553 4509/2234/5559 4184/2234/5560 4179/2229/5554 +f 4509/2234/5559 4511/2236/5561 4186/2236/5562 4184/2234/5560 +f 4511/2236/5561 4513/2238/5563 4188/2238/5564 4186/2236/5562 +f 4513/2238/5563 4507/2230/5555 4180/2230/5558 4188/2238/5564 +f 4506/2231/5556 4540/2265/5565 4215/2265/5566 4181/2231/5557 +f 4543/2266/5567 4542/2267/5568 4217/2267/5569 4216/2266/5570 +f 4542/2267/5568 4541/2268/5571 4218/2268/5572 4217/2267/5569 +f 4544/2269/5573 4386/2111/5491 4061/2111/5494 4219/2269/5574 +f 4540/2265/5565 4545/2270/5575 4220/2270/5576 4215/2265/5566 +f 4541/2268/5571 4546/2271/5577 4221/2271/5578 4218/2268/5572 +f 4545/2270/5575 4547/2272/5579 4222/2272/5580 4220/2270/5576 +f 4546/2271/5577 4548/2273/5581 4223/2273/5582 4221/2271/5578 +f 4547/2272/5579 4549/2274/5583 4224/2274/5584 4222/2272/5580 +f 4548/2273/5581 4550/2275/5585 4225/2275/5586 4223/2273/5582 +f 4549/2274/5583 4543/2266/5567 4216/2266/5570 4224/2274/5584 +f 4550/2275/5585 4544/2269/5573 4219/2269/5574 4225/2275/5586 +# 648 polygons + +# +# object lotu_petal_07 +# + +v 0.2462 0.0617 0.1055 +v 0.2066 0.0535 0.0679 +v 0.1576 0.0435 0.0994 +v 0.1913 0.0548 0.1360 +v 0.2909 0.0782 0.1504 +v 0.2321 0.0681 0.1825 +v 0.3415 0.0959 0.1942 +v 0.2706 0.0803 0.2377 +v 0.3842 0.1132 0.2389 +v 0.3184 0.1083 0.2954 +v 0.3027 0.0795 0.0751 +v 0.2539 0.0695 0.0416 +v 0.3508 0.0975 0.1063 +v 0.4003 0.1203 0.1415 +v 0.4528 0.1333 0.1882 +v 0.3529 0.1110 0.0330 +v 0.3003 0.0945 0.0162 +v 0.4070 0.1312 0.0577 +v 0.4591 0.1463 0.0930 +v 0.5149 0.1680 0.1382 +v 0.4016 0.1428 -0.0084 +v 0.3420 0.1276 -0.0182 +v 0.4588 0.1563 0.0128 +v 0.5162 0.1775 0.0470 +v 0.5810 0.1984 0.0832 +v 0.1292 0.0343 0.0678 +v 0.0886 0.0298 0.0946 +v 0.1138 0.0405 0.1294 +v 0.2443 0.0988 0.3377 +v 0.2792 0.1239 0.4077 +v 0.3636 0.1300 0.3518 +v 0.6443 0.2231 0.1248 +v 0.7123 0.2585 0.0694 +v 0.6437 0.2376 0.0235 +v 0.3795 0.1643 -0.0544 +v 0.3090 0.1561 -0.0544 +v 0.2769 0.1167 -0.0257 +v 0.1392 0.0510 0.1713 +v 0.4361 0.1339 0.2978 +v 0.5804 0.2205 -0.0064 +v 0.2424 0.0864 -0.0053 +v 0.1695 0.0577 0.2199 +v 0.5015 0.1538 0.2440 +v 0.5161 0.2001 -0.0300 +v 0.2052 0.0660 0.0176 +v 0.2055 0.0759 0.2747 +v 0.5772 0.1819 0.1856 +v 0.4494 0.1789 -0.0470 +v 0.1704 0.0473 0.0421 +v 0.5356 0.2160 0.4287 +v 0.4846 0.1741 0.3584 +v 0.4033 0.1650 0.4176 +v 0.4407 0.2089 0.4858 +v 0.5695 0.2699 0.4947 +v 0.4719 0.2565 0.5670 +v 0.6001 0.3319 0.5675 +v 0.5143 0.3196 0.6429 +v 0.6528 0.4130 0.6560 +v 0.5763 0.4003 0.7232 +v 0.6158 0.2290 0.3578 +v 0.5608 0.1885 0.3004 +v 0.6649 0.2818 0.4281 +v 0.6971 0.3587 0.5033 +v 0.7361 0.4388 0.5932 +v 0.6898 0.2613 0.2983 +v 0.6352 0.2201 0.2363 +v 0.7456 0.3161 0.3647 +v 0.7937 0.3871 0.4369 +v 0.8325 0.4663 0.5221 +v 0.7688 0.3027 0.2347 +v 0.7093 0.2638 0.1793 +v 0.8223 0.3521 0.2993 +v 0.8751 0.4138 0.3748 +v 0.9201 0.4874 0.4548 +v 0.3193 0.1575 0.4713 +v 0.4929 0.3881 0.7917 +v 0.5614 0.4675 0.8696 +v 0.6415 0.4820 0.8084 +v 0.9665 0.5565 0.5363 +v 1.0485 0.5979 0.4640 +v 0.9975 0.5250 0.3838 +v 0.7805 0.3019 0.1167 +v 0.3479 0.2067 0.5428 +v 0.7210 0.4930 0.7473 +v 0.9514 0.4600 0.3083 +v 0.3802 0.2523 0.6252 +v 0.8005 0.5144 0.6800 +v 0.8933 0.3962 0.2358 +v 0.4299 0.3154 0.7077 +v 0.8750 0.5377 0.6070 +v 0.8363 0.3403 0.1719 +v 0.8344 0.7231 0.9312 +v 0.7877 0.5911 0.8408 +v 0.7136 0.5907 0.9091 +v 0.7618 0.7134 0.9989 +v 0.8585 0.8642 1.0408 +v 0.7922 0.8576 1.1062 +v 0.8982 1.0185 1.1257 +v 0.8358 1.0164 1.1978 +v 0.9163 1.1811 1.1994 +v 0.8545 1.1702 1.2641 +v 0.9091 0.7304 0.8730 +v 0.8665 0.6107 0.7639 +v 0.9253 0.8780 0.9692 +v 0.9617 1.0352 1.0556 +v 0.9862 1.1863 1.1308 +v 0.9833 0.7431 0.8078 +v 0.9454 0.6347 0.7012 +v 0.9979 0.8894 0.8980 +v 1.0232 1.0505 0.9852 +v 1.0437 1.2003 1.0602 +v 1.0612 0.7649 0.7342 +v 1.0196 0.6512 0.6336 +v 1.0743 0.8984 0.8288 +v 1.0826 1.0563 0.9102 +v 1.0958 1.2183 0.9926 +v 0.6278 0.5859 0.9653 +v 0.7866 1.1614 1.3161 +v 0.8184 1.3058 1.3704 +v 0.8779 1.3141 1.3101 +v 1.0774 1.3526 1.0686 +v 1.1226 1.3653 0.9950 +v 1.1392 1.2279 0.9138 +v 1.0950 0.6771 0.5600 +v 0.6874 0.7117 1.0688 +v 0.9340 1.3245 1.2468 +v 1.1408 1.0796 0.8416 +v 0.7233 0.8476 1.1746 +v 0.9847 1.3338 1.1921 +v 1.1419 0.9218 0.7480 +v 0.7667 1.0020 1.2572 +v 1.0302 1.3366 1.1328 +v 1.1342 0.7893 0.6554 +v 0.9124 1.5726 1.2919 +v 0.9277 1.4537 1.2818 +v 0.8786 1.4452 1.3300 +v 0.8699 1.5685 1.3382 +v 0.9069 1.6826 1.3069 +v 0.8692 1.6790 1.3446 +v 0.8738 1.7799 1.3058 +v 0.8476 1.7778 1.3398 +v 0.8343 1.8662 1.3088 +v 0.8148 1.8687 1.3312 +v 0.9540 1.5789 1.2497 +v 0.9719 1.4612 1.2288 +v 0.9411 1.6878 1.2677 +v 0.9027 1.7831 1.2705 +v 0.8556 1.8640 1.2846 +v 0.9912 1.5849 1.2000 +v 1.0117 1.4627 1.1737 +v 0.9757 1.6903 1.2223 +v 0.9308 1.7824 1.2359 +v 0.8775 1.8627 1.2615 +v 1.0268 1.5786 1.1466 +v 1.0518 1.4685 1.1121 +v 1.0075 1.6883 1.1790 +v 0.9607 1.7781 1.2050 +v 0.9002 1.8549 1.2412 +v 0.8254 1.4365 1.3811 +v 0.7980 1.8674 1.3489 +v 0.7768 1.9458 1.3343 +v 0.7892 1.9464 1.3260 +v 0.8386 1.9194 1.2875 +v 0.8493 1.9050 1.2761 +v 0.9178 1.8456 1.2212 +v 1.0888 1.4848 1.0466 +v 0.8229 1.5588 1.3825 +v 0.8017 1.9441 1.3165 +v 0.9837 1.7715 1.1766 +v 0.8306 1.6714 1.3761 +v 0.8147 1.9390 1.3071 +v 1.0333 1.6788 1.1348 +v 0.8232 1.7739 1.3630 +v 0.8271 1.9306 1.2979 +v 1.0573 1.5843 1.0895 +v -0.0967 0.0856 0.3317 +v -0.0933 0.0786 0.2719 +v -0.1470 0.0952 0.3102 +v -0.1632 0.1067 0.3777 +v -0.0997 0.1013 0.3960 +v -0.1691 0.1220 0.4467 +v -0.0873 0.1166 0.4637 +v -0.1703 0.1419 0.5193 +v -0.0829 0.1337 0.5353 +v -0.1782 0.1617 0.5952 +v -0.0351 0.0647 0.2890 +v -0.0405 0.0559 0.2334 +v -0.0258 0.0770 0.3484 +v -0.0135 0.0949 0.4133 +v 0.0059 0.1121 0.4805 +v 0.0275 0.0493 0.2444 +v 0.0122 0.0414 0.1941 +v 0.0444 0.0682 0.3025 +v 0.0613 0.0855 0.3665 +v 0.0867 0.1100 0.4346 +v 0.0845 0.0471 0.2085 +v 0.0670 0.0403 0.1600 +v 0.1111 0.0569 0.2622 +v 0.1384 0.0743 0.3232 +v 0.1632 0.1003 0.3819 +v -0.1288 0.0944 0.2410 +v -0.1733 0.1221 0.2766 +v -0.1967 0.1252 0.3464 +v -0.2726 0.1949 0.6422 +v -0.2624 0.2146 0.7164 +v -0.1704 0.1813 0.6692 +v 0.2022 0.1300 0.4519 +v 0.0492 0.0333 0.1192 +v -0.2270 0.1306 0.4180 +v -0.0785 0.1628 0.6110 +v 0.0059 0.0338 0.1473 +v -0.2418 0.1449 0.4906 +v 0.0186 0.1398 0.5530 +v -0.0388 0.0472 0.1799 +v -0.2619 0.1678 0.5654 +v 0.1137 0.1395 0.5049 +v -0.0821 0.0665 0.2118 +v -0.0193 0.2457 0.7544 +v -0.0567 0.1969 0.6822 +v -0.1444 0.2213 0.7457 +v -0.1109 0.2560 0.8222 +v 0.0239 0.2993 0.8322 +v -0.0638 0.3130 0.8921 +v 0.0886 0.3587 0.9097 +v -0.0084 0.3741 0.9624 +v 0.1480 0.4217 0.9946 +v 0.0525 0.4431 1.0443 +v 0.0686 0.2249 0.7032 +v 0.0342 0.1817 0.6280 +v 0.1169 0.2753 0.7814 +v 0.1749 0.3403 0.8633 +v 0.2441 0.4067 0.9432 +v 0.1604 0.2127 0.6474 +v 0.1297 0.1699 0.5702 +v 0.2059 0.2669 0.7266 +v 0.2586 0.3283 0.8103 +v 0.3315 0.3937 0.8965 +v 0.2523 0.2029 0.5946 +v 0.2284 0.1630 0.5232 +v 0.2932 0.2512 0.6760 +v 0.3467 0.3110 0.7617 +v 0.4113 0.3780 0.8517 +v -0.2332 0.2425 0.7913 +v -0.0490 0.4517 1.1039 +v -0.0011 0.5393 1.1773 +v 0.1109 0.5183 1.1274 +v 0.4829 0.4641 0.9375 +v -0.2017 0.2827 0.8705 +v 0.2112 0.5042 1.0824 +v -0.1524 0.3271 0.9487 +v 0.3061 0.4891 1.0325 +v -0.1035 0.3785 1.0263 +v 0.3940 0.4718 0.9908 +v 0.3276 0.7218 1.2734 +v 0.2622 0.6026 1.1711 +v 0.1631 0.6245 1.2186 +v 0.2257 0.7540 1.3080 +v 0.3828 0.8682 1.3594 +v 0.2829 0.8894 1.3932 +v 0.4247 1.0182 1.4346 +v 0.3312 1.0343 1.4560 +v 0.4720 1.1718 1.4645 +v 0.3832 1.1764 1.4865 +v 0.4245 0.7171 1.2314 +v 0.3632 0.5899 1.1355 +v 0.4764 0.8561 1.3202 +v 0.5163 1.0108 1.4031 +v 0.5547 1.1646 1.4401 +v 0.5183 0.7085 1.1844 +v 0.4569 0.5842 1.0831 +v 0.5667 0.8525 1.2795 +v 0.6041 1.0064 1.3577 +v 0.6345 1.1563 1.4085 +v 0.6082 0.7082 1.1342 +v 0.5418 0.5754 1.0248 +v 0.6478 0.8479 1.2350 +v 0.6903 0.9933 1.3046 +v 0.7129 1.1536 1.3654 +v 0.0597 0.6490 1.2634 +v 0.2967 1.1956 1.5103 +v 0.3631 1.3230 1.5258 +v 0.4477 1.3156 1.5086 +v 0.7552 1.3019 1.4167 +v 0.1223 0.7688 1.3409 +v 0.5284 1.3096 1.4842 +v 0.1806 0.9138 1.4145 +v 0.6076 1.3002 1.4687 +v 0.2340 1.0484 1.4755 +v 0.6841 1.2965 1.4459 +v 0.6053 1.5462 1.4986 +v 0.5704 1.4299 1.5044 +v 0.4966 1.4343 1.5125 +v 0.5450 1.5507 1.5080 +v 0.6410 1.6541 1.4746 +v 0.5873 1.6555 1.4909 +v 0.6733 1.7522 1.4385 +v 0.6320 1.7475 1.4589 +v 0.6974 1.8439 1.4023 +v 0.6728 1.8316 1.4192 +v 0.6634 1.5428 1.4803 +v 0.6376 1.4232 1.4790 +v 0.6934 1.6578 1.4538 +v 0.7169 1.7613 1.4171 +v 0.7254 1.8507 1.3835 +v 0.7223 1.5491 1.4533 +v 0.7038 1.4251 1.4531 +v 0.7442 1.6633 1.4280 +v 0.7590 1.7675 1.3959 +v 0.7541 1.8589 1.3698 +v 0.7726 1.5547 1.4210 +v 0.7679 1.4321 1.4233 +v 0.7912 1.6682 1.4018 +v 0.7951 1.7716 1.3802 +v 0.7793 1.8646 1.3602 +v 0.4176 1.4388 1.5268 +v 0.6525 1.8204 1.4331 +v 0.6941 1.9046 1.3878 +v 0.7107 1.9113 1.3751 +v 0.7643 1.9427 1.3420 +v 0.4790 1.5510 1.5173 +v 0.7244 1.9220 1.3667 +v 0.5355 1.6525 1.4975 +v 0.7382 1.9300 1.3583 +v 0.5955 1.7440 1.4746 +v 0.7515 1.9369 1.3500 +v 0.1649 0.0229 0.0994 +v 0.2139 0.0334 0.0657 +v 0.2543 0.0413 0.1063 +v 0.1997 0.0350 0.1368 +v 0.2981 0.0593 0.1524 +v 0.2355 0.0480 0.1862 +v 0.3488 0.0754 0.1983 +v 0.2782 0.0606 0.2416 +v 0.3923 0.0940 0.2418 +v 0.3230 0.0885 0.3012 +v 0.2630 0.0502 0.0382 +v 0.3133 0.0606 0.0735 +v 0.3598 0.0790 0.1078 +v 0.4100 0.1008 0.1411 +v 0.4628 0.1135 0.1890 +v 0.3074 0.0771 0.0087 +v 0.3638 0.0921 0.0303 +v 0.4171 0.1118 0.0539 +v 0.4701 0.1274 0.0909 +v 0.5244 0.1483 0.1378 +v 0.3494 0.1107 -0.0293 +v 0.4125 0.1250 -0.0171 +v 0.4694 0.1375 0.0073 +v 0.5254 0.1592 0.0422 +v 0.5894 0.1785 0.0820 +v 0.0949 0.0094 0.0977 +v 0.1361 0.0143 0.0666 +v 0.1192 0.0207 0.1310 +v 0.3680 0.1103 0.3568 +v 0.2850 0.1042 0.4141 +v 0.2486 0.0796 0.3435 +v 0.7212 0.2400 0.0713 +v 0.6518 0.2047 0.1262 +v 0.6540 0.2168 0.0218 +v 0.2817 0.1023 -0.0379 +v 0.3158 0.1422 -0.0670 +v 0.3863 0.1495 -0.0673 +v 0.1442 0.0304 0.1733 +v 0.4448 0.1151 0.3009 +v 0.5902 0.2017 -0.0105 +v 0.2480 0.0693 -0.0138 +v 0.1748 0.0375 0.2216 +v 0.5108 0.1354 0.2456 +v 0.5252 0.1826 -0.0357 +v 0.2138 0.0471 0.0103 +v 0.2113 0.0567 0.2775 +v 0.5847 0.1627 0.1872 +v 0.4556 0.1626 -0.0570 +v 0.1770 0.0279 0.0385 +v 0.4096 0.1466 0.4230 +v 0.4921 0.1557 0.3662 +v 0.5425 0.1980 0.4337 +v 0.4471 0.1912 0.4901 +v 0.5779 0.2526 0.4986 +v 0.4802 0.2393 0.5715 +v 0.6079 0.3175 0.5735 +v 0.5225 0.3038 0.6494 +v 0.6634 0.3952 0.6616 +v 0.5858 0.3840 0.7296 +v 0.5700 0.1702 0.3046 +v 0.6237 0.2110 0.3645 +v 0.6757 0.2656 0.4358 +v 0.7052 0.3456 0.5106 +v 0.7448 0.4229 0.5986 +v 0.6426 0.2033 0.2405 +v 0.7004 0.2440 0.3040 +v 0.7578 0.3001 0.3699 +v 0.8038 0.3721 0.4446 +v 0.8422 0.4512 0.5292 +v 0.7178 0.2455 0.1832 +v 0.7794 0.2852 0.2374 +v 0.8337 0.3362 0.3033 +v 0.8867 0.3992 0.3796 +v 0.9334 0.4727 0.4643 +v 0.3256 0.1410 0.4791 +v 0.6512 0.4664 0.8190 +v 0.5716 0.4527 0.8819 +v 0.4996 0.3720 0.8002 +v 1.0619 0.5816 0.4742 +v 0.9768 0.5424 0.5455 +v 1.0101 0.5084 0.3918 +v 0.7910 0.2853 0.1173 +v 0.3532 0.1878 0.5502 +v 0.7323 0.4772 0.7584 +v 0.9644 0.4464 0.3131 +v 0.3868 0.2359 0.6312 +v 0.8128 0.5004 0.6883 +v 0.9060 0.3813 0.2389 +v 0.4395 0.2980 0.7159 +v 0.8860 0.5216 0.6158 +v 0.8482 0.3234 0.1719 +v 0.7250 0.5757 0.9206 +v 0.7993 0.5787 0.8510 +v 0.8473 0.7119 0.9437 +v 0.7754 0.7005 1.0105 +v 0.8752 0.8511 1.0516 +v 0.8078 0.8448 1.1170 +v 0.9140 1.0108 1.1381 +v 0.8475 1.0061 1.2087 +v 0.9325 1.1739 1.2110 +v 0.8667 1.1625 1.2783 +v 0.8774 0.5962 0.7749 +v 0.9234 0.7180 0.8862 +v 0.9388 0.8668 0.9812 +v 0.9769 1.0263 1.0676 +v 1.0007 1.1816 1.1412 +v 0.9562 0.6181 0.7099 +v 0.9966 0.7300 0.8179 +v 1.0115 0.8769 0.9095 +v 1.0386 1.0436 0.9942 +v 1.0599 1.1953 1.0746 +v 1.0322 0.6361 0.6446 +v 1.0741 0.7500 0.7469 +v 1.0878 0.8907 0.8388 +v 1.0993 1.0506 0.9209 +v 1.1137 1.2162 1.0033 +v 0.6379 0.5739 0.9768 +v 0.8914 1.3098 1.3213 +v 0.8314 1.3007 1.3857 +v 0.7975 1.1541 1.3319 +v 1.1411 1.3646 1.0050 +v 1.0943 1.3529 1.0781 +v 1.1572 1.2243 0.9251 +v 1.1079 0.6636 0.5711 +v 0.6997 0.6968 1.0808 +v 0.9491 1.3208 1.2601 +v 1.1566 1.0750 0.8517 +v 0.7362 0.8341 1.1846 +v 1.0003 1.3320 1.2049 +v 1.1578 0.9135 0.7600 +v 0.7773 0.9925 1.2715 +v 1.0475 1.3325 1.1471 +v 1.1499 0.7776 0.6662 +v 0.8932 1.4428 1.3449 +v 0.9431 1.4490 1.2952 +v 0.9291 1.5710 1.3074 +v 0.8845 1.5654 1.3517 +v 0.9217 1.6858 1.3214 +v 0.8827 1.6802 1.3587 +v 0.8895 1.7872 1.3181 +v 0.8618 1.7833 1.3524 +v 0.8492 1.8735 1.3231 +v 0.8281 1.8729 1.3458 +v 0.9878 1.4569 1.2428 +v 0.9700 1.5776 1.2644 +v 0.9569 1.6893 1.2799 +v 0.9172 1.7884 1.2842 +v 0.8710 1.8714 1.2994 +v 1.0289 1.4616 1.1861 +v 1.0093 1.5849 1.2120 +v 0.9924 1.6928 1.2340 +v 0.9456 1.7892 1.2486 +v 0.8924 1.8703 1.2763 +v 1.0695 1.4694 1.1239 +v 1.0445 1.5813 1.1582 +v 1.0243 1.6933 1.1910 +v 0.9758 1.7863 1.2182 +v 0.9143 1.8625 1.2525 +v 0.8386 1.4337 1.3971 +v 0.7998 1.9542 1.3401 +v 0.7863 1.9537 1.3500 +v 0.8084 1.8710 1.3637 +v 0.8663 1.9141 1.2866 +v 0.8540 1.9260 1.2990 +v 0.9334 1.8533 1.2320 +v 1.1065 1.4854 1.0574 +v 0.8354 1.5565 1.3976 +v 0.8133 1.9513 1.3305 +v 0.9999 1.7784 1.1892 +v 0.8435 1.6715 1.3939 +v 0.8270 1.9446 1.3206 +v 1.0521 1.6820 1.1476 +v 0.8347 1.7769 1.3784 +v 0.8408 1.9362 1.3106 +v 1.0751 1.5882 1.1031 +v -0.1578 0.0761 0.3077 +v -0.0990 0.0581 0.2724 +v -0.1020 0.0651 0.3350 +v -0.1713 0.0873 0.3769 +v -0.1042 0.0815 0.3998 +v -0.1754 0.1019 0.4474 +v -0.0908 0.0970 0.4683 +v -0.1742 0.1225 0.5211 +v -0.0840 0.1146 0.5407 +v -0.1787 0.1423 0.5988 +v -0.0432 0.0360 0.2353 +v -0.0363 0.0448 0.2927 +v -0.0285 0.0569 0.3531 +v -0.0135 0.0749 0.4170 +v 0.0071 0.0928 0.4864 +v 0.0121 0.0212 0.1958 +v 0.0288 0.0294 0.2482 +v 0.0461 0.0481 0.3069 +v 0.0607 0.0664 0.3723 +v 0.0880 0.0902 0.4404 +v 0.0685 0.0200 0.1643 +v 0.0877 0.0265 0.2102 +v 0.1133 0.0372 0.2634 +v 0.1412 0.0544 0.3245 +v 0.1654 0.0810 0.3879 +v -0.1861 0.1072 0.2717 +v -0.1383 0.0748 0.2400 +v -0.2083 0.1071 0.3439 +v -0.1688 0.1623 0.6770 +v -0.2627 0.1953 0.7264 +v -0.2758 0.1762 0.6479 +v 0.2052 0.1107 0.4570 +v 0.0508 0.0129 0.1228 +v -0.2361 0.1104 0.4179 +v -0.0769 0.1422 0.6160 +v 0.0059 0.0136 0.1486 +v -0.2474 0.1246 0.4935 +v 0.0199 0.1214 0.5577 +v -0.0421 0.0273 0.1819 +v -0.2661 0.1488 0.5703 +v 0.1153 0.1196 0.5128 +v -0.0905 0.0478 0.2116 +v -0.1448 0.2024 0.7535 +v -0.0543 0.1797 0.6921 +v -0.0145 0.2284 0.7632 +v -0.1078 0.2382 0.8316 +v 0.0270 0.2813 0.8433 +v -0.0633 0.2948 0.9039 +v 0.0917 0.3423 0.9212 +v -0.0065 0.3565 0.9750 +v 0.1535 0.4048 1.0058 +v 0.0573 0.4271 1.0562 +v 0.0389 0.1642 0.6360 +v 0.0731 0.2063 0.7118 +v 0.1223 0.2590 0.7920 +v 0.1798 0.3238 0.8746 +v 0.2473 0.3911 0.9550 +v 0.1346 0.1514 0.5782 +v 0.1655 0.1945 0.6547 +v 0.2128 0.2491 0.7353 +v 0.2676 0.3108 0.8213 +v 0.3401 0.3747 0.9114 +v 0.2324 0.1446 0.5317 +v 0.2581 0.1849 0.6034 +v 0.2993 0.2334 0.6833 +v 0.3529 0.2945 0.7707 +v 0.4184 0.3599 0.8617 +v -0.2320 0.2231 0.8017 +v 0.1137 0.5023 1.1409 +v 0.0050 0.5268 1.1914 +v -0.0454 0.4358 1.1135 +v 0.4904 0.4491 0.9506 +v -0.2019 0.2648 0.8817 +v 0.2166 0.4910 1.0957 +v -0.1523 0.3097 0.9599 +v 0.3153 0.4748 1.0453 +v -0.1006 0.3611 1.0388 +v 0.4021 0.4555 1.0045 +v 0.1671 0.6136 1.2338 +v 0.2674 0.5884 1.1846 +v 0.3332 0.7105 1.2903 +v 0.2289 0.7418 1.3239 +v 0.3903 0.8557 1.3759 +v 0.2879 0.8792 1.4111 +v 0.4305 1.0102 1.4539 +v 0.3352 1.0250 1.4751 +v 0.4758 1.1643 1.4831 +v 0.3885 1.1706 1.5065 +v 0.3692 0.5754 1.1491 +v 0.4306 0.7021 1.2463 +v 0.4839 0.8425 1.3353 +v 0.5248 1.0010 1.4200 +v 0.5610 1.1565 1.4593 +v 0.4677 0.5706 1.0963 +v 0.5266 0.6960 1.1972 +v 0.5758 0.8393 1.2946 +v 0.6126 0.9959 1.3738 +v 0.6438 1.1459 1.4266 +v 0.5515 0.5641 1.0350 +v 0.6176 0.6963 1.1458 +v 0.6607 0.8331 1.2486 +v 0.6976 0.9851 1.3215 +v 0.7213 1.1473 1.3807 +v 0.0644 0.6353 1.2764 +v 0.4503 1.3113 1.5286 +v 0.3623 1.3210 1.5457 +v 0.2996 1.1911 1.5297 +v 0.7652 1.2959 1.4349 +v 0.1270 0.7552 1.3582 +v 0.5329 1.3030 1.5036 +v 0.1843 0.9020 1.4323 +v 0.6128 1.2927 1.4883 +v 0.2391 1.0414 1.4941 +v 0.6900 1.2897 1.4654 +v 0.4991 1.4320 1.5328 +v 0.5736 1.4236 1.5247 +v 0.6138 1.5410 1.5191 +v 0.5503 1.5473 1.5284 +v 0.6450 1.6550 1.4936 +v 0.5918 1.6537 1.5110 +v 0.6787 1.7551 1.4563 +v 0.6369 1.7509 1.4771 +v 0.7051 1.8484 1.4208 +v 0.6807 1.8361 1.4371 +v 0.6449 1.4192 1.4976 +v 0.6720 1.5416 1.4988 +v 0.6994 1.6596 1.4720 +v 0.7218 1.7639 1.4349 +v 0.7325 1.8571 1.4019 +v 0.7103 1.4213 1.4720 +v 0.7289 1.5463 1.4710 +v 0.7512 1.6630 1.4457 +v 0.7646 1.7704 1.4147 +v 0.7609 1.8664 1.3891 +v 0.7771 1.4266 1.4404 +v 0.7856 1.5509 1.4377 +v 0.8004 1.6677 1.4187 +v 0.8040 1.7737 1.3987 +v 0.7876 1.8688 1.3789 +v 0.4186 1.4383 1.5471 +v 0.7220 1.9132 1.3926 +v 0.7089 1.8988 1.3998 +v 0.6607 1.8223 1.4515 +v 0.7731 1.9514 1.3592 +v 0.4832 1.5511 1.5377 +v 0.7361 1.9268 1.3849 +v 0.5398 1.6525 1.5179 +v 0.7487 1.9369 1.3765 +v 0.5989 1.7448 1.4936 +v 0.7607 1.9453 1.3677 +# 650 vertices + +vn 0.1331 0.9911 0.0012 +vn 0.1850 0.9788 -0.0879 +vn 0.0574 0.9980 0.0257 +vn 0.0312 0.9988 0.0372 +vn 0.1459 0.9883 0.0457 +vn 0.0802 0.9967 0.0099 +vn 0.1833 0.9826 0.0287 +vn 0.0546 0.9943 0.0916 +vn 0.1256 0.9890 0.0785 +vn 0.0305 0.9908 0.1318 +vn 0.2975 0.9529 -0.0583 +vn 0.3274 0.9201 -0.2150 +vn 0.2850 0.9580 0.0316 +vn 0.2818 0.9594 0.0077 +vn 0.2712 0.9624 -0.0153 +vn 0.3916 0.9114 -0.1269 +vn 0.4177 0.8693 -0.2643 +vn 0.3501 0.9352 -0.0539 +vn 0.3265 0.9448 -0.0273 +vn 0.3326 0.9416 -0.0526 +vn 0.4309 0.8564 -0.2844 +vn 0.4622 0.7720 -0.4363 +vn 0.4034 0.9031 -0.1471 +vn 0.3794 0.9221 -0.0760 +vn 0.3429 0.9386 -0.0366 +vn 0.0906 0.9959 -0.0012 +vn -0.0560 0.9965 0.0622 +vn -0.0280 0.9987 0.0437 +vn -0.0199 0.9902 0.1380 +vn -0.0593 0.9787 0.1966 +vn 0.0186 0.9811 0.1925 +vn 0.3567 0.9319 0.0656 +vn 0.3492 0.9324 0.0929 +vn 0.3892 0.9150 -0.1063 +vn 0.4687 0.7158 -0.5176 +vn 0.4665 0.5326 -0.7062 +vn 0.5045 0.6267 -0.5939 +vn 0.0143 0.9999 -0.0065 +vn 0.0998 0.9806 0.1684 +vn 0.4275 0.8887 -0.1656 +vn 0.4165 0.8330 -0.3643 +vn 0.0210 0.9997 0.0132 +vn 0.2239 0.9675 0.1173 +vn 0.4750 0.8506 -0.2257 +vn 0.3635 0.8752 -0.3193 +vn -0.0107 0.9932 0.1156 +vn 0.3266 0.9437 0.0516 +vn 0.4598 0.8400 -0.2880 +vn 0.2420 0.9569 -0.1608 +vn 0.0532 0.9326 0.3570 +vn 0.0799 0.9587 0.2729 +vn 0.0219 0.9579 0.2864 +vn -0.0086 0.9344 0.3562 +vn 0.0594 0.8821 0.4674 +vn 0.0258 0.9184 0.3949 +vn 0.1238 0.8677 0.4815 +vn 0.0680 0.8902 0.4504 +vn 0.1576 0.8847 0.4388 +vn 0.1069 0.8900 0.4433 +vn 0.2046 0.9325 0.2976 +vn 0.2095 0.9526 0.2207 +vn 0.1556 0.8756 0.4573 +vn 0.1260 0.8381 0.5308 +vn 0.1754 0.8715 0.4580 +vn 0.3045 0.9119 0.2752 +vn 0.3217 0.9261 0.1971 +vn 0.2714 0.8793 0.3914 +vn 0.1757 0.8463 0.5029 +vn 0.1484 0.8598 0.4886 +vn 0.3556 0.9033 0.2402 +vn 0.3648 0.9161 0.1661 +vn 0.3479 0.8777 0.3295 +vn 0.2904 0.8560 0.4277 +vn 0.2365 0.8530 0.4653 +vn -0.0640 0.9496 0.3069 +vn 0.0762 0.9031 0.4226 +vn 0.0778 0.8617 0.5014 +vn 0.0942 0.8731 0.4784 +vn 0.2185 0.8545 0.4713 +vn 0.3168 0.8370 0.4463 +vn 0.3270 0.8362 0.4404 +vn 0.3458 0.9203 0.1831 +vn -0.0595 0.9380 0.3414 +vn 0.1427 0.8766 0.4596 +vn 0.3724 0.8427 0.3888 +vn -0.0393 0.9330 0.3576 +vn 0.2084 0.8696 0.4476 +vn 0.3803 0.8648 0.3279 +vn 0.0078 0.9131 0.4076 +vn 0.1814 0.8679 0.4625 +vn 0.3577 0.8969 0.2602 +vn 0.1182 0.7047 0.6996 +vn 0.1363 0.8062 0.5758 +vn 0.0501 0.7968 0.6022 +vn 0.1189 0.7354 0.6671 +vn 0.1997 0.6565 0.7274 +vn 0.1713 0.6765 0.7162 +vn 0.2307 0.5891 0.7744 +vn 0.1877 0.5840 0.7897 +vn 0.2021 0.4891 0.8485 +vn 0.1532 0.4983 0.8533 +vn 0.1274 0.6976 0.7051 +vn 0.1919 0.8139 0.5484 +vn 0.2055 0.6238 0.7541 +vn 0.2696 0.5824 0.7669 +vn 0.2457 0.4855 0.8390 +vn 0.1782 0.7042 0.6872 +vn 0.1911 0.8197 0.5400 +vn 0.1726 0.5880 0.7902 +vn 0.2756 0.5565 0.7838 +vn 0.3218 0.4657 0.8244 +vn 0.2496 0.6862 0.6833 +vn 0.2157 0.8038 0.5545 +vn 0.2344 0.5585 0.7957 +vn 0.2961 0.5033 0.8118 +vn 0.3921 0.4215 0.8177 +vn 0.0261 0.8005 0.5988 +vn 0.0474 0.5223 0.8515 +vn 0.1121 0.4209 0.9001 +vn 0.2124 0.4035 0.8900 +vn 0.3829 0.2759 0.8816 +vn 0.4233 0.2703 0.8647 +vn 0.4264 0.4077 0.8074 +vn 0.2700 0.7908 0.5493 +vn 0.0880 0.7623 0.6412 +vn 0.2458 0.3888 0.8879 +vn 0.3132 0.4645 0.8284 +vn 0.1076 0.6920 0.7139 +vn 0.2677 0.3541 0.8961 +vn 0.3062 0.5417 0.7828 +vn 0.0657 0.5824 0.8102 +vn 0.3300 0.3223 0.8872 +vn 0.2744 0.6751 0.6848 +vn 0.2116 0.1912 0.9585 +vn 0.2294 0.2318 0.9453 +vn 0.1819 0.2259 0.9570 +vn 0.1914 0.1993 0.9610 +vn 0.2228 0.0791 0.9717 +vn 0.1470 0.0896 0.9851 +vn 0.2739 -0.0956 0.9570 +vn 0.2175 -0.0644 0.9739 +vn 0.2723 -0.0942 0.9576 +vn 0.2329 -0.1030 0.9670 +vn 0.2659 0.1805 0.9470 +vn 0.3035 0.2288 0.9250 +vn 0.2764 0.0534 0.9596 +vn 0.2740 -0.1108 0.9553 +vn 0.2456 -0.0672 0.9670 +vn 0.3482 0.1789 0.9202 +vn 0.3595 0.2078 0.9097 +vn 0.3221 0.0494 0.9454 +vn 0.2621 -0.0916 0.9607 +vn 0.2095 -0.0350 0.9772 +vn 0.4183 0.1649 0.8932 +vn 0.4094 0.1726 0.8959 +vn 0.4003 0.0487 0.9151 +vn 0.3029 -0.1141 0.9462 +vn 0.3080 -0.1743 0.9353 +vn 0.1028 0.2250 0.9689 +vn 0.0594 -0.1038 0.9928 +vn -0.0450 -0.1185 0.9919 +vn 0.0606 -0.0995 0.9932 +vn 0.3588 -0.1250 0.9250 +vn 0.6118 -0.7444 -0.2675 +vn 0.3725 -0.2058 0.9049 +vn 0.4314 0.1487 0.8898 +vn 0.1003 0.1827 0.9780 +vn 0.1197 -0.0552 0.9913 +vn 0.3570 -0.0909 0.9297 +vn 0.0397 0.0933 0.9948 +vn 0.1221 -0.0000 0.9925 +vn 0.4523 0.1066 0.8855 +vn 0.0545 -0.0361 0.9979 +vn 0.1412 0.0394 0.9892 +vn 0.4566 0.1446 0.8778 +vn -0.3048 0.9417 -0.1427 +vn -0.3530 0.8936 -0.2773 +vn -0.3804 0.8286 -0.4107 +vn -0.3433 0.9082 -0.2392 +vn -0.2906 0.9556 -0.0488 +vn -0.3039 0.9495 -0.0779 +vn -0.2755 0.9609 -0.0275 +vn -0.2980 0.9537 -0.0402 +vn -0.2709 0.9617 0.0411 +vn -0.3002 0.9538 -0.0110 +vn -0.2726 0.9584 -0.0846 +vn -0.3174 0.9352 -0.1572 +vn -0.2352 0.9719 -0.0043 +vn -0.2154 0.9758 0.0364 +vn -0.1748 0.9800 0.0952 +vn -0.1837 0.9830 -0.0035 +vn -0.1768 0.9819 -0.0678 +vn -0.1873 0.9804 0.0616 +vn -0.1643 0.9812 0.1009 +vn -0.1287 0.9798 0.1531 +vn -0.0426 0.9987 -0.0285 +vn -0.0469 0.9987 -0.0178 +vn -0.0954 0.9944 0.0466 +vn -0.1180 0.9850 0.1259 +vn -0.1319 0.9758 0.1744 +vn -0.4062 0.8040 -0.4343 +vn -0.4465 0.6694 -0.5937 +vn -0.4075 0.7806 -0.4740 +vn -0.3625 0.9313 -0.0347 +vn -0.3392 0.9377 0.0751 +vn -0.3001 0.9483 0.1034 +vn -0.1391 0.9697 0.2008 +vn -0.0724 0.9974 0.0036 +vn -0.3268 0.9184 -0.2230 +vn -0.2370 0.9571 0.1664 +vn -0.1403 0.9890 -0.0462 +vn -0.3074 0.9491 -0.0680 +vn -0.1857 0.9582 0.2178 +vn -0.3013 0.9419 -0.1482 +vn -0.3315 0.9430 -0.0297 +vn -0.1270 0.9684 0.2148 +vn -0.4047 0.8795 -0.2504 +vn -0.1983 0.9253 0.3233 +vn -0.2159 0.9369 0.2749 +vn -0.2505 0.9440 0.2149 +vn -0.2145 0.9299 0.2989 +vn -0.1992 0.9100 0.3636 +vn -0.1832 0.9043 0.3855 +vn -0.2183 0.9022 0.3719 +vn -0.1599 0.9038 0.3970 +vn -0.2307 0.8808 0.4134 +vn -0.1905 0.8799 0.4354 +vn -0.1966 0.9304 0.3093 +vn -0.1891 0.9409 0.2811 +vn -0.2059 0.9134 0.3511 +vn -0.2133 0.8995 0.3814 +vn -0.2179 0.8853 0.4109 +vn -0.1674 0.9368 0.3074 +vn -0.1506 0.9507 0.2709 +vn -0.1771 0.9206 0.3480 +vn -0.1910 0.9116 0.3640 +vn -0.2022 0.8948 0.3981 +vn -0.1129 0.9467 0.3018 +vn -0.1324 0.9524 0.2745 +vn -0.1268 0.9329 0.3371 +vn -0.1152 0.9234 0.3661 +vn -0.0850 0.9064 0.4137 +vn -0.2900 0.9436 0.1596 +vn -0.1706 0.8585 0.4836 +vn -0.2825 0.7803 0.5580 +vn -0.2463 0.8238 0.5105 +vn -0.0404 0.8514 0.5229 +vn -0.2746 0.9212 0.2755 +vn -0.2396 0.8392 0.4882 +vn -0.1463 0.9357 0.3212 +vn -0.2281 0.8443 0.4849 +vn -0.0909 0.9189 0.3838 +vn -0.1881 0.8440 0.5023 +vn -0.2947 0.7269 0.6203 +vn -0.2736 0.7885 0.5508 +vn -0.3009 0.7598 0.5764 +vn -0.3632 0.6839 0.6328 +vn -0.3106 0.6446 0.6985 +vn -0.3998 0.6042 0.6893 +vn -0.3495 0.4982 0.7935 +vn -0.4176 0.4693 0.7781 +vn -0.3540 0.3894 0.8504 +vn -0.3690 0.4000 0.8390 +vn -0.2020 0.7459 0.6347 +vn -0.2131 0.8040 0.5552 +vn -0.2146 0.6682 0.7124 +vn -0.2258 0.5505 0.8037 +vn -0.2925 0.4383 0.8499 +vn -0.1390 0.7586 0.6366 +vn -0.1234 0.8120 0.5704 +vn -0.1604 0.6714 0.7235 +vn -0.1363 0.5755 0.8064 +vn -0.1830 0.5030 0.8447 +vn -0.0181 0.7719 0.6355 +vn -0.0251 0.8066 0.5906 +vn -0.0518 0.6844 0.7273 +vn -0.0647 0.5796 0.8123 +vn -0.0546 0.5372 0.8417 +vn -0.3141 0.7372 0.5983 +vn -0.3823 0.4052 0.8305 +vn -0.4037 0.3041 0.8629 +vn -0.3687 0.3359 0.8667 +vn -0.0760 0.4042 0.9115 +vn -0.3563 0.6760 0.6450 +vn -0.3595 0.3591 0.8613 +vn -0.4516 0.5611 0.6937 +vn -0.3500 0.3387 0.8734 +vn -0.4192 0.4932 0.7623 +vn -0.2445 0.3741 0.8946 +vn -0.3523 0.0882 0.9317 +vn -0.3570 0.2594 0.8974 +vn -0.4376 0.1876 0.8794 +vn -0.4203 0.0898 0.9029 +vn -0.2552 -0.0049 0.9669 +vn -0.3628 -0.0215 0.9316 +vn -0.1596 -0.0542 0.9857 +vn -0.1806 -0.0060 0.9835 +vn -0.0606 -0.0358 0.9975 +vn -0.0824 -0.0391 0.9958 +vn -0.2202 0.1415 0.9651 +vn -0.2468 0.2890 0.9250 +vn -0.1788 -0.0009 0.9839 +vn -0.1630 -0.0922 0.9823 +vn -0.1255 -0.0756 0.9892 +vn -0.1078 0.1590 0.9814 +vn -0.1887 0.2460 0.9507 +vn -0.1200 0.0169 0.9926 +vn -0.1730 -0.0833 0.9814 +vn -0.2234 -0.1107 0.9684 +vn -0.0019 0.1692 0.9856 +vn -0.0630 0.2200 0.9735 +vn -0.0535 0.0595 0.9968 +vn -0.1125 -0.0520 0.9923 +vn -0.1648 -0.1107 0.9801 +vn -0.4154 0.2025 0.8868 +vn -0.0287 0.0927 0.9953 +vn 0.0119 0.0131 0.9998 +vn -0.2220 -0.1847 0.9574 +vn -0.1182 -0.1026 0.9877 +vn -0.4406 0.0929 0.8929 +vn -0.1738 -0.1198 0.9775 +vn -0.4308 -0.0164 0.9023 +vn -0.1227 -0.0519 0.9911 +vn -0.1877 0.1276 0.9739 +vn -0.1250 -0.0644 0.9901 +vn -0.0564 -0.9981 -0.0228 +vn -0.1931 -0.9759 0.1018 +vn -0.1337 -0.9910 -0.0106 +vn -0.0287 -0.9986 -0.0446 +vn -0.1477 -0.9881 -0.0439 +vn -0.0836 -0.9965 -0.0072 +vn -0.1770 -0.9838 -0.0277 +vn -0.0476 -0.9946 -0.0927 +vn -0.1220 -0.9885 -0.0888 +vn -0.0272 -0.9906 -0.1341 +vn -0.3302 -0.9207 0.2080 +vn -0.2994 -0.9528 0.0506 +vn -0.2746 -0.9607 -0.0403 +vn -0.2805 -0.9599 0.0031 +vn -0.2676 -0.9635 0.0060 +vn -0.4205 -0.8617 0.2838 +vn -0.3867 -0.9120 0.1370 +vn -0.3432 -0.9381 0.0461 +vn -0.3279 -0.9442 0.0292 +vn -0.3349 -0.9413 0.0432 +vn -0.4556 -0.7675 0.4509 +vn -0.4379 -0.8480 0.2984 +vn -0.4103 -0.9008 0.1420 +vn -0.3795 -0.9224 0.0724 +vn -0.3387 -0.9406 0.0238 +vn 0.0593 -0.9953 -0.0766 +vn -0.1056 -0.9941 0.0237 +vn 0.0306 -0.9983 -0.0490 +vn -0.0198 -0.9809 -0.1934 +vn 0.0637 -0.9768 -0.2047 +vn 0.0233 -0.9910 -0.1315 +vn -0.3402 -0.9332 -0.1159 +vn -0.3573 -0.9308 -0.0764 +vn -0.3786 -0.9219 0.0823 +vn -0.4921 -0.6220 0.6091 +vn -0.4592 -0.5273 0.7149 +vn -0.4739 -0.7088 0.5226 +vn -0.0162 -0.9998 0.0097 +vn -0.1039 -0.9806 -0.1660 +vn -0.4262 -0.8868 0.1785 +vn -0.4369 -0.8116 0.3879 +vn -0.0160 -0.9997 -0.0203 +vn -0.2261 -0.9659 -0.1261 +vn -0.4918 -0.8338 0.2509 +vn -0.3587 -0.8822 0.3049 +vn 0.0201 -0.9928 -0.1177 +vn -0.3282 -0.9421 -0.0693 +vn -0.4821 -0.8147 0.3222 +vn -0.2452 -0.9537 0.1743 +vn -0.0152 -0.9548 -0.2968 +vn -0.0759 -0.9579 -0.2768 +vn -0.0444 -0.9300 -0.3650 +vn 0.0058 -0.9335 -0.3585 +vn -0.0521 -0.8774 -0.4770 +vn -0.0295 -0.9162 -0.3997 +vn -0.1317 -0.8694 -0.4762 +vn -0.0795 -0.8935 -0.4420 +vn -0.1652 -0.8902 -0.4246 +vn -0.1011 -0.8923 -0.4400 +vn -0.2193 -0.9514 -0.2163 +vn -0.1989 -0.9324 -0.3018 +vn -0.1449 -0.8708 -0.4699 +vn -0.1146 -0.8348 -0.5385 +vn -0.1830 -0.8769 -0.4444 +vn -0.3218 -0.9260 -0.1973 +vn -0.3062 -0.9133 -0.2685 +vn -0.2743 -0.8768 -0.3950 +vn -0.1670 -0.8453 -0.5074 +vn -0.1383 -0.8639 -0.4843 +vn -0.3610 -0.9179 -0.1646 +vn -0.3547 -0.9037 -0.2399 +vn -0.3508 -0.8748 -0.3341 +vn -0.2934 -0.8587 -0.4202 +vn -0.2239 -0.8570 -0.4641 +vn 0.0614 -0.9478 -0.3128 +vn -0.0927 -0.8755 -0.4743 +vn -0.0770 -0.8619 -0.5012 +vn -0.0825 -0.9044 -0.4187 +vn -0.2909 -0.8399 -0.4583 +vn -0.2088 -0.8564 -0.4722 +vn -0.3248 -0.8436 -0.4276 +vn -0.3488 -0.9204 -0.1766 +vn 0.0528 -0.9373 -0.3444 +vn -0.1418 -0.8751 -0.4626 +vn -0.3730 -0.8470 -0.3788 +vn 0.0325 -0.9328 -0.3588 +vn -0.2130 -0.8714 -0.4419 +vn -0.3809 -0.8627 -0.3325 +vn -0.0127 -0.9141 -0.4052 +vn -0.1822 -0.8726 -0.4531 +vn -0.3599 -0.8964 -0.2589 +vn -0.0504 -0.7974 -0.6013 +vn -0.1374 -0.8052 -0.5769 +vn -0.1170 -0.7080 -0.6964 +vn -0.1224 -0.7394 -0.6620 +vn -0.2076 -0.6560 -0.7257 +vn -0.1595 -0.6718 -0.7234 +vn -0.2225 -0.5802 -0.7835 +vn -0.1797 -0.5832 -0.7922 +vn -0.2068 -0.4889 -0.8475 +vn -0.1484 -0.4966 -0.8552 +vn -0.1889 -0.8155 -0.5471 +vn -0.1259 -0.6984 -0.7045 +vn -0.2158 -0.6194 -0.7548 +vn -0.2790 -0.5769 -0.7677 +vn -0.2367 -0.4864 -0.8410 +vn -0.1830 -0.8228 -0.5381 +vn -0.1806 -0.7031 -0.6878 +vn -0.1832 -0.5830 -0.7915 +vn -0.2804 -0.5562 -0.7823 +vn -0.3190 -0.4669 -0.8247 +vn -0.2178 -0.8082 -0.5471 +vn -0.2401 -0.6844 -0.6885 +vn -0.2330 -0.5537 -0.7994 +vn -0.2977 -0.5049 -0.8102 +vn -0.3920 -0.4190 -0.8190 +vn -0.0110 -0.7997 -0.6003 +vn -0.2129 -0.4076 -0.8880 +vn -0.1254 -0.4272 -0.8954 +vn -0.0400 -0.5199 -0.8533 +vn -0.4074 -0.2731 -0.8715 +vn -0.3936 -0.2716 -0.8783 +vn -0.4234 -0.4098 -0.8079 +vn -0.2685 -0.7931 -0.5467 +vn -0.0747 -0.7675 -0.6367 +vn -0.2352 -0.3902 -0.8902 +vn -0.3197 -0.4691 -0.8232 +vn -0.1111 -0.6905 -0.7148 +vn -0.2585 -0.3587 -0.8970 +vn -0.2844 -0.5370 -0.7942 +vn -0.0714 -0.5799 -0.8115 +vn -0.3279 -0.3266 -0.8865 +vn -0.2805 -0.6721 -0.6853 +vn -0.1823 -0.2340 -0.9550 +vn -0.2267 -0.2457 -0.9425 +vn -0.2019 -0.1877 -0.9612 +vn -0.1688 -0.1920 -0.9668 +vn -0.2159 -0.0713 -0.9738 +vn -0.1518 -0.0938 -0.9840 +vn -0.2644 0.0862 -0.9606 +vn -0.2006 0.0610 -0.9778 +vn -0.2353 0.0995 -0.9668 +vn -0.1703 0.1053 -0.9798 +vn -0.2991 -0.2359 -0.9246 +vn -0.2701 -0.1774 -0.9463 +vn -0.2801 -0.0500 -0.9587 +vn -0.2819 0.0984 -0.9544 +vn -0.2425 0.0813 -0.9667 +vn -0.3569 -0.2084 -0.9106 +vn -0.3512 -0.1751 -0.9198 +vn -0.3128 -0.0495 -0.9485 +vn -0.2546 0.0881 -0.9630 +vn -0.2723 0.0916 -0.9578 +vn -0.4141 -0.1756 -0.8931 +vn -0.4124 -0.1687 -0.8952 +vn -0.3823 -0.0486 -0.9227 +vn -0.2916 0.1167 -0.9494 +vn -0.3133 0.1415 -0.9391 +vn -0.0944 -0.2198 -0.9710 +vn -0.0649 0.0969 -0.9932 +vn -0.0171 0.1085 -0.9940 +vn -0.0696 0.1009 -0.9925 +vn -0.5598 0.4543 -0.6930 +vn -0.2939 0.0991 -0.9507 +vn -0.3390 0.1914 -0.9211 +vn -0.4343 -0.1596 -0.8865 +vn -0.1108 -0.1896 -0.9756 +vn -0.1102 0.0755 -0.9910 +vn -0.3487 0.0888 -0.9330 +vn -0.0402 -0.0903 -0.9951 +vn -0.1385 0.0399 -0.9896 +vn -0.4195 -0.1199 -0.8998 +vn -0.0579 0.0407 -0.9975 +vn -0.1478 0.0057 -0.9890 +vn -0.4469 -0.1550 -0.8810 +vn 0.3862 -0.8189 0.4245 +vn 0.3413 -0.9006 0.2691 +vn 0.3064 -0.9413 0.1416 +vn 0.3428 -0.9084 0.2392 +vn 0.2950 -0.9543 0.0478 +vn 0.3013 -0.9506 0.0753 +vn 0.2781 -0.9603 0.0238 +vn 0.2986 -0.9538 0.0321 +vn 0.2704 -0.9619 -0.0409 +vn 0.3007 -0.9536 0.0153 +vn 0.3114 -0.9377 0.1545 +vn 0.2629 -0.9612 0.0837 +vn 0.2344 -0.9721 0.0016 +vn 0.2142 -0.9760 -0.0394 +vn 0.1807 -0.9785 -0.0997 +vn 0.1789 -0.9815 0.0678 +vn 0.1823 -0.9832 0.0024 +vn 0.1819 -0.9812 -0.0638 +vn 0.1610 -0.9818 -0.1011 +vn 0.1262 -0.9813 -0.1456 +vn 0.0498 -0.9985 0.0223 +vn 0.0485 -0.9985 0.0236 +vn 0.0952 -0.9941 -0.0521 +vn 0.1133 -0.9864 -0.1192 +vn 0.1320 -0.9770 -0.1672 +vn 0.4482 -0.6478 0.6160 +vn 0.3983 -0.8047 0.4403 +vn 0.4057 -0.7797 0.4769 +vn 0.2951 -0.9499 -0.1030 +vn 0.3278 -0.9421 -0.0707 +vn 0.3558 -0.9338 0.0378 +vn 0.1368 -0.9698 -0.2021 +vn 0.0739 -0.9973 -0.0055 +vn 0.3178 -0.9216 0.2228 +vn 0.2334 -0.9586 -0.1631 +vn 0.1471 -0.9879 0.0486 +vn 0.3036 -0.9513 0.0531 +vn 0.1900 -0.9575 -0.2171 +vn 0.3009 -0.9423 0.1467 +vn 0.3286 -0.9442 0.0203 +vn 0.1315 -0.9678 -0.2145 +vn 0.3960 -0.8826 0.2533 +vn 0.2439 -0.9451 -0.2176 +vn 0.2158 -0.9355 -0.2797 +vn 0.1995 -0.9261 -0.3203 +vn 0.2073 -0.9325 -0.2956 +vn 0.1944 -0.9122 -0.3606 +vn 0.1856 -0.9053 -0.3822 +vn 0.2132 -0.9026 -0.3741 +vn 0.1560 -0.9046 -0.3968 +vn 0.2273 -0.8805 -0.4160 +vn 0.1962 -0.8757 -0.4412 +vn 0.1859 -0.9434 -0.2745 +vn 0.1974 -0.9309 -0.3074 +vn 0.2063 -0.9140 -0.3493 +vn 0.2234 -0.8975 -0.3802 +vn 0.2369 -0.8791 -0.4135 +vn 0.1591 -0.9488 -0.2730 +vn 0.1668 -0.9371 -0.3065 +vn 0.1734 -0.9230 -0.3436 +vn 0.1862 -0.9181 -0.3500 +vn 0.2063 -0.8936 -0.3987 +vn 0.1257 -0.9541 -0.2718 +vn 0.1135 -0.9449 -0.3072 +vn 0.1200 -0.9337 -0.3372 +vn 0.1090 -0.9257 -0.3623 +vn 0.0578 -0.9135 -0.4027 +vn 0.2783 -0.9460 -0.1663 +vn 0.2469 -0.8233 -0.5111 +vn 0.2904 -0.7787 -0.5561 +vn 0.1832 -0.8527 -0.4892 +vn 0.0348 -0.8439 -0.5354 +vn 0.2706 -0.9215 -0.2786 +vn 0.2388 -0.8384 -0.4899 +vn 0.1539 -0.9351 -0.3193 +vn 0.2394 -0.8405 -0.4861 +vn 0.0946 -0.9182 -0.3846 +vn 0.1915 -0.8362 -0.5140 +vn 0.3060 -0.7571 -0.5772 +vn 0.2789 -0.7884 -0.5484 +vn 0.3026 -0.7259 -0.6176 +vn 0.3577 -0.6910 -0.6281 +vn 0.3098 -0.6462 -0.6975 +vn 0.3982 -0.6060 -0.6886 +vn 0.3488 -0.4960 -0.7952 +vn 0.4206 -0.4684 -0.7770 +vn 0.3548 -0.3887 -0.8503 +vn 0.3704 -0.3976 -0.8395 +vn 0.2153 -0.8048 -0.5531 +vn 0.1969 -0.7502 -0.6313 +vn 0.2139 -0.6680 -0.7128 +vn 0.2219 -0.5542 -0.8023 +vn 0.3013 -0.4349 -0.8486 +vn 0.1106 -0.8102 -0.5757 +vn 0.1286 -0.7632 -0.6332 +vn 0.1638 -0.6707 -0.7234 +vn 0.1273 -0.5775 -0.8064 +vn 0.1667 -0.5092 -0.8444 +vn 0.0171 -0.8047 -0.5934 +vn 0.0250 -0.7760 -0.6303 +vn 0.0436 -0.6875 -0.7249 +vn 0.0659 -0.5712 -0.8182 +vn 0.0417 -0.5432 -0.8386 +vn 0.3082 -0.7426 -0.5947 +vn 0.3771 -0.3291 -0.8657 +vn 0.4137 -0.2952 -0.8612 +vn 0.3952 -0.3948 -0.8294 +vn 0.0714 -0.4062 -0.9110 +vn 0.3390 -0.6899 -0.6396 +vn 0.3621 -0.3585 -0.8605 +vn 0.4501 -0.5605 -0.6951 +vn 0.3530 -0.3350 -0.8736 +vn 0.4304 -0.4830 -0.7625 +vn 0.2461 -0.3677 -0.8968 +vn 0.4418 -0.1884 -0.8771 +vn 0.3542 -0.2666 -0.8964 +vn 0.3413 -0.0962 -0.9350 +vn 0.4219 -0.0889 -0.9023 +vn 0.2509 0.0134 -0.9679 +vn 0.3498 0.0140 -0.9367 +vn 0.1536 0.0417 -0.9872 +vn 0.1806 0.0070 -0.9835 +vn 0.0607 0.0147 -0.9980 +vn 0.0884 0.0322 -0.9956 +vn 0.2428 -0.2865 -0.9268 +vn 0.1985 -0.1473 -0.9690 +vn 0.1776 0.0083 -0.9841 +vn 0.1738 0.0858 -0.9810 +vn 0.1334 0.0573 -0.9894 +vn 0.1889 -0.2418 -0.9517 +vn 0.1140 -0.1553 -0.9813 +vn 0.1198 -0.0234 -0.9925 +vn 0.1903 0.0761 -0.9788 +vn 0.2228 0.1029 -0.9694 +vn 0.0672 -0.2193 -0.9733 +vn 0.0103 -0.1684 -0.9857 +vn 0.0827 -0.0507 -0.9953 +vn 0.1011 0.0447 -0.9939 +vn 0.1042 0.1024 -0.9893 +vn 0.4194 -0.2048 -0.8844 +vn 0.4861 0.4160 -0.7686 +vn 0.6444 0.6402 -0.4182 +vn -0.0314 -0.1902 -0.9812 +vn 0.0574 0.0984 -0.9935 +vn 0.4398 -0.0952 -0.8930 +vn 0.1864 0.1131 -0.9759 +vn 0.4219 0.0142 -0.9065 +vn 0.0636 0.0069 -0.9980 +vn 0.1843 -0.1262 -0.9747 +vn 0.0905 0.0530 -0.9945 +vn -0.0156 0.0176 0.9997 +vn 0.0101 -0.1009 0.9948 +vn 0.0073 -0.0954 0.9954 +vn -0.0237 0.0497 0.9985 +vn -0.8955 0.1952 0.3999 +vn -0.8482 0.3339 0.4112 +vn -0.8475 0.3111 0.4300 +vn -0.8961 0.1890 0.4016 +vn -0.4259 0.7319 0.5318 +vn -0.3966 0.7389 0.5447 +vn -0.3973 0.7364 0.5477 +vn -0.4248 0.7208 0.5478 +vn 0.2872 0.3670 0.8848 +vn 0.2333 0.4344 0.8700 +vn 0.2395 0.4478 0.8615 +vn 0.2831 0.3558 0.8906 +vn -0.7586 0.4146 0.5027 +vn -0.7581 0.3956 0.5185 +vn 0.0824 0.3221 0.9431 +vn 0.0915 0.3619 0.9277 +vn -0.6673 0.4780 0.5712 +vn -0.6702 0.4545 0.5867 +vn 0.0350 0.2038 0.9784 +vn 0.0344 0.2343 0.9716 +vn -0.5291 0.6315 0.5668 +vn -0.5383 0.6065 0.5851 +vn -0.0003 0.1226 0.9925 +vn -0.0050 0.1492 0.9888 +vn -0.9776 0.2033 0.0539 +vn -0.9717 0.2137 0.1001 +vn -0.9742 0.2036 0.0970 +vn -0.9785 0.1976 0.0585 +vn -0.8841 0.3000 0.3582 +vn -0.8804 0.3108 0.3582 +vn -0.9234 0.3388 0.1802 +vn -0.9280 0.3249 0.1824 +vn -0.9058 0.3373 0.2566 +vn -0.9078 0.3320 0.2562 +vn -0.8832 0.3726 0.2847 +vn -0.8833 0.3732 0.2838 +vn -0.8110 0.4999 0.3040 +vn -0.8778 0.4228 0.2251 +vn -0.8761 0.4228 0.2317 +vn -0.8081 0.5026 0.3073 +vn -0.9792 0.2008 0.0279 +vn -0.9781 0.2063 0.0285 +vn -0.8991 0.3871 0.2045 +vn -0.8962 0.3916 0.2084 +vn -0.9309 0.3563 0.0799 +vn -0.9293 0.3596 0.0842 +vn -0.9455 0.3169 0.0751 +vn -0.9431 0.3231 0.0786 +vn 0.0442 0.9708 0.2359 +vn -0.0903 0.9683 0.2329 +vn -0.0807 0.9675 0.2398 +vn 0.0516 0.9688 0.2426 +vn -0.4568 0.7869 0.4148 +vn -0.5644 0.7333 0.3790 +vn -0.5598 0.7326 0.3871 +vn -0.4931 0.7737 0.3979 +vn -0.4835 0.8104 0.3309 +vn -0.5510 0.7813 0.2933 +vn -0.8199 0.4872 0.3006 +vn -0.8210 0.4865 0.2988 +vn -0.2714 0.9405 0.2046 +vn -0.2454 0.9427 0.2259 +vn -0.7074 0.6303 0.3199 +vn -0.7082 0.6253 0.3279 +vn -0.4222 0.8883 0.1806 +vn -0.4165 0.8897 0.1872 +vn -0.7962 0.5306 0.2906 +vn -0.7956 0.5290 0.2953 +vn -0.4739 0.8495 0.2321 +vn -0.5101 0.8347 0.2076 +vn -0.8269 0.4880 0.2796 +vn -0.8266 0.4882 0.2800 +vn 0.4105 0.7711 0.4867 +vn 0.4576 0.6649 0.5903 +vn 0.4421 0.6868 0.5769 +vn 0.3896 0.7907 0.4723 +vn -0.1551 0.4308 0.8890 +vn -0.3026 0.6034 0.7378 +vn -0.2585 0.5748 0.7764 +vn -0.1218 0.4138 0.9022 +vn 0.7901 0.2842 0.5432 +vn 0.9212 0.2334 0.3114 +vn 0.9114 0.2407 0.3338 +vn 0.7834 0.2966 0.5461 +vn -0.0401 -0.0022 0.9992 +vn -0.0259 -0.0289 0.9992 +vn 0.5426 0.5272 0.6539 +vn 0.5245 0.5525 0.6478 +vn -0.0203 0.1277 0.9916 +vn -0.0020 0.1066 0.9943 +vn 0.6310 0.3742 0.6795 +vn 0.6165 0.3933 0.6821 +vn 0.0008 0.2088 0.9780 +vn 0.0238 0.1835 0.9827 +vn 0.6564 0.3042 0.6904 +vn 0.6517 0.3138 0.6905 +vn -0.1449 0.3699 0.9177 +vn -0.1260 0.3500 0.9282 +vn 0.9518 0.2064 0.2271 +vn 0.9524 0.2059 0.2250 +vn 0.9860 0.1595 0.0484 +vn 0.9837 0.1630 0.0758 +vn 0.9841 0.1608 0.0755 +vn 0.9854 0.1607 0.0569 +vn 0.9353 0.3019 0.1845 +vn 0.9370 0.2949 0.1874 +vn 0.9420 0.3182 0.1071 +vn 0.9399 0.3234 0.1099 +vn 0.9684 0.2381 0.0740 +vn 0.9659 0.2463 0.0795 +vn 0.9754 0.2053 0.0808 +vn 0.9764 0.2023 0.0756 +vn 0.8459 0.4689 0.2541 +vn 0.7316 0.5453 0.4090 +vn 0.7356 0.5441 0.4036 +vn 0.8524 0.4643 0.2405 +vn 0.9547 0.2606 0.1440 +vn 0.9564 0.2564 0.1402 +vn 0.9364 0.2890 0.1990 +vn 0.9372 0.2883 0.1964 +vn 0.9272 0.3343 0.1688 +vn 0.9296 0.3295 0.1652 +vn 0.7462 0.5642 0.3533 +vn 0.7421 0.5651 0.3606 +vn 0.7250 0.6873 0.0444 +vn 0.5411 0.7292 -0.4189 +vn 0.4417 0.7484 -0.4947 +vn 0.7366 0.6703 0.0905 +vn 0.6017 0.7983 -0.0259 +vn 0.4919 0.8517 -0.1805 +vn 0.2069 0.9436 0.2583 +vn 0.2089 0.9433 0.2579 +vn 0.7733 0.5897 0.2331 +vn 0.7714 0.5899 0.2388 +vn 0.5116 0.8554 0.0805 +vn 0.4763 0.8791 0.0181 +vn 0.7533 0.6200 0.2193 +vn 0.7518 0.6232 0.2155 +vn 0.4324 0.8835 0.1801 +vn 0.3824 0.9160 0.1210 +vn 0.6974 0.6793 0.2286 +vn 0.6911 0.6846 0.2319 +vn 0.3577 0.8993 0.2518 +vn 0.3260 0.9203 0.2163 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_07 +s 1 +f 4551/2276/5587 4552/2277/5588 4553/2278/5589 4554/2279/5590 +f 4555/2280/5591 4551/2276/5587 4554/2279/5590 4556/2281/5592 +f 4557/2282/5593 4555/2280/5591 4556/2281/5592 4558/2283/5594 +f 4559/2284/5595 4557/2282/5593 4558/2283/5594 4560/2285/5596 +f 4561/2286/5597 4562/2287/5598 4552/2277/5588 4551/2276/5587 +f 4563/2288/5599 4561/2286/5597 4551/2276/5587 4555/2280/5591 +f 4564/2289/5600 4563/2288/5599 4555/2280/5591 4557/2282/5593 +f 4565/2290/5601 4564/2289/5600 4557/2282/5593 4559/2284/5595 +f 4566/2291/5602 4567/2292/5603 4562/2287/5598 4561/2286/5597 +f 4568/2293/5604 4566/2291/5602 4561/2286/5597 4563/2288/5599 +f 4569/2294/5605 4568/2293/5604 4563/2288/5599 4564/2289/5600 +f 4570/2295/5606 4569/2294/5605 4564/2289/5600 4565/2290/5601 +f 4571/2296/5607 4572/2297/5608 4567/2292/5603 4566/2291/5602 +f 4573/2298/5609 4571/2296/5607 4566/2291/5602 4568/2293/5604 +f 4574/2299/5610 4573/2298/5609 4568/2293/5604 4569/2294/5605 +f 4575/2300/5611 4574/2299/5610 4569/2294/5605 4570/2295/5606 +f 4553/2278/5589 4576/2301/5612 4577/2302/5613 4578/2303/5614 +f 4579/2304/5615 4580/2305/5616 4581/2306/5617 4560/2285/5596 +f 4575/2300/5611 4582/2307/5618 4583/2308/5619 4584/2309/5620 +f 4585/2310/5621 4586/2311/5622 4587/2312/5623 4572/2297/5608 +f 4554/2279/5590 4553/2278/5589 4578/2303/5614 4588/2313/5624 +f 4560/2285/5596 4581/2306/5617 4589/2314/5625 4559/2284/5595 +f 4574/2299/5610 4575/2300/5611 4584/2309/5620 4590/2315/5626 +f 4572/2297/5608 4587/2312/5623 4591/2316/5627 4567/2292/5603 +f 4556/2281/5592 4554/2279/5590 4588/2313/5624 4592/2317/5628 +f 4559/2284/5595 4589/2314/5625 4593/2318/5629 4565/2290/5601 +f 4573/2298/5609 4574/2299/5610 4590/2315/5626 4594/2319/5630 +f 4567/2292/5603 4591/2316/5627 4595/2320/5631 4562/2287/5598 +f 4558/2283/5594 4556/2281/5592 4592/2317/5628 4596/2321/5632 +f 4565/2290/5601 4593/2318/5629 4597/2322/5633 4570/2295/5606 +f 4571/2296/5607 4573/2298/5609 4594/2319/5630 4598/2323/5634 +f 4562/2287/5598 4595/2320/5631 4599/2324/5635 4552/2277/5588 +f 4560/2285/5596 4558/2283/5594 4596/2321/5632 4579/2304/5615 +f 4570/2295/5606 4597/2322/5633 4582/2307/5618 4575/2300/5611 +f 4572/2297/5608 4571/2296/5607 4598/2323/5634 4585/2310/5621 +f 4552/2277/5588 4599/2324/5635 4576/2301/5612 4553/2278/5589 +f 4600/2325/5636 4601/2326/5637 4602/2327/5638 4603/2328/5639 +f 4604/2329/5640 4600/2325/5636 4603/2328/5639 4605/2330/5641 +f 4606/2331/5642 4604/2329/5640 4605/2330/5641 4607/2332/5643 +f 4608/2333/5644 4606/2331/5642 4607/2332/5643 4609/2334/5645 +f 4610/2335/5646 4611/2336/5647 4601/2326/5637 4600/2325/5636 +f 4612/2337/5648 4610/2335/5646 4600/2325/5636 4604/2329/5640 +f 4613/2338/5649 4612/2337/5648 4604/2329/5640 4606/2331/5642 +f 4614/2339/5650 4613/2338/5649 4606/2331/5642 4608/2333/5644 +f 4615/2340/5651 4616/2341/5652 4611/2336/5647 4610/2335/5646 +f 4617/2342/5653 4615/2340/5651 4610/2335/5646 4612/2337/5648 +f 4618/2343/5654 4617/2342/5653 4612/2337/5648 4613/2338/5649 +f 4619/2344/5655 4618/2343/5654 4613/2338/5649 4614/2339/5650 +f 4620/2345/5656 4621/2346/5657 4616/2341/5652 4615/2340/5651 +f 4622/2347/5658 4620/2345/5656 4615/2340/5651 4617/2342/5653 +f 4623/2348/5659 4622/2347/5658 4617/2342/5653 4618/2343/5654 +f 4624/2349/5660 4623/2348/5659 4618/2343/5654 4619/2344/5655 +f 4602/2327/5638 4581/2306/5617 4580/2305/5616 4625/2350/5661 +f 4626/2351/5662 4627/2352/5663 4628/2353/5664 4609/2334/5645 +f 4624/2349/5660 4629/2354/5665 4630/2355/5666 4631/2356/5667 +f 4632/2357/5668 4583/2308/5619 4582/2307/5618 4621/2346/5657 +f 4603/2328/5639 4602/2327/5638 4625/2350/5661 4633/2358/5669 +f 4609/2334/5645 4628/2353/5664 4634/2359/5670 4608/2333/5644 +f 4623/2348/5659 4624/2349/5660 4631/2356/5667 4635/2360/5671 +f 4621/2346/5657 4582/2307/5618 4597/2322/5633 4616/2341/5652 +f 4605/2330/5641 4603/2328/5639 4633/2358/5669 4636/2361/5672 +f 4608/2333/5644 4634/2359/5670 4637/2362/5673 4614/2339/5650 +f 4622/2347/5658 4623/2348/5659 4635/2360/5671 4638/2363/5674 +f 4616/2341/5652 4597/2322/5633 4593/2318/5629 4611/2336/5647 +f 4607/2332/5643 4605/2330/5641 4636/2361/5672 4639/2364/5675 +f 4614/2339/5650 4637/2362/5673 4640/2365/5676 4619/2344/5655 +f 4620/2345/5656 4622/2347/5658 4638/2363/5674 4641/2366/5677 +f 4611/2336/5647 4593/2318/5629 4589/2314/5625 4601/2326/5637 +f 4609/2334/5645 4607/2332/5643 4639/2364/5675 4626/2351/5662 +f 4619/2344/5655 4640/2365/5676 4629/2354/5665 4624/2349/5660 +f 4621/2346/5657 4620/2345/5656 4641/2366/5677 4632/2357/5668 +f 4601/2326/5637 4589/2314/5625 4581/2306/5617 4602/2327/5638 +f 4642/2367/5678 4643/2368/5679 4644/2369/5680 4645/2370/5681 +f 4646/2371/5682 4642/2367/5678 4645/2370/5681 4647/2372/5683 +f 4648/2373/5684 4646/2371/5682 4647/2372/5683 4649/2374/5685 +f 4650/2375/5686 4648/2373/5684 4649/2374/5685 4651/2376/5687 +f 4652/2377/5688 4653/2378/5689 4643/2368/5679 4642/2367/5678 +f 4654/2379/5690 4652/2377/5688 4642/2367/5678 4646/2371/5682 +f 4655/2380/5691 4654/2379/5690 4646/2371/5682 4648/2373/5684 +f 4656/2381/5692 4655/2380/5691 4648/2373/5684 4650/2375/5686 +f 4657/2382/5693 4658/2383/5694 4653/2378/5689 4652/2377/5688 +f 4659/2384/5695 4657/2382/5693 4652/2377/5688 4654/2379/5690 +f 4660/2385/5696 4659/2384/5695 4654/2379/5690 4655/2380/5691 +f 4661/2386/5697 4660/2385/5696 4655/2380/5691 4656/2381/5692 +f 4662/2387/5698 4663/2388/5699 4658/2383/5694 4657/2382/5693 +f 4664/2389/5700 4662/2387/5698 4657/2382/5693 4659/2384/5695 +f 4665/2390/5701 4664/2389/5700 4659/2384/5695 4660/2385/5696 +f 4666/2391/5702 4665/2390/5701 4660/2385/5696 4661/2386/5697 +f 4644/2369/5680 4628/2353/5664 4627/2352/5663 4667/2392/5703 +f 4668/2393/5704 4669/2394/5705 4670/2395/5706 4651/2376/5687 +f 4666/2391/5702 4671/2396/5707 4672/2397/5708 4673/2398/5709 +f 4674/2399/5710 4630/2355/5666 4629/2354/5665 4663/2388/5699 +f 4645/2370/5681 4644/2369/5680 4667/2392/5703 4675/2400/5711 +f 4651/2376/5687 4670/2395/5706 4676/2401/5712 4650/2375/5686 +f 4665/2390/5701 4666/2391/5702 4673/2398/5709 4677/2402/5713 +f 4663/2388/5699 4629/2354/5665 4640/2365/5676 4658/2383/5694 +f 4647/2372/5683 4645/2370/5681 4675/2400/5711 4678/2403/5714 +f 4650/2375/5686 4676/2401/5712 4679/2404/5715 4656/2381/5692 +f 4664/2389/5700 4665/2390/5701 4677/2402/5713 4680/2405/5716 +f 4658/2383/5694 4640/2365/5676 4637/2362/5673 4653/2378/5689 +f 4649/2374/5685 4647/2372/5683 4678/2403/5714 4681/2406/5717 +f 4656/2381/5692 4679/2404/5715 4682/2407/5718 4661/2386/5697 +f 4662/2387/5698 4664/2389/5700 4680/2405/5716 4683/2408/5719 +f 4653/2378/5689 4637/2362/5673 4634/2359/5670 4643/2368/5679 +f 4651/2376/5687 4649/2374/5685 4681/2406/5717 4668/2393/5704 +f 4661/2386/5697 4682/2407/5718 4671/2396/5707 4666/2391/5702 +f 4663/2388/5699 4662/2387/5698 4683/2408/5719 4674/2399/5710 +f 4643/2368/5679 4634/2359/5670 4628/2353/5664 4644/2369/5680 +f 4684/2409/5720 4685/2410/5721 4686/2411/5722 4687/2412/5723 +f 4688/2413/5724 4684/2409/5720 4687/2412/5723 4689/2414/5725 +f 4690/2415/5726 4688/2413/5724 4689/2414/5725 4691/2416/5727 +f 4692/2417/5728 4690/2415/5726 4691/2416/5727 4693/2418/5729 +f 4694/2419/5730 4695/2420/5731 4685/2410/5721 4684/2409/5720 +f 4696/2421/5732 4694/2419/5730 4684/2409/5720 4688/2413/5724 +f 4697/2422/5733 4696/2421/5732 4688/2413/5724 4690/2415/5726 +f 4698/2423/5734 4697/2422/5733 4690/2415/5726 4692/2417/5728 +f 4699/2424/5735 4700/2425/5736 4695/2420/5731 4694/2419/5730 +f 4701/2426/5737 4699/2424/5735 4694/2419/5730 4696/2421/5732 +f 4702/2427/5738 4701/2426/5737 4696/2421/5732 4697/2422/5733 +f 4703/2428/5739 4702/2427/5738 4697/2422/5733 4698/2423/5734 +f 4704/2429/5740 4705/2430/5741 4700/2425/5736 4699/2424/5735 +f 4706/2431/5742 4704/2429/5740 4699/2424/5735 4701/2426/5737 +f 4707/2432/5743 4706/2431/5742 4701/2426/5737 4702/2427/5738 +f 4708/2433/5744 4707/2432/5743 4702/2427/5738 4703/2428/5739 +f 4686/2411/5722 4670/2395/5706 4669/2394/5705 4709/2434/5745 +f 4710/2435/5746 4711/2436/5747 4712/2437/5748 4693/2418/5729 +f 4708/2433/5744 4713/2438/5749 4714/2439/5750 4715/2440/5751 +f 4716/2441/5752 4672/2397/5708 4671/2396/5707 4705/2430/5741 +f 4687/2412/5723 4686/2411/5722 4709/2434/5745 4717/2442/5753 +f 4693/2418/5729 4712/2437/5748 4718/2443/5754 4692/2417/5728 +f 4707/2432/5743 4708/2433/5744 4715/2440/5751 4719/2444/5755 +f 4705/2430/5741 4671/2396/5707 4682/2407/5718 4700/2425/5736 +f 4689/2414/5725 4687/2412/5723 4717/2442/5753 4720/2445/5756 +f 4692/2417/5728 4718/2443/5754 4721/2446/5757 4698/2423/5734 +f 4706/2431/5742 4707/2432/5743 4719/2444/5755 4722/2447/5758 +f 4700/2425/5736 4682/2407/5718 4679/2404/5715 4695/2420/5731 +f 4691/2416/5727 4689/2414/5725 4720/2445/5756 4723/2448/5759 +f 4698/2423/5734 4721/2446/5757 4724/2449/5760 4703/2428/5739 +f 4704/2429/5740 4706/2431/5742 4722/2447/5758 4725/2450/5761 +f 4695/2420/5731 4679/2404/5715 4676/2401/5712 4685/2410/5721 +f 4693/2418/5729 4691/2416/5727 4723/2448/5759 4710/2435/5746 +f 4703/2428/5739 4724/2449/5760 4713/2438/5749 4708/2433/5744 +f 4705/2430/5741 4704/2429/5740 4725/2450/5761 4716/2441/5752 +f 4685/2410/5721 4676/2401/5712 4670/2395/5706 4686/2411/5722 +f 4726/2451/5762 4727/2452/5763 4728/2453/5764 4729/2454/5765 +f 4730/2455/5766 4726/2451/5762 4729/2454/5765 4731/2456/5767 +f 4732/2457/5768 4730/2455/5766 4731/2456/5767 4733/2458/5769 +f 4734/2459/5770 4732/2457/5768 4733/2458/5769 4735/2460/5771 +f 4736/2461/5772 4737/2462/5773 4727/2452/5763 4726/2451/5762 +f 4738/2463/5774 4736/2461/5772 4726/2451/5762 4730/2455/5766 +f 4739/2464/5775 4738/2463/5774 4730/2455/5766 4732/2457/5768 +f 4740/2465/5776 4739/2464/5775 4732/2457/5768 4734/2459/5770 +f 4741/2466/5777 4742/2467/5778 4737/2462/5773 4736/2461/5772 +f 4743/2468/5779 4741/2466/5777 4736/2461/5772 4738/2463/5774 +f 4744/2469/5780 4743/2468/5779 4738/2463/5774 4739/2464/5775 +f 4745/2470/5781 4744/2469/5780 4739/2464/5775 4740/2465/5776 +f 4746/2471/5782 4747/2472/5783 4742/2467/5778 4741/2466/5777 +f 4748/2473/5784 4746/2471/5782 4741/2466/5777 4743/2468/5779 +f 4749/2474/5785 4748/2473/5784 4743/2468/5779 4744/2469/5780 +f 4750/2475/5786 4749/2474/5785 4744/2469/5780 4745/2470/5781 +f 4728/2453/5764 4751/2476/5787 4752/2477/5788 4753/2478/5789 +f 4754/2479/5790 4755/2480/5791 4756/2481/5792 4735/2460/5771 +f 4750/2475/5786 4757/2482/5793 4580/2305/5616 4579/2304/5615 +f 4578/2303/5614 4577/2302/5613 4758/2483/5794 4747/2472/5783 +f 4729/2454/5765 4728/2453/5764 4753/2478/5789 4759/2484/5795 +f 4735/2460/5771 4756/2481/5792 4760/2485/5796 4734/2459/5770 +f 4749/2474/5785 4750/2475/5786 4579/2304/5615 4596/2321/5632 +f 4747/2472/5783 4758/2483/5794 4761/2486/5797 4742/2467/5778 +f 4731/2456/5767 4729/2454/5765 4759/2484/5795 4762/2487/5798 +f 4734/2459/5770 4760/2485/5796 4763/2488/5799 4740/2465/5776 +f 4748/2473/5784 4749/2474/5785 4596/2321/5632 4592/2317/5628 +f 4742/2467/5778 4761/2486/5797 4764/2489/5800 4737/2462/5773 +f 4733/2458/5769 4731/2456/5767 4762/2487/5798 4765/2490/5801 +f 4740/2465/5776 4763/2488/5799 4766/2491/5802 4745/2470/5781 +f 4746/2471/5782 4748/2473/5784 4592/2317/5628 4588/2313/5624 +f 4737/2462/5773 4764/2489/5800 4767/2492/5803 4727/2452/5763 +f 4735/2460/5771 4733/2458/5769 4765/2490/5801 4754/2479/5790 +f 4745/2470/5781 4766/2491/5802 4757/2482/5793 4750/2475/5786 +f 4747/2472/5783 4746/2471/5782 4588/2313/5624 4578/2303/5614 +f 4727/2452/5763 4767/2492/5803 4751/2476/5787 4728/2453/5764 +f 4768/2493/5804 4769/2494/5805 4770/2495/5806 4771/2496/5807 +f 4772/2497/5808 4768/2493/5804 4771/2496/5807 4773/2498/5809 +f 4774/2499/5810 4772/2497/5808 4773/2498/5809 4775/2500/5811 +f 4776/2501/5812 4774/2499/5810 4775/2500/5811 4777/2502/5813 +f 4778/2503/5814 4779/2504/5815 4769/2494/5805 4768/2493/5804 +f 4780/2505/5816 4778/2503/5814 4768/2493/5804 4772/2497/5808 +f 4781/2506/5817 4780/2505/5816 4772/2497/5808 4774/2499/5810 +f 4782/2507/5818 4781/2506/5817 4774/2499/5810 4776/2501/5812 +f 4783/2508/5819 4784/2509/5820 4779/2504/5815 4778/2503/5814 +f 4785/2510/5821 4783/2508/5819 4778/2503/5814 4780/2505/5816 +f 4786/2511/5822 4785/2510/5821 4780/2505/5816 4781/2506/5817 +f 4787/2512/5823 4786/2511/5822 4781/2506/5817 4782/2507/5818 +f 4788/2513/5824 4789/2514/5825 4784/2509/5820 4783/2508/5819 +f 4790/2515/5826 4788/2513/5824 4783/2508/5819 4785/2510/5821 +f 4791/2516/5827 4790/2515/5826 4785/2510/5821 4786/2511/5822 +f 4792/2517/5828 4791/2516/5827 4786/2511/5822 4787/2512/5823 +f 4770/2495/5806 4756/2481/5792 4755/2480/5791 4793/2518/5829 +f 4794/2519/5830 4795/2520/5831 4796/2521/5832 4777/2502/5813 +f 4792/2517/5828 4797/2522/5833 4627/2352/5663 4626/2351/5662 +f 4625/2350/5661 4580/2305/5616 4757/2482/5793 4789/2514/5825 +f 4771/2496/5807 4770/2495/5806 4793/2518/5829 4798/2523/5834 +f 4777/2502/5813 4796/2521/5832 4799/2524/5835 4776/2501/5812 +f 4791/2516/5827 4792/2517/5828 4626/2351/5662 4639/2364/5675 +f 4789/2514/5825 4757/2482/5793 4766/2491/5802 4784/2509/5820 +f 4773/2498/5809 4771/2496/5807 4798/2523/5834 4800/2525/5836 +f 4776/2501/5812 4799/2524/5835 4801/2526/5837 4782/2507/5818 +f 4790/2515/5826 4791/2516/5827 4639/2364/5675 4636/2361/5672 +f 4784/2509/5820 4766/2491/5802 4763/2488/5799 4779/2504/5815 +f 4775/2500/5811 4773/2498/5809 4800/2525/5836 4802/2527/5838 +f 4782/2507/5818 4801/2526/5837 4803/2528/5839 4787/2512/5823 +f 4788/2513/5824 4790/2515/5826 4636/2361/5672 4633/2358/5669 +f 4779/2504/5815 4763/2488/5799 4760/2485/5796 4769/2494/5805 +f 4777/2502/5813 4775/2500/5811 4802/2527/5838 4794/2519/5830 +f 4787/2512/5823 4803/2528/5839 4797/2522/5833 4792/2517/5828 +f 4789/2514/5825 4788/2513/5824 4633/2358/5669 4625/2350/5661 +f 4769/2494/5805 4760/2485/5796 4756/2481/5792 4770/2495/5806 +f 4804/2529/5840 4805/2530/5841 4806/2531/5842 4807/2532/5843 +f 4808/2533/5844 4804/2529/5840 4807/2532/5843 4809/2534/5845 +f 4810/2535/5846 4808/2533/5844 4809/2534/5845 4811/2536/5847 +f 4812/2537/5848 4810/2535/5846 4811/2536/5847 4813/2538/5849 +f 4814/2539/5850 4815/2540/5851 4805/2530/5841 4804/2529/5840 +f 4816/2541/5852 4814/2539/5850 4804/2529/5840 4808/2533/5844 +f 4817/2542/5853 4816/2541/5852 4808/2533/5844 4810/2535/5846 +f 4818/2543/5854 4817/2542/5853 4810/2535/5846 4812/2537/5848 +f 4819/2544/5855 4820/2545/5856 4815/2540/5851 4814/2539/5850 +f 4821/2546/5857 4819/2544/5855 4814/2539/5850 4816/2541/5852 +f 4822/2547/5858 4821/2546/5857 4816/2541/5852 4817/2542/5853 +f 4823/2548/5859 4822/2547/5858 4817/2542/5853 4818/2543/5854 +f 4824/2549/5860 4825/2550/5861 4820/2545/5856 4819/2544/5855 +f 4826/2551/5862 4824/2549/5860 4819/2544/5855 4821/2546/5857 +f 4827/2552/5863 4826/2551/5862 4821/2546/5857 4822/2547/5858 +f 4828/2553/5864 4827/2552/5863 4822/2547/5858 4823/2548/5859 +f 4806/2531/5842 4796/2521/5832 4795/2520/5831 4829/2554/5865 +f 4830/2555/5866 4831/2556/5867 4832/2557/5868 4813/2538/5849 +f 4828/2553/5864 4833/2558/5869 4669/2394/5705 4668/2393/5704 +f 4667/2392/5703 4627/2352/5663 4797/2522/5833 4825/2550/5861 +f 4807/2532/5843 4806/2531/5842 4829/2554/5865 4834/2559/5870 +f 4813/2538/5849 4832/2557/5868 4835/2560/5871 4812/2537/5848 +f 4827/2552/5863 4828/2553/5864 4668/2393/5704 4681/2406/5717 +f 4825/2550/5861 4797/2522/5833 4803/2528/5839 4820/2545/5856 +f 4809/2534/5845 4807/2532/5843 4834/2559/5870 4836/2561/5872 +f 4812/2537/5848 4835/2560/5871 4837/2562/5873 4818/2543/5854 +f 4826/2551/5862 4827/2552/5863 4681/2406/5717 4678/2403/5714 +f 4820/2545/5856 4803/2528/5839 4801/2526/5837 4815/2540/5851 +f 4811/2536/5847 4809/2534/5845 4836/2561/5872 4838/2563/5874 +f 4818/2543/5854 4837/2562/5873 4839/2564/5875 4823/2548/5859 +f 4824/2549/5860 4826/2551/5862 4678/2403/5714 4675/2400/5711 +f 4815/2540/5851 4801/2526/5837 4799/2524/5835 4805/2530/5841 +f 4813/2538/5849 4811/2536/5847 4838/2563/5874 4830/2555/5866 +f 4823/2548/5859 4839/2564/5875 4833/2558/5869 4828/2553/5864 +f 4825/2550/5861 4824/2549/5860 4675/2400/5711 4667/2392/5703 +f 4805/2530/5841 4799/2524/5835 4796/2521/5832 4806/2531/5842 +f 4840/2565/5876 4841/2566/5877 4842/2567/5878 4843/2568/5879 +f 4844/2569/5880 4840/2565/5876 4843/2568/5879 4845/2570/5881 +f 4846/2571/5882 4844/2569/5880 4845/2570/5881 4847/2572/5883 +f 4848/2573/5884 4846/2571/5882 4847/2572/5883 4849/2574/5885 +f 4850/2575/5886 4851/2576/5887 4841/2566/5877 4840/2565/5876 +f 4852/2577/5888 4850/2575/5886 4840/2565/5876 4844/2569/5880 +f 4853/2578/5889 4852/2577/5888 4844/2569/5880 4846/2571/5882 +f 4854/2579/5890 4853/2578/5889 4846/2571/5882 4848/2573/5884 +f 4855/2580/5891 4856/2581/5892 4851/2576/5887 4850/2575/5886 +f 4857/2582/5893 4855/2580/5891 4850/2575/5886 4852/2577/5888 +f 4858/2583/5894 4857/2582/5893 4852/2577/5888 4853/2578/5889 +f 4859/2584/5895 4858/2583/5894 4853/2578/5889 4854/2579/5890 +f 4860/2585/5896 4861/2586/5897 4856/2581/5892 4855/2580/5891 +f 4862/2587/5898 4860/2585/5896 4855/2580/5891 4857/2582/5893 +f 4863/2588/5899 4862/2587/5898 4857/2582/5893 4858/2583/5894 +f 4864/2589/5900 4863/2588/5899 4858/2583/5894 4859/2584/5895 +f 4842/2567/5878 4832/2557/5868 4831/2556/5867 4865/2590/5901 +f 4866/2591/5902 4867/2592/5903 4868/2593/5904 4849/2574/5885 +f 4864/2589/5900 4869/2594/5905 4711/2436/5747 4710/2435/5746 +f 4709/2434/5745 4669/2394/5705 4833/2558/5869 4861/2586/5897 +f 4843/2568/5879 4842/2567/5878 4865/2590/5901 4870/2595/5906 +f 4849/2574/5885 4868/2593/5904 4871/2596/5907 4848/2573/5884 +f 4863/2588/5899 4864/2589/5900 4710/2435/5746 4723/2448/5759 +f 4861/2586/5897 4833/2558/5869 4839/2564/5875 4856/2581/5892 +f 4845/2570/5881 4843/2568/5879 4870/2595/5906 4872/2597/5908 +f 4848/2573/5884 4871/2596/5907 4873/2598/5909 4854/2579/5890 +f 4862/2587/5898 4863/2588/5899 4723/2448/5759 4720/2445/5756 +f 4856/2581/5892 4839/2564/5875 4837/2562/5873 4851/2576/5887 +f 4847/2572/5883 4845/2570/5881 4872/2597/5908 4874/2599/5910 +f 4854/2579/5890 4873/2598/5909 4875/2600/5911 4859/2584/5895 +f 4860/2585/5896 4862/2587/5898 4720/2445/5756 4717/2442/5753 +f 4851/2576/5887 4837/2562/5873 4835/2560/5871 4841/2566/5877 +f 4849/2574/5885 4847/2572/5883 4874/2599/5910 4866/2591/5902 +f 4859/2584/5895 4875/2600/5911 4869/2594/5905 4864/2589/5900 +f 4861/2586/5897 4860/2585/5896 4717/2442/5753 4709/2434/5745 +f 4841/2566/5877 4835/2560/5871 4832/2557/5868 4842/2567/5878 +f 4876/2278/5912 4877/2277/5913 4878/2276/5914 4879/2279/5915 +f 4879/2279/5915 4878/2276/5914 4880/2280/5916 4881/2281/5917 +f 4881/2281/5917 4880/2280/5916 4882/2282/5918 4883/2283/5919 +f 4883/2283/5919 4882/2282/5918 4884/2284/5920 4885/2285/5921 +f 4877/2277/5913 4886/2287/5922 4887/2286/5923 4878/2276/5914 +f 4878/2276/5914 4887/2286/5923 4888/2288/5924 4880/2280/5916 +f 4880/2280/5916 4888/2288/5924 4889/2289/5925 4882/2282/5918 +f 4882/2282/5918 4889/2289/5925 4890/2290/5926 4884/2284/5920 +f 4886/2287/5922 4891/2292/5927 4892/2291/5928 4887/2286/5923 +f 4887/2286/5923 4892/2291/5928 4893/2293/5929 4888/2288/5924 +f 4888/2288/5924 4893/2293/5929 4894/2294/5930 4889/2289/5925 +f 4889/2289/5925 4894/2294/5930 4895/2295/5931 4890/2290/5926 +f 4891/2292/5927 4896/2297/5932 4897/2296/5933 4892/2291/5928 +f 4892/2291/5928 4897/2296/5933 4898/2298/5934 4893/2293/5929 +f 4893/2293/5929 4898/2298/5934 4899/2299/5935 4894/2294/5930 +f 4894/2294/5930 4899/2299/5935 4900/2300/5936 4895/2295/5931 +f 4901/2302/5937 4902/2301/5938 4876/2278/5912 4903/2303/5939 +f 4904/2306/5940 4905/2305/5941 4906/2304/5942 4885/2285/5921 +f 4907/2308/5943 4908/2307/5944 4900/2300/5936 4909/2309/5945 +f 4910/2312/5946 4911/2311/5947 4912/2310/5948 4896/2297/5932 +f 4903/2303/5939 4876/2278/5912 4879/2279/5915 4913/2313/5949 +f 4914/2314/5950 4904/2306/5940 4885/2285/5921 4884/2284/5920 +f 4909/2309/5945 4900/2300/5936 4899/2299/5935 4915/2315/5951 +f 4916/2316/5952 4910/2312/5946 4896/2297/5932 4891/2292/5927 +f 4913/2313/5949 4879/2279/5915 4881/2281/5917 4917/2317/5953 +f 4918/2318/5954 4914/2314/5950 4884/2284/5920 4890/2290/5926 +f 4915/2315/5951 4899/2299/5935 4898/2298/5934 4919/2319/5955 +f 4920/2320/5956 4916/2316/5952 4891/2292/5927 4886/2287/5922 +f 4917/2317/5953 4881/2281/5917 4883/2283/5919 4921/2321/5957 +f 4922/2322/5958 4918/2318/5954 4890/2290/5926 4895/2295/5931 +f 4919/2319/5955 4898/2298/5934 4897/2296/5933 4923/2323/5959 +f 4924/2324/5960 4920/2320/5956 4886/2287/5922 4877/2277/5913 +f 4921/2321/5957 4883/2283/5919 4885/2285/5921 4906/2304/5942 +f 4908/2307/5944 4922/2322/5958 4895/2295/5931 4900/2300/5936 +f 4923/2323/5959 4897/2296/5933 4896/2297/5932 4912/2310/5948 +f 4902/2301/5938 4924/2324/5960 4877/2277/5913 4876/2278/5912 +f 4925/2327/5961 4926/2326/5962 4927/2325/5963 4928/2328/5964 +f 4928/2328/5964 4927/2325/5963 4929/2329/5965 4930/2330/5966 +f 4930/2330/5966 4929/2329/5965 4931/2331/5967 4932/2332/5968 +f 4932/2332/5968 4931/2331/5967 4933/2333/5969 4934/2334/5970 +f 4926/2326/5962 4935/2336/5971 4936/2335/5972 4927/2325/5963 +f 4927/2325/5963 4936/2335/5972 4937/2337/5973 4929/2329/5965 +f 4929/2329/5965 4937/2337/5973 4938/2338/5974 4931/2331/5967 +f 4931/2331/5967 4938/2338/5974 4939/2339/5975 4933/2333/5969 +f 4935/2336/5971 4940/2341/5976 4941/2340/5977 4936/2335/5972 +f 4936/2335/5972 4941/2340/5977 4942/2342/5978 4937/2337/5973 +f 4937/2337/5973 4942/2342/5978 4943/2343/5979 4938/2338/5974 +f 4938/2338/5974 4943/2343/5979 4944/2344/5980 4939/2339/5975 +f 4940/2341/5976 4945/2346/5981 4946/2345/5982 4941/2340/5977 +f 4941/2340/5977 4946/2345/5982 4947/2347/5983 4942/2342/5978 +f 4942/2342/5978 4947/2347/5983 4948/2348/5984 4943/2343/5979 +f 4943/2343/5979 4948/2348/5984 4949/2349/5985 4944/2344/5980 +f 4905/2305/5941 4904/2306/5940 4925/2327/5961 4950/2350/5986 +f 4951/2353/5987 4952/2352/5988 4953/2351/5989 4934/2334/5970 +f 4954/2355/5990 4955/2354/5991 4949/2349/5985 4956/2356/5992 +f 4908/2307/5944 4907/2308/5943 4957/2357/5993 4945/2346/5981 +f 4950/2350/5986 4925/2327/5961 4928/2328/5964 4958/2358/5994 +f 4959/2359/5995 4951/2353/5987 4934/2334/5970 4933/2333/5969 +f 4956/2356/5992 4949/2349/5985 4948/2348/5984 4960/2360/5996 +f 4922/2322/5958 4908/2307/5944 4945/2346/5981 4940/2341/5976 +f 4958/2358/5994 4928/2328/5964 4930/2330/5966 4961/2361/5997 +f 4962/2362/5998 4959/2359/5995 4933/2333/5969 4939/2339/5975 +f 4960/2360/5996 4948/2348/5984 4947/2347/5983 4963/2363/5999 +f 4918/2318/5954 4922/2322/5958 4940/2341/5976 4935/2336/5971 +f 4961/2361/5997 4930/2330/5966 4932/2332/5968 4964/2364/6000 +f 4965/2365/6001 4962/2362/5998 4939/2339/5975 4944/2344/5980 +f 4963/2363/5999 4947/2347/5983 4946/2345/5982 4966/2366/6002 +f 4914/2314/5950 4918/2318/5954 4935/2336/5971 4926/2326/5962 +f 4964/2364/6000 4932/2332/5968 4934/2334/5970 4953/2351/5989 +f 4955/2354/5991 4965/2365/6001 4944/2344/5980 4949/2349/5985 +f 4966/2366/6002 4946/2345/5982 4945/2346/5981 4957/2357/5993 +f 4904/2306/5940 4914/2314/5950 4926/2326/5962 4925/2327/5961 +f 4967/2369/6003 4968/2368/6004 4969/2367/6005 4970/2370/6006 +f 4970/2370/6006 4969/2367/6005 4971/2371/6007 4972/2372/6008 +f 4972/2372/6008 4971/2371/6007 4973/2373/6009 4974/2374/6010 +f 4974/2374/6010 4973/2373/6009 4975/2375/6011 4976/2376/6012 +f 4968/2368/6004 4977/2378/6013 4978/2377/6014 4969/2367/6005 +f 4969/2367/6005 4978/2377/6014 4979/2379/6015 4971/2371/6007 +f 4971/2371/6007 4979/2379/6015 4980/2380/6016 4973/2373/6009 +f 4973/2373/6009 4980/2380/6016 4981/2381/6017 4975/2375/6011 +f 4977/2378/6013 4982/2383/6018 4983/2382/6019 4978/2377/6014 +f 4978/2377/6014 4983/2382/6019 4984/2384/6020 4979/2379/6015 +f 4979/2379/6015 4984/2384/6020 4985/2385/6021 4980/2380/6016 +f 4980/2380/6016 4985/2385/6021 4986/2386/6022 4981/2381/6017 +f 4982/2383/6018 4987/2388/6023 4988/2387/6024 4983/2382/6019 +f 4983/2382/6019 4988/2387/6024 4989/2389/6025 4984/2384/6020 +f 4984/2384/6020 4989/2389/6025 4990/2390/6026 4985/2385/6021 +f 4985/2385/6021 4990/2390/6026 4991/2391/6027 4986/2386/6022 +f 4952/2352/5988 4951/2353/5987 4967/2369/6003 4992/2392/6028 +f 4993/2395/6029 4994/2394/6030 4995/2393/6031 4976/2376/6012 +f 4996/2397/6032 4997/2396/6033 4991/2391/6027 4998/2398/6034 +f 4955/2354/5991 4954/2355/5990 4999/2399/6035 4987/2388/6023 +f 4992/2392/6028 4967/2369/6003 4970/2370/6006 5000/2400/6036 +f 5001/2401/6037 4993/2395/6029 4976/2376/6012 4975/2375/6011 +f 4998/2398/6034 4991/2391/6027 4990/2390/6026 5002/2402/6038 +f 4965/2365/6001 4955/2354/5991 4987/2388/6023 4982/2383/6018 +f 5000/2400/6036 4970/2370/6006 4972/2372/6008 5003/2403/6039 +f 5004/2404/6040 5001/2401/6037 4975/2375/6011 4981/2381/6017 +f 5002/2402/6038 4990/2390/6026 4989/2389/6025 5005/2405/6041 +f 4962/2362/5998 4965/2365/6001 4982/2383/6018 4977/2378/6013 +f 5003/2403/6039 4972/2372/6008 4974/2374/6010 5006/2406/6042 +f 5007/2407/6043 5004/2404/6040 4981/2381/6017 4986/2386/6022 +f 5005/2405/6041 4989/2389/6025 4988/2387/6024 5008/2408/6044 +f 4959/2359/5995 4962/2362/5998 4977/2378/6013 4968/2368/6004 +f 5006/2406/6042 4974/2374/6010 4976/2376/6012 4995/2393/6031 +f 4997/2396/6033 5007/2407/6043 4986/2386/6022 4991/2391/6027 +f 5008/2408/6044 4988/2387/6024 4987/2388/6023 4999/2399/6035 +f 4951/2353/5987 4959/2359/5995 4968/2368/6004 4967/2369/6003 +f 5009/2411/6045 5010/2410/6046 5011/2409/6047 5012/2412/6048 +f 5012/2412/6048 5011/2409/6047 5013/2413/6049 5014/2414/6050 +f 5014/2414/6050 5013/2413/6049 5015/2415/6051 5016/2416/6052 +f 5016/2416/6052 5015/2415/6051 5017/2417/6053 5018/2418/6054 +f 5010/2410/6046 5019/2420/6055 5020/2419/6056 5011/2409/6047 +f 5011/2409/6047 5020/2419/6056 5021/2421/6057 5013/2413/6049 +f 5013/2413/6049 5021/2421/6057 5022/2422/6058 5015/2415/6051 +f 5015/2415/6051 5022/2422/6058 5023/2423/6059 5017/2417/6053 +f 5019/2420/6055 5024/2425/6060 5025/2424/6061 5020/2419/6056 +f 5020/2419/6056 5025/2424/6061 5026/2426/6062 5021/2421/6057 +f 5021/2421/6057 5026/2426/6062 5027/2427/6063 5022/2422/6058 +f 5022/2422/6058 5027/2427/6063 5028/2428/6064 5023/2423/6059 +f 5024/2425/6060 5029/2430/6065 5030/2429/6066 5025/2424/6061 +f 5025/2424/6061 5030/2429/6066 5031/2431/6067 5026/2426/6062 +f 5026/2426/6062 5031/2431/6067 5032/2432/6068 5027/2427/6063 +f 5027/2427/6063 5032/2432/6068 5033/2433/6069 5028/2428/6064 +f 4994/2394/6030 4993/2395/6029 5009/2411/6045 5034/2434/6070 +f 5035/2437/6071 5036/2436/6072 5037/2435/6073 5018/2418/6054 +f 5038/2439/6074 5039/2438/6075 5033/2433/6069 5040/2440/6076 +f 4997/2396/6033 4996/2397/6032 5041/2441/6077 5029/2430/6065 +f 5034/2434/6070 5009/2411/6045 5012/2412/6048 5042/2442/6078 +f 5043/2443/6079 5035/2437/6071 5018/2418/6054 5017/2417/6053 +f 5040/2440/6076 5033/2433/6069 5032/2432/6068 5044/2444/6080 +f 5007/2407/6043 4997/2396/6033 5029/2430/6065 5024/2425/6060 +f 5042/2442/6078 5012/2412/6048 5014/2414/6050 5045/2445/6081 +f 5046/2446/6082 5043/2443/6079 5017/2417/6053 5023/2423/6059 +f 5044/2444/6080 5032/2432/6068 5031/2431/6067 5047/2447/6083 +f 5004/2404/6040 5007/2407/6043 5024/2425/6060 5019/2420/6055 +f 5045/2445/6081 5014/2414/6050 5016/2416/6052 5048/2448/6084 +f 5049/2449/6085 5046/2446/6082 5023/2423/6059 5028/2428/6064 +f 5047/2447/6083 5031/2431/6067 5030/2429/6066 5050/2450/6086 +f 5001/2401/6037 5004/2404/6040 5019/2420/6055 5010/2410/6046 +f 5048/2448/6084 5016/2416/6052 5018/2418/6054 5037/2435/6073 +f 5039/2438/6075 5049/2449/6085 5028/2428/6064 5033/2433/6069 +f 5050/2450/6086 5030/2429/6066 5029/2430/6065 5041/2441/6077 +f 4993/2395/6029 5001/2401/6037 5010/2410/6046 5009/2411/6045 +f 5051/2453/6087 5052/2452/6088 5053/2451/6089 5054/2454/6090 +f 5054/2454/6090 5053/2451/6089 5055/2455/6091 5056/2456/6092 +f 5056/2456/6092 5055/2455/6091 5057/2457/6093 5058/2458/6094 +f 5058/2458/6094 5057/2457/6093 5059/2459/6095 5060/2460/6096 +f 5052/2452/6088 5061/2462/6097 5062/2461/6098 5053/2451/6089 +f 5053/2451/6089 5062/2461/6098 5063/2463/6099 5055/2455/6091 +f 5055/2455/6091 5063/2463/6099 5064/2464/6100 5057/2457/6093 +f 5057/2457/6093 5064/2464/6100 5065/2465/6101 5059/2459/6095 +f 5061/2462/6097 5066/2467/6102 5067/2466/6103 5062/2461/6098 +f 5062/2461/6098 5067/2466/6103 5068/2468/6104 5063/2463/6099 +f 5063/2463/6099 5068/2468/6104 5069/2469/6105 5064/2464/6100 +f 5064/2464/6100 5069/2469/6105 5070/2470/6106 5065/2465/6101 +f 5066/2467/6102 5071/2472/6107 5072/2471/6108 5067/2466/6103 +f 5067/2466/6103 5072/2471/6108 5073/2473/6109 5068/2468/6104 +f 5068/2468/6104 5073/2473/6109 5074/2474/6110 5069/2469/6105 +f 5069/2469/6105 5074/2474/6110 5075/2475/6111 5070/2470/6106 +f 5076/2477/6112 5077/2476/6113 5051/2453/6087 5078/2478/6114 +f 5079/2481/6115 5080/2480/6116 5081/2479/6117 5060/2460/6096 +f 4905/2305/5941 5082/2482/6118 5075/2475/6111 4906/2304/5942 +f 5083/2483/6119 4901/2302/5937 4903/2303/5939 5071/2472/6107 +f 5078/2478/6114 5051/2453/6087 5054/2454/6090 5084/2484/6120 +f 5085/2485/6121 5079/2481/6115 5060/2460/6096 5059/2459/6095 +f 4906/2304/5942 5075/2475/6111 5074/2474/6110 4921/2321/5957 +f 5086/2486/6122 5083/2483/6119 5071/2472/6107 5066/2467/6102 +f 5084/2484/6120 5054/2454/6090 5056/2456/6092 5087/2487/6123 +f 5088/2488/6124 5085/2485/6121 5059/2459/6095 5065/2465/6101 +f 4921/2321/5957 5074/2474/6110 5073/2473/6109 4917/2317/5953 +f 5089/2489/6125 5086/2486/6122 5066/2467/6102 5061/2462/6097 +f 5087/2487/6123 5056/2456/6092 5058/2458/6094 5090/2490/6126 +f 5091/2491/6127 5088/2488/6124 5065/2465/6101 5070/2470/6106 +f 4917/2317/5953 5073/2473/6109 5072/2471/6108 4913/2313/5949 +f 5092/2492/6128 5089/2489/6125 5061/2462/6097 5052/2452/6088 +f 5090/2490/6126 5058/2458/6094 5060/2460/6096 5081/2479/6117 +f 5082/2482/6118 5091/2491/6127 5070/2470/6106 5075/2475/6111 +f 4913/2313/5949 5072/2471/6108 5071/2472/6107 4903/2303/5939 +f 5077/2476/6113 5092/2492/6128 5052/2452/6088 5051/2453/6087 +f 5093/2495/6129 5094/2494/6130 5095/2493/6131 5096/2496/6132 +f 5096/2496/6132 5095/2493/6131 5097/2497/6133 5098/2498/6134 +f 5098/2498/6134 5097/2497/6133 5099/2499/6135 5100/2500/6136 +f 5100/2500/6136 5099/2499/6135 5101/2501/6137 5102/2502/6138 +f 5094/2494/6130 5103/2504/6139 5104/2503/6140 5095/2493/6131 +f 5095/2493/6131 5104/2503/6140 5105/2505/6141 5097/2497/6133 +f 5097/2497/6133 5105/2505/6141 5106/2506/6142 5099/2499/6135 +f 5099/2499/6135 5106/2506/6142 5107/2507/6143 5101/2501/6137 +f 5103/2504/6139 5108/2509/6144 5109/2508/6145 5104/2503/6140 +f 5104/2503/6140 5109/2508/6145 5110/2510/6146 5105/2505/6141 +f 5105/2505/6141 5110/2510/6146 5111/2511/6147 5106/2506/6142 +f 5106/2506/6142 5111/2511/6147 5112/2512/6148 5107/2507/6143 +f 5108/2509/6144 5113/2514/6149 5114/2513/6150 5109/2508/6145 +f 5109/2508/6145 5114/2513/6150 5115/2515/6151 5110/2510/6146 +f 5110/2510/6146 5115/2515/6151 5116/2516/6152 5111/2511/6147 +f 5111/2511/6147 5116/2516/6152 5117/2517/6153 5112/2512/6148 +f 5080/2480/6116 5079/2481/6115 5093/2495/6129 5118/2518/6154 +f 5119/2521/6155 5120/2520/6156 5121/2519/6157 5102/2502/6138 +f 4952/2352/5988 5122/2522/6158 5117/2517/6153 4953/2351/5989 +f 5082/2482/6118 4905/2305/5941 4950/2350/5986 5113/2514/6149 +f 5118/2518/6154 5093/2495/6129 5096/2496/6132 5123/2523/6159 +f 5124/2524/6160 5119/2521/6155 5102/2502/6138 5101/2501/6137 +f 4953/2351/5989 5117/2517/6153 5116/2516/6152 4964/2364/6000 +f 5091/2491/6127 5082/2482/6118 5113/2514/6149 5108/2509/6144 +f 5123/2523/6159 5096/2496/6132 5098/2498/6134 5125/2525/6161 +f 5126/2526/6162 5124/2524/6160 5101/2501/6137 5107/2507/6143 +f 4964/2364/6000 5116/2516/6152 5115/2515/6151 4961/2361/5997 +f 5088/2488/6124 5091/2491/6127 5108/2509/6144 5103/2504/6139 +f 5125/2525/6161 5098/2498/6134 5100/2500/6136 5127/2527/6163 +f 5128/2528/6164 5126/2526/6162 5107/2507/6143 5112/2512/6148 +f 4961/2361/5997 5115/2515/6151 5114/2513/6150 4958/2358/5994 +f 5085/2485/6121 5088/2488/6124 5103/2504/6139 5094/2494/6130 +f 5127/2527/6163 5100/2500/6136 5102/2502/6138 5121/2519/6157 +f 5122/2522/6158 5128/2528/6164 5112/2512/6148 5117/2517/6153 +f 4958/2358/5994 5114/2513/6150 5113/2514/6149 4950/2350/5986 +f 5079/2481/6115 5085/2485/6121 5094/2494/6130 5093/2495/6129 +f 5129/2531/6165 5130/2530/6166 5131/2529/6167 5132/2532/6168 +f 5132/2532/6168 5131/2529/6167 5133/2533/6169 5134/2534/6170 +f 5134/2534/6170 5133/2533/6169 5135/2535/6171 5136/2536/6172 +f 5136/2536/6172 5135/2535/6171 5137/2537/6173 5138/2538/6174 +f 5130/2530/6166 5139/2540/6175 5140/2539/6176 5131/2529/6167 +f 5131/2529/6167 5140/2539/6176 5141/2541/6177 5133/2533/6169 +f 5133/2533/6169 5141/2541/6177 5142/2542/6178 5135/2535/6171 +f 5135/2535/6171 5142/2542/6178 5143/2543/6179 5137/2537/6173 +f 5139/2540/6175 5144/2545/6180 5145/2544/6181 5140/2539/6176 +f 5140/2539/6176 5145/2544/6181 5146/2546/6182 5141/2541/6177 +f 5141/2541/6177 5146/2546/6182 5147/2547/6183 5142/2542/6178 +f 5142/2542/6178 5147/2547/6183 5148/2548/6184 5143/2543/6179 +f 5144/2545/6180 5149/2550/6185 5150/2549/6186 5145/2544/6181 +f 5145/2544/6181 5150/2549/6186 5151/2551/6187 5146/2546/6182 +f 5146/2546/6182 5151/2551/6187 5152/2552/6188 5147/2547/6183 +f 5147/2547/6183 5152/2552/6188 5153/2553/6189 5148/2548/6184 +f 5120/2520/6156 5119/2521/6155 5129/2531/6165 5154/2554/6190 +f 5155/2557/6191 5156/2556/6192 5157/2555/6193 5138/2538/6174 +f 4994/2394/6030 5158/2558/6194 5153/2553/6189 4995/2393/6031 +f 5122/2522/6158 4952/2352/5988 4992/2392/6028 5149/2550/6185 +f 5154/2554/6190 5129/2531/6165 5132/2532/6168 5159/2559/6195 +f 5160/2560/6196 5155/2557/6191 5138/2538/6174 5137/2537/6173 +f 4995/2393/6031 5153/2553/6189 5152/2552/6188 5006/2406/6042 +f 5128/2528/6164 5122/2522/6158 5149/2550/6185 5144/2545/6180 +f 5159/2559/6195 5132/2532/6168 5134/2534/6170 5161/2561/6197 +f 5162/2562/6198 5160/2560/6196 5137/2537/6173 5143/2543/6179 +f 5006/2406/6042 5152/2552/6188 5151/2551/6187 5003/2403/6039 +f 5126/2526/6162 5128/2528/6164 5144/2545/6180 5139/2540/6175 +f 5161/2561/6197 5134/2534/6170 5136/2536/6172 5163/2563/6199 +f 5164/2564/6200 5162/2562/6198 5143/2543/6179 5148/2548/6184 +f 5003/2403/6039 5151/2551/6187 5150/2549/6186 5000/2400/6036 +f 5124/2524/6160 5126/2526/6162 5139/2540/6175 5130/2530/6166 +f 5163/2563/6199 5136/2536/6172 5138/2538/6174 5157/2555/6193 +f 5158/2558/6194 5164/2564/6200 5148/2548/6184 5153/2553/6189 +f 5000/2400/6036 5150/2549/6186 5149/2550/6185 4992/2392/6028 +f 5119/2521/6155 5124/2524/6160 5130/2530/6166 5129/2531/6165 +f 5165/2567/6201 5166/2566/6202 5167/2565/6203 5168/2568/6204 +f 5168/2568/6204 5167/2565/6203 5169/2569/6205 5170/2570/6206 +f 5170/2570/6206 5169/2569/6205 5171/2571/6207 5172/2572/6208 +f 5172/2572/6208 5171/2571/6207 5173/2573/6209 5174/2574/6210 +f 5166/2566/6202 5175/2576/6211 5176/2575/6212 5167/2565/6203 +f 5167/2565/6203 5176/2575/6212 5177/2577/6213 5169/2569/6205 +f 5169/2569/6205 5177/2577/6213 5178/2578/6214 5171/2571/6207 +f 5171/2571/6207 5178/2578/6214 5179/2579/6215 5173/2573/6209 +f 5175/2576/6211 5180/2581/6216 5181/2580/6217 5176/2575/6212 +f 5176/2575/6212 5181/2580/6217 5182/2582/6218 5177/2577/6213 +f 5177/2577/6213 5182/2582/6218 5183/2583/6219 5178/2578/6214 +f 5178/2578/6214 5183/2583/6219 5184/2584/6220 5179/2579/6215 +f 5180/2581/6216 5185/2586/6221 5186/2585/6222 5181/2580/6217 +f 5181/2580/6217 5186/2585/6222 5187/2587/6223 5182/2582/6218 +f 5182/2582/6218 5187/2587/6223 5188/2588/6224 5183/2583/6219 +f 5183/2583/6219 5188/2588/6224 5189/2589/6225 5184/2584/6220 +f 5156/2556/6192 5155/2557/6191 5165/2567/6201 5190/2590/6226 +f 5191/2593/6227 5192/2592/6228 5193/2591/6229 5174/2574/6210 +f 5036/2436/6072 5194/2594/6230 5189/2589/6225 5037/2435/6073 +f 5158/2558/6194 4994/2394/6030 5034/2434/6070 5185/2586/6221 +f 5190/2590/6226 5165/2567/6201 5168/2568/6204 5195/2595/6231 +f 5196/2596/6232 5191/2593/6227 5174/2574/6210 5173/2573/6209 +f 5037/2435/6073 5189/2589/6225 5188/2588/6224 5048/2448/6084 +f 5164/2564/6200 5158/2558/6194 5185/2586/6221 5180/2581/6216 +f 5195/2595/6231 5168/2568/6204 5170/2570/6206 5197/2597/6233 +f 5198/2598/6234 5196/2596/6232 5173/2573/6209 5179/2579/6215 +f 5048/2448/6084 5188/2588/6224 5187/2587/6223 5045/2445/6081 +f 5162/2562/6198 5164/2564/6200 5180/2581/6216 5175/2576/6211 +f 5197/2597/6233 5170/2570/6206 5172/2572/6208 5199/2599/6235 +f 5200/2600/6236 5198/2598/6234 5179/2579/6215 5184/2584/6220 +f 5045/2445/6081 5187/2587/6223 5186/2585/6222 5042/2442/6078 +f 5160/2560/6196 5162/2562/6198 5175/2576/6211 5166/2566/6202 +f 5199/2599/6235 5172/2572/6208 5174/2574/6210 5193/2591/6229 +f 5194/2594/6230 5200/2600/6236 5184/2584/6220 5189/2589/6225 +f 5042/2442/6078 5186/2585/6222 5185/2586/6221 5034/2434/6070 +f 5155/2557/6191 5160/2560/6196 5166/2566/6202 5165/2567/6201 +s 2 +f 4902/2301/6237 4901/2302/6238 4577/2302/6239 4576/2301/6240 +s 4 +f 4907/2308/6241 4909/2309/6242 4584/2309/6243 4583/2308/6244 +f 4912/2310/6245 4911/2311/6246 4586/2311/6247 4585/2310/6248 +s 2 +f 4911/2311/6249 4910/2312/6250 4587/2312/6251 4586/2311/6252 +s 4 +f 4909/2309/6242 4915/2315/6253 4590/2315/6254 4584/2309/6243 +s 2 +f 4910/2312/6250 4916/2316/6255 4591/2316/6256 4587/2312/6251 +s 4 +f 4915/2315/6253 4919/2319/6257 4594/2319/6258 4590/2315/6254 +s 2 +f 4916/2316/6255 4920/2320/6259 4595/2320/6260 4591/2316/6256 +s 4 +f 4919/2319/6257 4923/2323/6261 4598/2323/6262 4594/2319/6258 +s 2 +f 4920/2320/6259 4924/2324/6263 4599/2324/6264 4595/2320/6260 +s 4 +f 4923/2323/6261 4912/2310/6245 4585/2310/6248 4598/2323/6262 +s 2 +f 4924/2324/6263 4902/2301/6237 4576/2301/6240 4599/2324/6264 +s 4 +f 4954/2355/6265 4956/2356/6266 4631/2356/6267 4630/2355/6268 +f 4957/2357/6269 4907/2308/6241 4583/2308/6244 4632/2357/6270 +f 4956/2356/6266 4960/2360/6271 4635/2360/6272 4631/2356/6267 +f 4960/2360/6271 4963/2363/6273 4638/2363/6274 4635/2360/6272 +f 4963/2363/6273 4966/2366/6275 4641/2366/6276 4638/2363/6274 +f 4966/2366/6275 4957/2357/6269 4632/2357/6270 4641/2366/6276 +f 4996/2397/6277 4998/2398/6278 4673/2398/6279 4672/2397/6280 +f 4999/2399/6281 4954/2355/6265 4630/2355/6268 4674/2399/6282 +f 4998/2398/6278 5002/2402/6283 4677/2402/6284 4673/2398/6279 +f 5002/2402/6283 5005/2405/6285 4680/2405/6286 4677/2402/6284 +f 5005/2405/6285 5008/2408/6287 4683/2408/6288 4680/2405/6286 +f 5008/2408/6287 4999/2399/6281 4674/2399/6282 4683/2408/6288 +f 5036/2436/6289 5035/2437/6290 4712/2437/6291 4711/2436/6292 +f 5038/2439/6293 5040/2440/6294 4715/2440/6295 4714/2439/6296 +f 5039/2438/6297 5038/2439/6293 4714/2439/6296 4713/2438/6298 +f 5041/2441/6299 4996/2397/6277 4672/2397/6280 4716/2441/6300 +f 5035/2437/6290 5043/2443/6301 4718/2443/6302 4712/2437/6291 +f 5040/2440/6294 5044/2444/6303 4719/2444/6304 4715/2440/6295 +f 5043/2443/6301 5046/2446/6305 4721/2446/6306 4718/2443/6302 +f 5044/2444/6303 5047/2447/6307 4722/2447/6308 4719/2444/6304 +f 5046/2446/6305 5049/2449/6309 4724/2449/6310 4721/2446/6306 +f 5047/2447/6307 5050/2450/6311 4725/2450/6312 4722/2447/6308 +f 5049/2449/6309 5039/2438/6297 4713/2438/6298 4724/2449/6310 +f 5050/2450/6311 5041/2441/6299 4716/2441/6300 4725/2450/6312 +f 5076/2477/6313 5078/2478/6314 4753/2478/6315 4752/2477/6316 +s 2 +f 5077/2476/6317 5076/2477/6318 4752/2477/6319 4751/2476/6320 +s 4 +f 5081/2479/6321 5080/2480/6322 4755/2480/6323 4754/2479/6324 +s 2 +f 4901/2302/6238 5083/2483/6325 4758/2483/6326 4577/2302/6239 +s 4 +f 5078/2478/6314 5084/2484/6327 4759/2484/6328 4753/2478/6315 +s 2 +f 5083/2483/6325 5086/2486/6329 4761/2486/6330 4758/2483/6326 +s 4 +f 5084/2484/6327 5087/2487/6331 4762/2487/6332 4759/2484/6328 +s 2 +f 5086/2486/6329 5089/2489/6333 4764/2489/6334 4761/2486/6330 +s 4 +f 5087/2487/6331 5090/2490/6335 4765/2490/6336 4762/2487/6332 +s 2 +f 5089/2489/6333 5092/2492/6337 4767/2492/6338 4764/2489/6334 +s 4 +f 5090/2490/6335 5081/2479/6321 4754/2479/6324 4765/2490/6336 +s 2 +f 5092/2492/6337 5077/2476/6317 4751/2476/6320 4767/2492/6338 +s 4 +f 5080/2480/6322 5118/2518/6339 4793/2518/6340 4755/2480/6323 +f 5121/2519/6341 5120/2520/6342 4795/2520/6343 4794/2519/6344 +f 5118/2518/6339 5123/2523/6345 4798/2523/6346 4793/2518/6340 +f 5123/2523/6345 5125/2525/6347 4800/2525/6348 4798/2523/6346 +f 5125/2525/6347 5127/2527/6349 4802/2527/6350 4800/2525/6348 +f 5127/2527/6349 5121/2519/6341 4794/2519/6344 4802/2527/6350 +f 5120/2520/6342 5154/2554/6351 4829/2554/6352 4795/2520/6343 +f 5157/2555/6353 5156/2556/6354 4831/2556/6355 4830/2555/6356 +f 5154/2554/6351 5159/2559/6357 4834/2559/6358 4829/2554/6352 +f 5159/2559/6357 5161/2561/6359 4836/2561/6360 4834/2559/6358 +f 5161/2561/6359 5163/2563/6361 4838/2563/6362 4836/2561/6360 +f 5163/2563/6361 5157/2555/6353 4830/2555/6356 4838/2563/6362 +f 5156/2556/6354 5190/2590/6363 4865/2590/6364 4831/2556/6355 +f 5193/2591/6365 5192/2592/6366 4867/2592/6367 4866/2591/6368 +f 5192/2592/6366 5191/2593/6369 4868/2593/6370 4867/2592/6367 +f 5194/2594/6371 5036/2436/6289 4711/2436/6292 4869/2594/6372 +f 5190/2590/6363 5195/2595/6373 4870/2595/6374 4865/2590/6364 +f 5191/2593/6369 5196/2596/6375 4871/2596/6376 4868/2593/6370 +f 5195/2595/6373 5197/2597/6377 4872/2597/6378 4870/2595/6374 +f 5196/2596/6375 5198/2598/6379 4873/2598/6380 4871/2596/6376 +f 5197/2597/6377 5199/2599/6381 4874/2599/6382 4872/2597/6378 +f 5198/2598/6379 5200/2600/6383 4875/2600/6384 4873/2598/6380 +f 5199/2599/6381 5193/2591/6365 4866/2591/6368 4874/2599/6382 +f 5200/2600/6383 5194/2594/6371 4869/2594/6372 4875/2600/6384 +# 648 polygons + +# +# object lotu_petal_08 +# + +v 0.0448 0.0650 0.2811 +v 0.0493 0.0490 0.2262 +v -0.0007 0.0394 0.2024 +v -0.0120 0.0500 0.2559 +v 0.0342 0.0793 0.3409 +v -0.0289 0.0645 0.3165 +v 0.0162 0.0981 0.4094 +v -0.0556 0.0834 0.3831 +v -0.0053 0.1161 0.4818 +v -0.0794 0.1096 0.4540 +v 0.1054 0.0820 0.3123 +v 0.1021 0.0664 0.2532 +v 0.0975 0.1038 0.3750 +v 0.0895 0.1214 0.4431 +v 0.0664 0.1419 0.5142 +v 0.1645 0.1068 0.3337 +v 0.1512 0.0919 0.2762 +v 0.1620 0.1242 0.3984 +v 0.1588 0.1495 0.4656 +v 0.1345 0.1711 0.5379 +v 0.2217 0.1397 0.3598 +v 0.2033 0.1247 0.2982 +v 0.2296 0.1526 0.4260 +v 0.2234 0.1785 0.4971 +v 0.2055 0.2027 0.5707 +v 0.0174 0.0297 0.1567 +v -0.0213 0.0243 0.1397 +v -0.0449 0.0315 0.1844 +v -0.1599 0.1001 0.4217 +v -0.1972 0.1283 0.4964 +v -0.1199 0.1363 0.5300 +v 0.1891 0.2361 0.6458 +v 0.2754 0.2710 0.6780 +v 0.2795 0.2367 0.5975 +v 0.2514 0.1634 0.3178 +v 0.2124 0.1482 0.2524 +v 0.1710 0.1118 0.2350 +v -0.0682 0.0436 0.2348 +v -0.0453 0.1481 0.5595 +v 0.2895 0.2156 0.5209 +v 0.1301 0.0850 0.2210 +v -0.0929 0.0611 0.2909 +v 0.0287 0.1671 0.5880 +v 0.2936 0.1896 0.4493 +v 0.0926 0.0606 0.1987 +v -0.1234 0.0760 0.3519 +v 0.1079 0.2017 0.6186 +v 0.2746 0.1741 0.3834 +v 0.0539 0.0443 0.1764 +v -0.1183 0.2275 0.7204 +v -0.0888 0.1814 0.6383 +v -0.1732 0.1711 0.6125 +v -0.2138 0.2109 0.6886 +v -0.1445 0.2723 0.8046 +v -0.2451 0.2563 0.7635 +v -0.1656 0.3296 0.8863 +v -0.2723 0.3113 0.8458 +v -0.1888 0.4039 0.9717 +v -0.2932 0.3810 0.9376 +v -0.0188 0.2563 0.7420 +v 0.0010 0.2093 0.6612 +v -0.0395 0.3047 0.8234 +v -0.0532 0.3618 0.9123 +v -0.0854 0.4199 1.0046 +v 0.0794 0.2839 0.7752 +v 0.0923 0.2381 0.6973 +v 0.0671 0.3384 0.8520 +v 0.0537 0.3982 0.9350 +v 0.0202 0.4601 1.0259 +v 0.1758 0.3176 0.8063 +v 0.1839 0.2738 0.7269 +v 0.1738 0.3716 0.8851 +v 0.1568 0.4252 0.9669 +v 0.1285 0.4901 1.0542 +v -0.2512 0.1609 0.5742 +v -0.4040 0.3710 0.8957 +v -0.4372 0.4525 0.9844 +v -0.3334 0.4669 1.0285 +v 0.0741 0.5700 1.1451 +v 0.1739 0.6063 1.1684 +v 0.2308 0.5267 1.0804 +v 0.2754 0.3117 0.7566 +v -0.3033 0.2076 0.6492 +v -0.2279 0.4778 1.0646 +v 0.2577 0.4590 0.9937 +v -0.3426 0.2491 0.7258 +v -0.1246 0.4967 1.1002 +v 0.2783 0.4047 0.9107 +v -0.3790 0.3026 0.8060 +v -0.0224 0.5319 1.1214 +v 0.2750 0.3555 0.8333 +v -0.3577 0.7131 1.2546 +v -0.2913 0.5821 1.1531 +v -0.3865 0.5670 1.1217 +v -0.4522 0.6969 1.2159 +v -0.4330 0.8548 1.3630 +v -0.5269 0.8321 1.3136 +v -0.5116 1.0041 1.4314 +v -0.5990 0.9839 1.3964 +v -0.5664 1.1633 1.4715 +v -0.6517 1.1374 1.4490 +v -0.2596 0.7390 1.2842 +v -0.1914 0.6059 1.1890 +v -0.3375 0.8816 1.3860 +v -0.4194 1.0338 1.4546 +v -0.4815 1.1882 1.4890 +v -0.1611 0.7660 1.3043 +v -0.0882 0.6384 1.2220 +v -0.2443 0.9083 1.4067 +v -0.3290 1.0629 1.4612 +v -0.3893 1.2147 1.4936 +v -0.0611 0.7972 1.3287 +v 0.0136 0.6738 1.2433 +v -0.1478 0.9396 1.4093 +v -0.2359 1.0878 1.4714 +v -0.2988 1.2366 1.5093 +v -0.4887 0.5594 1.0835 +v -0.7298 1.1319 1.4231 +v -0.7366 1.2838 1.4650 +v -0.6684 1.2861 1.4840 +v -0.3563 1.3658 1.5324 +v -0.2697 1.3821 1.5371 +v -0.2076 1.2543 1.5159 +v 0.1140 0.7083 1.2569 +v -0.5458 0.6826 1.1737 +v -0.5958 1.3022 1.5007 +v -0.1414 1.1100 1.4798 +v -0.6150 0.8243 1.2712 +v -0.5171 1.3287 1.5131 +v -0.0529 0.9587 1.4200 +v -0.6801 0.9771 1.3626 +v -0.4381 1.3498 1.5247 +v 0.0367 0.8251 1.3503 +v -0.6427 1.5445 1.4936 +v -0.6229 1.4265 1.4999 +v -0.6885 1.4231 1.4913 +v -0.7036 1.5482 1.4879 +v -0.6614 1.6585 1.4836 +v -0.7099 1.6594 1.4748 +v -0.6748 1.7554 1.4661 +v -0.7143 1.7571 1.4583 +v -0.6941 1.8412 1.4390 +v -0.7233 1.8427 1.4327 +v -0.5793 1.5616 1.5012 +v -0.5552 1.4493 1.5112 +v -0.6089 1.6606 1.4872 +v -0.6315 1.7518 1.4735 +v -0.6609 1.8367 1.4455 +v -0.5146 1.5770 1.5035 +v -0.4837 1.4685 1.5195 +v -0.5547 1.6752 1.4933 +v -0.5876 1.7569 1.4829 +v -0.6273 1.8310 1.4552 +v -0.4486 1.5918 1.5120 +v -0.4077 1.4831 1.5346 +v -0.5006 1.6847 1.4955 +v -0.5460 1.7632 1.4875 +v -0.5972 1.8277 1.4630 +v -0.7535 1.4216 1.4748 +v -0.7450 1.8444 1.4246 +v -0.7339 1.9160 1.3976 +v -0.7202 1.9156 1.4051 +v -0.6694 1.8906 1.4297 +v -0.6564 1.8758 1.4343 +v -0.5730 1.8229 1.4673 +v -0.3261 1.4956 1.5446 +v -0.7603 1.5474 1.4672 +v -0.7070 1.9143 1.4123 +v -0.5093 1.7638 1.4885 +v -0.7536 1.6592 1.4661 +v -0.6944 1.9104 1.4189 +v -0.4477 1.6915 1.4949 +v -0.7463 1.7575 1.4503 +v -0.6823 1.9022 1.4244 +v -0.3800 1.5998 1.5213 +v -0.3071 0.0923 0.1261 +v -0.2493 0.0787 0.0970 +v -0.3063 0.1069 0.0705 +v -0.3700 0.1171 0.0976 +v -0.3624 0.0946 0.1686 +v -0.4334 0.1209 0.1260 +v -0.4150 0.1001 0.2111 +v -0.4929 0.1303 0.1722 +v -0.4743 0.1160 0.2634 +v -0.5534 0.1474 0.2214 +v -0.2448 0.0719 0.1571 +v -0.1958 0.0620 0.1192 +v -0.2903 0.0806 0.1993 +v -0.3450 0.0805 0.2554 +v -0.3898 0.0873 0.3080 +v -0.1822 0.0554 0.1809 +v -0.1408 0.0492 0.1384 +v -0.2262 0.0627 0.2339 +v -0.2687 0.0703 0.2894 +v -0.3110 0.0831 0.3482 +v -0.1243 0.0436 0.2088 +v -0.0892 0.0349 0.1641 +v -0.1564 0.0528 0.2602 +v -0.1942 0.0682 0.3196 +v -0.2376 0.0829 0.3872 +v -0.2375 0.0947 0.0532 +v -0.2865 0.1334 0.0308 +v -0.3606 0.1397 0.0458 +v -0.6342 0.1770 0.1850 +v -0.6965 0.1965 0.2464 +v -0.6167 0.1659 0.2840 +v -0.2771 0.1116 0.4582 +v -0.0619 0.0293 0.1230 +v -0.4327 0.1411 0.0584 +v -0.5251 0.1457 0.3267 +v -0.1049 0.0393 0.1039 +v -0.5020 0.1501 0.0928 +v -0.4388 0.1169 0.3665 +v -0.1471 0.0536 0.0837 +v -0.5693 0.1586 0.1288 +v -0.3624 0.1105 0.4201 +v -0.1892 0.0703 0.0697 +v -0.6324 0.2279 0.4670 +v -0.5799 0.1804 0.3890 +v -0.6700 0.2015 0.3534 +v -0.7231 0.2449 0.4278 +v -0.7003 0.2780 0.5512 +v -0.7812 0.2891 0.4957 +v -0.7703 0.3305 0.6322 +v -0.8506 0.3427 0.5616 +v -0.8167 0.3867 0.7124 +v -0.9100 0.4047 0.6302 +v -0.5515 0.2095 0.5035 +v -0.4940 0.1618 0.4369 +v -0.6188 0.2600 0.5860 +v -0.6758 0.3127 0.6806 +v -0.7137 0.3637 0.7718 +v -0.4697 0.2010 0.5564 +v -0.4080 0.1513 0.4856 +v -0.5314 0.2493 0.6300 +v -0.5784 0.3009 0.7145 +v -0.6134 0.3623 0.8080 +v -0.3870 0.1977 0.6091 +v -0.3273 0.1566 0.5336 +v -0.4375 0.2432 0.6812 +v -0.4752 0.2952 0.7647 +v -0.5096 0.3641 0.8488 +v -0.7534 0.2188 0.3085 +v -0.9856 0.4197 0.5524 +v -1.0328 0.5057 0.6258 +v -0.9370 0.4849 0.7111 +v -0.5385 0.4470 0.9425 +v -0.8152 0.2572 0.3642 +v -0.8442 0.4571 0.7834 +v -0.8692 0.3017 0.4247 +v -0.7469 0.4307 0.8567 +v -0.9260 0.3498 0.4848 +v -0.6460 0.4314 0.9028 +v -0.9207 0.6727 0.9752 +v -0.8738 0.5558 0.8715 +v -0.9633 0.5808 0.7993 +v -1.0070 0.7113 0.9078 +v -0.9766 0.8274 1.0861 +v -1.0633 0.8575 1.0284 +v -0.9988 0.9843 1.1719 +v -1.0765 1.0090 1.1110 +v -1.0123 1.1370 1.2471 +v -1.0712 1.1534 1.1800 +v -0.8275 0.6572 1.0236 +v -0.7750 0.5285 0.9380 +v -0.8864 0.8078 1.1337 +v -0.9134 0.9624 1.2256 +v -0.9411 1.1273 1.3065 +v -0.7321 0.6474 1.0793 +v -0.6840 0.5206 0.9950 +v -0.7945 0.8027 1.1822 +v -0.8326 0.9689 1.2836 +v -0.8706 1.1342 1.3623 +v -0.6364 0.6653 1.1297 +v -0.5886 0.5453 1.0342 +v -0.7048 0.8117 1.2268 +v -0.7550 0.9714 1.3256 +v -0.8020 1.1307 1.4035 +v -1.0485 0.6121 0.7251 +v -1.1327 1.1776 1.1072 +v -1.1251 1.3020 1.1707 +v -1.0622 1.2870 1.2396 +v -0.8030 1.2827 1.4336 +v -1.0885 0.7414 0.8381 +v -1.0001 1.2795 1.2972 +v -1.1347 0.8871 0.9594 +v -0.9378 1.2765 1.3470 +v -1.1460 1.0361 1.0448 +v -0.8718 1.2795 1.3999 +v -0.9684 1.5295 1.3538 +v -0.9886 1.4092 1.3362 +v -1.0428 1.4109 1.2818 +v -1.0143 1.5249 1.3102 +v -0.9192 1.6375 1.3567 +v -0.9602 1.6309 1.3218 +v -0.8783 1.7360 1.3697 +v -0.9107 1.7244 1.3429 +v -0.8405 1.8256 1.3667 +v -0.8640 1.8125 1.3496 +v -0.9172 1.5327 1.3902 +v -0.9339 1.4104 1.3796 +v -0.8804 1.6444 1.3874 +v -0.8415 1.7450 1.3967 +v -0.8144 1.8329 1.3845 +v -0.8680 1.5406 1.4223 +v -0.8742 1.4152 1.4214 +v -0.8363 1.6517 1.4218 +v -0.8060 1.7494 1.4193 +v -0.7886 1.8399 1.4018 +v -0.8147 1.5420 1.4462 +v -0.8136 1.4167 1.4545 +v -0.7938 1.6556 1.4451 +v -0.7742 1.7563 1.4391 +v -0.7648 1.8427 1.4146 +v -1.1010 1.4164 1.2217 +v -0.8859 1.7987 1.3395 +v -0.8269 1.8837 1.3610 +v -0.8085 1.8916 1.3675 +v -0.7481 1.9159 1.3905 +v -1.0610 1.5260 1.2630 +v -0.7939 1.9005 1.3741 +v -0.9962 1.6233 1.2843 +v -0.7787 1.9074 1.3798 +v -0.9403 1.7143 1.3196 +v -0.7632 1.9135 1.3853 +v 0.0027 0.0193 0.2038 +v 0.0551 0.0293 0.2281 +v 0.0491 0.0456 0.2851 +v -0.0102 0.0299 0.2581 +v 0.0355 0.0594 0.3469 +v -0.0275 0.0445 0.3211 +v 0.0183 0.0789 0.4134 +v -0.0566 0.0640 0.3878 +v -0.0033 0.0970 0.4881 +v -0.0816 0.0904 0.4596 +v 0.1099 0.0476 0.2520 +v 0.1112 0.0629 0.3138 +v 0.1003 0.0846 0.3803 +v 0.0920 0.1025 0.4481 +v 0.0690 0.1224 0.5214 +v 0.1619 0.0737 0.2757 +v 0.1716 0.0893 0.3360 +v 0.1692 0.1053 0.4017 +v 0.1633 0.1300 0.4725 +v 0.1396 0.1518 0.5449 +v 0.2156 0.1088 0.2954 +v 0.2306 0.1203 0.3619 +v 0.2380 0.1345 0.4308 +v 0.2314 0.1596 0.5029 +v 0.2103 0.1838 0.5779 +v -0.0214 0.0040 0.1416 +v 0.0190 0.0096 0.1579 +v -0.0456 0.0110 0.1863 +v -0.1218 0.1173 0.5345 +v -0.1995 0.1101 0.5014 +v -0.1619 0.0802 0.4248 +v 0.2815 0.2524 0.6845 +v 0.1957 0.2190 0.6550 +v 0.2857 0.2190 0.6030 +v 0.1843 0.0954 0.2304 +v 0.2271 0.1338 0.2483 +v 0.2661 0.1500 0.3178 +v -0.0674 0.0240 0.2378 +v -0.0442 0.1295 0.5669 +v 0.2972 0.1976 0.5261 +v 0.1428 0.0670 0.2172 +v -0.0933 0.0408 0.2945 +v 0.0320 0.1497 0.5961 +v 0.3027 0.1707 0.4532 +v 0.1003 0.0413 0.1972 +v -0.1260 0.0571 0.3559 +v 0.1116 0.1832 0.6247 +v 0.2854 0.1572 0.3838 +v 0.0597 0.0247 0.1788 +v -0.1734 0.1518 0.6201 +v -0.0867 0.1620 0.6481 +v -0.1179 0.2104 0.7295 +v -0.2143 0.1919 0.7002 +v -0.1432 0.2541 0.8168 +v -0.2451 0.2385 0.7743 +v -0.1656 0.3123 0.8980 +v -0.2736 0.2937 0.8568 +v -0.1918 0.3858 0.9851 +v -0.2949 0.3661 0.9505 +v 0.0038 0.1920 0.6724 +v -0.0163 0.2394 0.7501 +v -0.0406 0.2880 0.8363 +v -0.0534 0.3447 0.9258 +v -0.0843 0.4032 1.0167 +v 0.0951 0.2195 0.7059 +v 0.0837 0.2670 0.7870 +v 0.0692 0.3218 0.8644 +v 0.0528 0.3815 0.9462 +v 0.0245 0.4458 1.0393 +v 0.1907 0.2560 0.7352 +v 0.1823 0.3007 0.8166 +v 0.1789 0.3550 0.8976 +v 0.1599 0.4086 0.9780 +v 0.1312 0.4752 1.0680 +v -0.2523 0.1429 0.5822 +v -0.3357 0.4513 1.0425 +v -0.4408 0.4378 0.9967 +v -0.4056 0.3541 0.9071 +v 0.1768 0.5933 1.1839 +v 0.0764 0.5575 1.1583 +v 0.2340 0.5129 1.0928 +v 0.2803 0.2933 0.7658 +v -0.3063 0.1887 0.6582 +v -0.2267 0.4608 1.0784 +v 0.2628 0.4427 1.0056 +v -0.3436 0.2300 0.7380 +v -0.1249 0.4810 1.1151 +v 0.2834 0.3878 0.9234 +v -0.3818 0.2844 0.8167 +v -0.0198 0.5191 1.1365 +v 0.2823 0.3383 0.8453 +v -0.3891 0.5539 1.1361 +v -0.2960 0.5700 1.1708 +v -0.3616 0.7023 1.2702 +v -0.4581 0.6836 1.2321 +v -0.4350 0.8436 1.3792 +v -0.5314 0.8192 1.3298 +v -0.5145 0.9982 1.4497 +v -0.6026 0.9732 1.4135 +v -0.5731 1.1582 1.4907 +v -0.6585 1.1307 1.4673 +v -0.1930 0.5951 1.2043 +v -0.2619 0.7268 1.2992 +v -0.3398 0.8724 1.4037 +v -0.4217 1.0271 1.4745 +v -0.4839 1.1866 1.5091 +v -0.0881 0.6260 1.2373 +v -0.1613 0.7550 1.3213 +v -0.2446 0.8996 1.4247 +v -0.3294 1.0581 1.4825 +v -0.3920 1.2105 1.5136 +v 0.0162 0.6625 1.2605 +v -0.0599 0.7874 1.3471 +v -0.1480 0.9318 1.4265 +v -0.2350 1.0806 1.4915 +v -0.3011 1.2294 1.5293 +v -0.4896 0.5451 1.0977 +v -0.6769 1.2863 1.5037 +v -0.7473 1.2842 1.4841 +v -0.7369 1.1266 1.4413 +v -0.2727 1.3813 1.5575 +v -0.3603 1.3643 1.5530 +v -0.2093 1.2500 1.5352 +v 0.1181 0.6969 1.2722 +v -0.5519 0.6695 1.1896 +v -0.6008 1.3004 1.5206 +v -0.1407 1.1033 1.4992 +v -0.6205 0.8130 1.2857 +v -0.5235 1.3259 1.5332 +v -0.0540 0.9489 1.4392 +v -0.6868 0.9657 1.3794 +v -0.4444 1.3487 1.5448 +v 0.0385 0.8126 1.3673 +v -0.6965 1.4255 1.5127 +v -0.6293 1.4262 1.5202 +v -0.6449 1.5480 1.5148 +v -0.7082 1.5538 1.5083 +v -0.6678 1.6635 1.5035 +v -0.7182 1.6677 1.4947 +v -0.6817 1.7651 1.4871 +v -0.7215 1.7666 1.4786 +v -0.6969 1.8506 1.4584 +v -0.7273 1.8525 1.4509 +v -0.5603 1.4511 1.5323 +v -0.5808 1.5633 1.5219 +v -0.6150 1.6648 1.5072 +v -0.6377 1.7595 1.4940 +v -0.6632 1.8457 1.4648 +v -0.4881 1.4691 1.5398 +v -0.5157 1.5801 1.5239 +v -0.5608 1.6806 1.5138 +v -0.5925 1.7649 1.5035 +v -0.6297 1.8384 1.4748 +v -0.4114 1.4835 1.5551 +v -0.4487 1.5932 1.5322 +v -0.5056 1.6903 1.5160 +v -0.5494 1.7716 1.5083 +v -0.5997 1.8356 1.4826 +v -0.7636 1.4252 1.4958 +v -0.7268 1.9271 1.4229 +v -0.7414 1.9283 1.4155 +v -0.7517 1.8533 1.4420 +v -0.6572 1.8857 1.4543 +v -0.6729 1.8989 1.4497 +v -0.5756 1.8302 1.4882 +v -0.3295 1.4950 1.5651 +v -0.7695 1.5534 1.4868 +v -0.7126 1.9237 1.4301 +v -0.5121 1.7713 1.5101 +v -0.7631 1.6676 1.4852 +v -0.6991 1.9184 1.4376 +v -0.4518 1.6959 1.5150 +v -0.7548 1.7670 1.4700 +v -0.6864 1.9100 1.4441 +v -0.3798 1.6015 1.5416 +v -0.3071 0.0893 0.0614 +v -0.2515 0.0590 0.0907 +v -0.3115 0.0722 0.1245 +v -0.3723 0.0969 0.0908 +v -0.3673 0.0752 0.1648 +v -0.4360 0.0999 0.1237 +v -0.4188 0.0802 0.2121 +v -0.4977 0.1108 0.1739 +v -0.4784 0.0966 0.2683 +v -0.5585 0.1273 0.2222 +v -0.1985 0.0414 0.1159 +v -0.2479 0.0523 0.1555 +v -0.2976 0.0593 0.2026 +v -0.3486 0.0598 0.2564 +v -0.3968 0.0672 0.3126 +v -0.1418 0.0295 0.1384 +v -0.1842 0.0351 0.1827 +v -0.2289 0.0422 0.2344 +v -0.2710 0.0497 0.2928 +v -0.3162 0.0631 0.3523 +v -0.0911 0.0140 0.1659 +v -0.1256 0.0234 0.2110 +v -0.1584 0.0324 0.2612 +v -0.1969 0.0481 0.3234 +v -0.2425 0.0628 0.3907 +v -0.2836 0.1161 0.0154 +v -0.2387 0.0768 0.0417 +v -0.3592 0.1213 0.0345 +v -0.6226 0.1472 0.2865 +v -0.7036 0.1766 0.2501 +v -0.6423 0.1572 0.1845 +v -0.2811 0.0930 0.4621 +v -0.0637 0.0090 0.1249 +v -0.4343 0.1222 0.0514 +v -0.5307 0.1272 0.3304 +v -0.1060 0.0192 0.1041 +v -0.5048 0.1293 0.0900 +v -0.4457 0.0986 0.3710 +v -0.1498 0.0341 0.0795 +v -0.5759 0.1386 0.1269 +v -0.3672 0.0909 0.4231 +v -0.1909 0.0505 0.0634 +v -0.6762 0.1824 0.3593 +v -0.5879 0.1627 0.3959 +v -0.6407 0.2102 0.4747 +v -0.7327 0.2260 0.4326 +v -0.7087 0.2602 0.5579 +v -0.7890 0.2717 0.5022 +v -0.7805 0.3127 0.6407 +v -0.8624 0.3246 0.5712 +v -0.8247 0.3693 0.7200 +v -0.9215 0.3891 0.6403 +v -0.5007 0.1449 0.4439 +v -0.5591 0.1924 0.5117 +v -0.6250 0.2442 0.5941 +v -0.6832 0.2936 0.6888 +v -0.7205 0.3444 0.7835 +v -0.4127 0.1335 0.4918 +v -0.4752 0.1830 0.5633 +v -0.5373 0.2319 0.6398 +v -0.5828 0.2843 0.7226 +v -0.6221 0.3444 0.8214 +v -0.3313 0.1383 0.5396 +v -0.3924 0.1799 0.6193 +v -0.4425 0.2255 0.6909 +v -0.4818 0.2791 0.7737 +v -0.5159 0.3476 0.8595 +v -0.7641 0.1995 0.3127 +v -0.9471 0.4698 0.7203 +v -1.0445 0.4929 0.6342 +v -0.9980 0.4061 0.5593 +v -0.5437 0.4309 0.9555 +v -0.8243 0.2387 0.3690 +v -0.8522 0.4430 0.7952 +v -0.8765 0.2830 0.4297 +v -0.7549 0.4130 0.8703 +v -0.9377 0.3314 0.4930 +v -0.6514 0.4135 0.9169 +v -0.9756 0.5679 0.8097 +v -0.8834 0.5427 0.8838 +v -0.9309 0.6619 0.9856 +v -1.0175 0.7021 0.9173 +v -0.9846 0.8197 1.1010 +v -1.0762 0.8481 1.0410 +v -1.0091 0.9773 1.1872 +v -1.0894 1.0032 1.1263 +v -1.0246 1.1316 1.2621 +v -1.0857 1.1480 1.1915 +v -0.7827 0.5148 0.9507 +v -0.8347 0.6438 1.0373 +v -0.8929 0.7998 1.1484 +v -0.9252 0.9546 1.2399 +v -0.9538 1.1246 1.3223 +v -0.6908 0.5054 1.0112 +v -0.7382 0.6343 1.0934 +v -0.8014 0.7931 1.1958 +v -0.8433 0.9602 1.2985 +v -0.8820 1.1266 1.3781 +v -0.5943 0.5301 1.0494 +v -0.6430 0.6512 1.1465 +v -0.7091 0.8017 1.2422 +v -0.7658 0.9603 1.3425 +v -0.8129 1.1275 1.4219 +v -1.0631 0.5997 0.7343 +v -1.0767 1.2865 1.2532 +v -1.1397 1.3024 1.1823 +v -1.1485 1.1740 1.1189 +v -0.8139 1.2796 1.4523 +v -1.1017 0.7316 0.8471 +v -1.0138 1.2785 1.3130 +v -1.1495 0.8793 0.9712 +v -0.9506 1.2771 1.3627 +v -1.1611 1.0293 1.0578 +v -0.8825 1.2779 1.4155 +v -1.0579 1.4125 1.2955 +v -1.0016 1.4108 1.3510 +v -0.9811 1.5354 1.3703 +v -1.0302 1.5287 1.3257 +v -0.9341 1.6468 1.3733 +v -0.9732 1.6386 1.3363 +v -0.8909 1.7430 1.3849 +v -0.9248 1.7335 1.3586 +v -0.8537 1.8318 1.3807 +v -0.8777 1.8195 1.3645 +v -0.9449 1.4141 1.3964 +v -0.9299 1.5362 1.4068 +v -0.8932 1.6503 1.4039 +v -0.8543 1.7540 1.4129 +v -0.8272 1.8403 1.4004 +v -0.8841 1.4162 1.4378 +v -0.8795 1.5436 1.4407 +v -0.8475 1.6580 1.4378 +v -0.8190 1.7567 1.4372 +v -0.8009 1.8475 1.4173 +v -0.8254 1.4189 1.4742 +v -0.8235 1.5476 1.4660 +v -0.8056 1.6624 1.4640 +v -0.7865 1.7635 1.4573 +v -0.7750 1.8521 1.4320 +v -1.1149 1.4179 1.2351 +v -0.8198 1.8954 1.3857 +v -0.8335 1.8811 1.3814 +v -0.8981 1.8041 1.3560 +v -0.7561 1.9271 1.4091 +v -1.0756 1.5285 1.2783 +v -0.8032 1.9079 1.3920 +v -1.0111 1.6295 1.2987 +v -0.7868 1.9174 1.3977 +v -0.9536 1.7221 1.3340 +v -0.7713 1.9238 1.4035 +# 650 vertices + +vn 0.1897 0.9817 0.0189 +vn 0.1879 0.9808 -0.0518 +vn 0.1265 0.9920 -0.0050 +vn 0.1374 0.9905 0.0019 +vn 0.2219 0.9750 0.0071 +vn 0.1054 0.9930 0.0527 +vn 0.2007 0.9790 0.0357 +vn 0.0894 0.9916 0.0933 +vn 0.1729 0.9798 0.1011 +vn 0.0724 0.9871 0.1429 +vn 0.2567 0.9665 0.0029 +vn 0.3087 0.9323 -0.1887 +vn 0.2621 0.9647 0.0243 +vn 0.2892 0.9572 0.0127 +vn 0.3020 0.9503 0.0756 +vn 0.3741 0.9149 -0.1518 +vn 0.4099 0.8427 -0.3492 +vn 0.2960 0.9550 0.0201 +vn 0.3196 0.9465 0.0448 +vn 0.3368 0.9382 0.0797 +vn 0.4385 0.8506 -0.2903 +vn 0.4659 0.7566 -0.4587 +vn 0.3907 0.9156 -0.0952 +vn 0.3723 0.9278 0.0243 +vn 0.3366 0.9372 0.0916 +vn 0.1364 0.9901 -0.0333 +vn -0.0168 0.9996 -0.0228 +vn -0.0073 0.9999 -0.0084 +vn 0.1008 0.9874 0.1223 +vn 0.0949 0.9814 0.1670 +vn 0.0892 0.9834 0.1579 +vn 0.3340 0.9331 0.1337 +vn 0.3281 0.9330 0.1477 +vn 0.3779 0.9248 0.0434 +vn 0.4985 0.6836 -0.5332 +vn 0.4842 0.5890 -0.6470 +vn 0.4400 0.7230 -0.5325 +vn 0.0008 0.9985 0.0547 +vn 0.1658 0.9684 0.1865 +vn 0.4344 0.8998 -0.0410 +vn 0.4357 0.7469 -0.5023 +vn 0.0339 0.9975 0.0620 +vn 0.2627 0.9448 0.1957 +vn 0.4457 0.8892 -0.1037 +vn 0.3354 0.8827 -0.3292 +vn 0.0588 0.9945 0.0871 +vn 0.3413 0.9311 0.1290 +vn 0.4640 0.8097 -0.3593 +vn 0.2797 0.9378 -0.2058 +vn 0.2304 0.9378 0.2598 +vn 0.2068 0.9512 0.2291 +vn 0.0944 0.9700 0.2240 +vn 0.0786 0.9535 0.2909 +vn 0.2237 0.9248 0.3078 +vn 0.0811 0.9369 0.3400 +vn 0.2016 0.8951 0.3976 +vn 0.1103 0.9102 0.3992 +vn 0.1746 0.8809 0.4400 +vn 0.1341 0.8830 0.4499 +vn 0.2792 0.9193 0.2775 +vn 0.2604 0.9293 0.2620 +vn 0.3197 0.9069 0.2744 +vn 0.3316 0.8958 0.2958 +vn 0.2874 0.8833 0.3703 +vn 0.2673 0.9135 0.3066 +vn 0.2908 0.9309 0.2212 +vn 0.2787 0.8987 0.3386 +vn 0.2912 0.8933 0.3424 +vn 0.3350 0.8721 0.3567 +vn 0.3205 0.9119 0.2565 +vn 0.3381 0.9261 0.1673 +vn 0.2980 0.9024 0.3113 +vn 0.2866 0.8928 0.3475 +vn 0.3076 0.8608 0.4054 +vn 0.0315 0.9676 0.2504 +vn 0.0568 0.8798 0.4719 +vn 0.0617 0.8481 0.5263 +vn 0.1057 0.8422 0.5287 +vn 0.3532 0.8065 0.4742 +vn 0.3476 0.7944 0.4981 +vn 0.3320 0.8463 0.4167 +vn 0.3405 0.9229 0.1797 +vn 0.0272 0.9578 0.2862 +vn 0.1548 0.8459 0.5104 +vn 0.3159 0.8827 0.3479 +vn 0.0399 0.9457 0.3226 +vn 0.2570 0.8336 0.4890 +vn 0.3199 0.9017 0.2910 +vn 0.0533 0.9174 0.3943 +vn 0.3635 0.8191 0.4437 +vn 0.3448 0.9112 0.2255 +vn 0.1878 0.7654 0.6156 +vn 0.1752 0.7894 0.5883 +vn 0.1180 0.8019 0.5857 +vn 0.0931 0.7731 0.6274 +vn 0.1858 0.7021 0.6874 +vn 0.0539 0.7319 0.6793 +vn 0.1975 0.5609 0.8040 +vn 0.1025 0.6212 0.7769 +vn 0.2611 0.4393 0.8596 +vn 0.1807 0.4894 0.8531 +vn 0.2746 0.7350 0.6199 +vn 0.2259 0.7604 0.6089 +vn 0.3039 0.6547 0.6921 +vn 0.3488 0.4948 0.7960 +vn 0.3431 0.3977 0.8509 +vn 0.3179 0.6980 0.6417 +vn 0.3114 0.7425 0.5931 +vn 0.3824 0.6090 0.6949 +vn 0.3822 0.4642 0.7990 +vn 0.3697 0.3973 0.8399 +vn 0.3140 0.6758 0.6669 +vn 0.3707 0.7405 0.5606 +vn 0.4009 0.5879 0.7026 +vn 0.3881 0.4717 0.7918 +vn 0.3527 0.3975 0.8471 +vn 0.0610 0.8011 0.5953 +vn 0.1323 0.5207 0.8434 +vn 0.1004 0.3443 0.9335 +vn 0.2084 0.3422 0.9162 +vn 0.3654 0.3156 0.8757 +vn 0.3917 0.3165 0.8639 +vn 0.3836 0.3937 0.8354 +vn 0.3918 0.7412 0.5451 +vn 0.0679 0.7687 0.6360 +vn 0.2781 0.3134 0.9080 +vn 0.3798 0.4901 0.7845 +vn 0.0329 0.7328 0.6796 +vn 0.3130 0.2880 0.9051 +vn 0.3462 0.5992 0.7219 +vn 0.0369 0.6461 0.7624 +vn 0.3381 0.2996 0.8921 +vn 0.3269 0.6811 0.6552 +vn 0.3305 0.1298 0.9348 +vn 0.2897 0.1879 0.9385 +vn 0.2537 0.2163 0.9428 +vn 0.2260 0.1266 0.9659 +vn 0.3198 0.0660 0.9452 +vn 0.2465 0.0675 0.9668 +vn 0.2786 -0.0304 0.9599 +vn 0.2380 -0.0307 0.9708 +vn 0.2643 -0.0983 0.9594 +vn 0.1805 -0.1216 0.9760 +vn 0.3363 0.1061 0.9358 +vn 0.3021 0.1563 0.9404 +vn 0.3268 0.0849 0.9413 +vn 0.2616 -0.0007 0.9652 +vn 0.2464 -0.0693 0.9667 +vn 0.3382 0.0906 0.9367 +vn 0.2818 0.1356 0.9498 +vn 0.3496 0.1005 0.9315 +vn 0.2702 0.0198 0.9626 +vn 0.2172 -0.0607 0.9742 +vn 0.2982 0.0486 0.9533 +vn 0.2870 0.1377 0.9480 +vn 0.3967 0.0806 0.9144 +vn 0.3638 -0.0078 0.9315 +vn 0.2939 -0.1593 0.9425 +vn 0.1408 0.2285 0.9633 +vn 0.0438 -0.1526 0.9873 +vn -0.0144 -0.2069 0.9783 +vn -0.0002 -0.1888 0.9820 +vn 0.3620 -0.1913 0.9124 +vn 0.2512 -0.4613 -0.8509 +vn 0.3318 -0.1208 0.9356 +vn 0.3320 0.1670 0.9284 +vn 0.0983 0.1302 0.9866 +vn 0.0465 -0.1349 0.9898 +vn 0.4121 0.0352 0.9105 +vn 0.1144 0.0706 0.9909 +vn 0.1000 -0.0749 0.9922 +vn 0.3994 0.0369 0.9160 +vn 0.1286 -0.0329 0.9912 +vn 0.1800 -0.0424 0.9828 +vn 0.2944 0.0270 0.9553 +vn -0.3530 0.9095 -0.2196 +vn -0.3954 0.8831 -0.2525 +vn -0.4765 0.7734 -0.4182 +vn -0.3741 0.8557 -0.3575 +vn -0.2986 0.9223 -0.2454 +vn -0.3645 0.8925 -0.2655 +vn -0.3311 0.9314 -0.1515 +vn -0.3726 0.9157 -0.1509 +vn -0.3536 0.9353 0.0136 +vn -0.3445 0.9377 -0.0453 +vn -0.3050 0.9443 -0.1240 +vn -0.3070 0.9381 -0.1604 +vn -0.2550 0.9516 -0.1715 +vn -0.2047 0.9675 -0.1483 +vn -0.2185 0.9756 0.0205 +vn -0.2428 0.9641 -0.1076 +vn -0.2754 0.9564 -0.0971 +vn -0.2118 0.9737 -0.0842 +vn -0.1329 0.9891 -0.0639 +vn -0.0842 0.9949 0.0546 +vn -0.1324 0.9907 -0.0298 +vn -0.1836 0.9819 -0.0469 +vn -0.0590 0.9983 -0.0032 +vn -0.0045 0.9995 0.0297 +vn 0.0414 0.9951 0.0897 +vn -0.4907 0.7608 -0.4248 +vn -0.5208 0.6331 -0.5727 +vn -0.4220 0.7711 -0.4768 +vn -0.3625 0.9295 -0.0682 +vn -0.3224 0.9459 0.0368 +vn -0.2988 0.9524 0.0600 +vn 0.0333 0.9777 0.2074 +vn -0.1851 0.9804 -0.0678 +vn -0.3514 0.8637 -0.3612 +vn -0.2837 0.9490 0.1378 +vn -0.2960 0.9527 -0.0695 +vn -0.3785 0.8911 -0.2505 +vn -0.2441 0.9490 0.1993 +vn -0.3312 0.9340 -0.1342 +vn -0.3548 0.9247 -0.1380 +vn -0.0910 0.9718 0.2175 +vn -0.4000 0.8790 -0.2596 +vn -0.2033 0.9471 0.2482 +vn -0.2238 0.9480 0.2261 +vn -0.2360 0.9522 0.1941 +vn -0.2009 0.9488 0.2436 +vn -0.2051 0.9476 0.2449 +vn -0.2295 0.9359 0.2673 +vn -0.2381 0.9242 0.2986 +vn -0.2751 0.9053 0.3237 +vn -0.2876 0.8514 0.4386 +vn -0.3373 0.8199 0.4626 +vn -0.1973 0.9429 0.2683 +vn -0.2135 0.9408 0.2632 +vn -0.1754 0.9509 0.2552 +vn -0.1395 0.9467 0.2904 +vn -0.1188 0.9182 0.3779 +vn -0.1497 0.9458 0.2880 +vn -0.1118 0.9526 0.2831 +vn -0.1335 0.9473 0.2912 +vn -0.0829 0.9360 0.3422 +vn 0.0109 0.9203 0.3911 +vn -0.0329 0.9599 0.2783 +vn -0.0138 0.9611 0.2760 +vn -0.0543 0.9460 0.3195 +vn -0.0283 0.9200 0.3908 +vn 0.0111 0.8840 0.4673 +vn -0.2231 0.9622 0.1560 +vn -0.3546 0.8101 0.4669 +vn -0.3519 0.7467 0.5645 +vn -0.3441 0.7464 0.5696 +vn 0.0696 0.8556 0.5130 +vn -0.2193 0.9432 0.2496 +vn -0.3231 0.7550 0.5707 +vn -0.2519 0.9238 0.2883 +vn -0.1743 0.8247 0.5380 +vn -0.2923 0.8934 0.3411 +vn 0.0620 0.8794 0.4720 +vn -0.2729 0.7443 0.6095 +vn -0.2999 0.7456 0.5951 +vn -0.3680 0.7162 0.5929 +vn -0.3911 0.7069 0.5893 +vn -0.2481 0.6723 0.6975 +vn -0.3665 0.6290 0.6856 +vn -0.2683 0.5563 0.7865 +vn -0.3656 0.4844 0.7948 +vn -0.3435 0.4033 0.8482 +vn -0.4301 0.3528 0.8310 +vn -0.1603 0.7500 0.6418 +vn -0.2229 0.7371 0.6379 +vn -0.1314 0.7059 0.6960 +vn -0.1789 0.6093 0.7725 +vn -0.2346 0.4643 0.8540 +vn -0.0569 0.7389 0.6715 +vn 0.0130 0.7969 0.6040 +vn -0.0488 0.7181 0.6943 +vn -0.0986 0.6423 0.7601 +vn -0.1516 0.4762 0.8662 +vn 0.0672 0.7600 0.6465 +vn 0.1070 0.8082 0.5792 +vn 0.0243 0.7267 0.6866 +vn -0.0121 0.6594 0.7517 +vn 0.0067 0.5047 0.8632 +vn -0.3957 0.6860 0.6106 +vn -0.4497 0.3367 0.8273 +vn -0.4013 0.3434 0.8491 +vn -0.3672 0.3307 0.8694 +vn -0.0039 0.3419 0.9397 +vn -0.4024 0.7060 0.5827 +vn -0.2851 0.3389 0.8966 +vn -0.4318 0.5978 0.6754 +vn -0.2298 0.3338 0.9142 +vn -0.4088 0.4490 0.7946 +vn -0.1189 0.3452 0.9310 +vn -0.2474 0.0295 0.9685 +vn -0.2751 0.2295 0.9336 +vn -0.3472 0.2084 0.9143 +vn -0.3143 0.0188 0.9491 +vn -0.2511 -0.0645 0.9658 +vn -0.3127 -0.0994 0.9446 +vn -0.2484 -0.0769 0.9656 +vn -0.2790 -0.0851 0.9565 +vn -0.2492 -0.1630 0.9546 +vn -0.1793 -0.0684 0.9814 +vn -0.1624 0.0689 0.9843 +vn -0.1916 0.2430 0.9509 +vn -0.2210 -0.0478 0.9741 +vn -0.1733 -0.0514 0.9835 +vn -0.1922 -0.1539 0.9692 +vn -0.0691 0.0942 0.9932 +vn -0.1084 0.2272 0.9678 +vn -0.1417 -0.0140 0.9898 +vn -0.1367 -0.0575 0.9889 +vn -0.1232 -0.1550 0.9802 +vn 0.0370 0.1212 0.9919 +vn 0.0355 0.2335 0.9717 +vn -0.0384 0.0421 0.9984 +vn -0.0304 -0.0446 0.9985 +vn -0.0510 -0.1586 0.9860 +vn -0.3551 0.2390 0.9037 +vn -0.0392 0.0729 0.9966 +vn 0.1098 0.1890 0.9758 +vn -0.0237 0.0578 0.9980 +vn 0.0178 -0.1840 0.9828 +vn -0.3352 0.0530 0.9407 +vn -0.0054 -0.0024 1.0000 +vn -0.3556 -0.1652 0.9199 +vn 0.0035 -0.0720 0.9974 +vn -0.2386 0.0250 0.9708 +vn 0.0322 -0.1382 0.9899 +vn -0.1283 -0.9917 0.0066 +vn -0.1945 -0.9793 0.0569 +vn -0.1954 -0.9807 -0.0118 +vn -0.1341 -0.9910 -0.0005 +vn -0.2213 -0.9751 -0.0108 +vn -0.1050 -0.9931 -0.0527 +vn -0.1992 -0.9791 -0.0399 +vn -0.0864 -0.9915 -0.0971 +vn -0.1707 -0.9802 -0.1008 +vn -0.0708 -0.9871 -0.1436 +vn -0.3126 -0.9309 0.1889 +vn -0.2689 -0.9631 0.0147 +vn -0.2644 -0.9643 -0.0179 +vn -0.2806 -0.9597 -0.0128 +vn -0.2954 -0.9522 -0.0782 +vn -0.4086 -0.8537 0.3229 +vn -0.3626 -0.9220 0.1360 +vn -0.2987 -0.9543 0.0029 +vn -0.3140 -0.9486 -0.0392 +vn -0.3336 -0.9389 -0.0850 +vn -0.4758 -0.7439 0.4693 +vn -0.4321 -0.8543 0.2891 +vn -0.3855 -0.9183 0.0899 +vn -0.3799 -0.9248 -0.0177 +vn -0.3436 -0.9346 -0.0920 +vn 0.0099 -0.9996 0.0258 +vn -0.1350 -0.9903 0.0332 +vn 0.0044 -1.0000 0.0051 +vn -0.0820 -0.9846 -0.1543 +vn -0.0910 -0.9817 -0.1674 +vn -0.1020 -0.9870 -0.1240 +vn -0.3297 -0.9338 -0.1389 +vn -0.3303 -0.9340 -0.1366 +vn -0.3912 -0.9198 -0.0311 +vn -0.4553 -0.7181 0.5264 +vn -0.4975 -0.5955 0.6307 +vn -0.5059 -0.6781 0.5331 +vn -0.0045 -0.9985 -0.0544 +vn -0.1664 -0.9698 -0.1786 +vn -0.4431 -0.8957 0.0379 +vn -0.4213 -0.7797 0.4632 +vn -0.0316 -0.9975 -0.0638 +vn -0.2642 -0.9449 -0.1935 +vn -0.4437 -0.8906 0.1000 +vn -0.3284 -0.8909 0.3139 +vn -0.0597 -0.9941 -0.0902 +vn -0.3376 -0.9319 -0.1326 +vn -0.4754 -0.7904 0.3863 +vn -0.2693 -0.9414 0.2030 +vn -0.0892 -0.9725 -0.2153 +vn -0.2072 -0.9505 -0.2315 +vn -0.2416 -0.9368 -0.2530 +vn -0.0825 -0.9546 -0.2863 +vn -0.2271 -0.9259 -0.3018 +vn -0.0836 -0.9350 -0.3446 +vn -0.1996 -0.8959 -0.3970 +vn -0.1114 -0.9088 -0.4020 +vn -0.1728 -0.8831 -0.4361 +vn -0.1254 -0.8826 -0.4531 +vn -0.2639 -0.9285 -0.2611 +vn -0.2741 -0.9191 -0.2831 +vn -0.3247 -0.9093 -0.2604 +vn -0.3362 -0.8944 -0.2950 +vn -0.2966 -0.8817 -0.3669 +vn -0.2918 -0.9325 -0.2130 +vn -0.2618 -0.9146 -0.3081 +vn -0.2754 -0.8986 -0.3416 +vn -0.2968 -0.8913 -0.3427 +vn -0.3368 -0.8696 -0.3611 +vn -0.3349 -0.9279 -0.1638 +vn -0.3183 -0.9137 -0.2526 +vn -0.2963 -0.9023 -0.3130 +vn -0.2867 -0.8906 -0.3530 +vn -0.3098 -0.8586 -0.4085 +vn -0.0261 -0.9707 -0.2390 +vn -0.0978 -0.8426 -0.5296 +vn -0.0627 -0.8470 -0.5278 +vn -0.0571 -0.8791 -0.4732 +vn -0.3359 -0.7950 -0.5052 +vn -0.3521 -0.8061 -0.4756 +vn -0.3422 -0.8444 -0.4122 +vn -0.3362 -0.9257 -0.1732 +vn -0.0258 -0.9610 -0.2752 +vn -0.1539 -0.8446 -0.5129 +vn -0.3128 -0.8785 -0.3610 +vn -0.0409 -0.9458 -0.3223 +vn -0.2641 -0.8297 -0.4918 +vn -0.3151 -0.9011 -0.2977 +vn -0.0465 -0.9135 -0.4043 +vn -0.3743 -0.8160 -0.4406 +vn -0.3346 -0.9135 -0.2316 +vn -0.1117 -0.8019 -0.5869 +vn -0.1772 -0.7853 -0.5932 +vn -0.1940 -0.7631 -0.6165 +vn -0.1030 -0.7750 -0.6235 +vn -0.1917 -0.7014 -0.6866 +vn -0.0531 -0.7283 -0.6832 +vn -0.1982 -0.5596 -0.8048 +vn -0.1113 -0.6233 -0.7740 +vn -0.2615 -0.4411 -0.8585 +vn -0.1770 -0.4893 -0.8540 +vn -0.2326 -0.7562 -0.6116 +vn -0.2724 -0.7350 -0.6210 +vn -0.3029 -0.6575 -0.6898 +vn -0.3382 -0.4973 -0.7990 +vn -0.3436 -0.3980 -0.8506 +vn -0.3063 -0.7432 -0.5949 +vn -0.3134 -0.6989 -0.6429 +vn -0.3867 -0.6112 -0.6906 +vn -0.3797 -0.4654 -0.7995 +vn -0.3634 -0.3950 -0.8437 +vn -0.3733 -0.7434 -0.5550 +vn -0.3080 -0.6762 -0.6692 +vn -0.3949 -0.5904 -0.7039 +vn -0.3953 -0.4735 -0.7871 +vn -0.3558 -0.3948 -0.8471 +vn -0.0725 -0.8051 -0.5887 +vn -0.2096 -0.3449 -0.9149 +vn -0.1017 -0.3487 -0.9317 +vn -0.1331 -0.5177 -0.8451 +vn -0.3972 -0.3139 -0.8624 +vn -0.3645 -0.3145 -0.8765 +vn -0.3956 -0.3882 -0.8323 +vn -0.3960 -0.7445 -0.5374 +vn -0.0722 -0.7680 -0.6363 +vn -0.2766 -0.3161 -0.9075 +vn -0.3831 -0.4913 -0.7822 +vn -0.0243 -0.7301 -0.6829 +vn -0.3138 -0.2914 -0.9037 +vn -0.3244 -0.6036 -0.7283 +vn -0.0468 -0.6493 -0.7591 +vn -0.3359 -0.2983 -0.8934 +vn -0.3273 -0.6847 -0.6512 +vn -0.2608 -0.2164 -0.9408 +vn -0.2952 -0.1915 -0.9361 +vn -0.3332 -0.1265 -0.9343 +vn -0.2321 -0.1219 -0.9650 +vn -0.3263 -0.0712 -0.9426 +vn -0.2469 -0.0725 -0.9663 +vn -0.2845 0.0379 -0.9579 +vn -0.2260 0.0412 -0.9733 +vn -0.2571 0.1152 -0.9595 +vn -0.1703 0.1337 -0.9763 +vn -0.3023 -0.1548 -0.9406 +vn -0.3404 -0.1052 -0.9344 +vn -0.3243 -0.0884 -0.9418 +vn -0.2715 0.0047 -0.9624 +vn -0.2524 0.0795 -0.9643 +vn -0.2873 -0.1333 -0.9485 +vn -0.3430 -0.0916 -0.9349 +vn -0.3456 -0.1051 -0.9325 +vn -0.2684 -0.0128 -0.9632 +vn -0.2146 0.0626 -0.9747 +vn -0.2860 -0.1338 -0.9489 +vn -0.3011 -0.0498 -0.9523 +vn -0.4020 -0.0891 -0.9113 +vn -0.3552 0.0072 -0.9348 +vn -0.2669 0.1300 -0.9549 +vn -0.1389 -0.2242 -0.9646 +vn -0.0488 0.1715 -0.9840 +vn -0.0221 0.1866 -0.9822 +vn -0.0735 0.1516 -0.9857 +vn -0.6462 0.7630 0.0139 +vn -0.2792 0.1114 -0.9537 +vn -0.2927 0.0975 -0.9512 +vn -0.3329 -0.1638 -0.9286 +vn -0.1027 -0.1257 -0.9867 +vn -0.0816 0.1333 -0.9877 +vn -0.4009 -0.0496 -0.9148 +vn -0.1136 -0.0721 -0.9909 +vn -0.0830 0.0723 -0.9939 +vn -0.4100 -0.0446 -0.9110 +vn -0.1193 0.0494 -0.9916 +vn -0.1074 0.0014 -0.9942 +vn -0.2940 -0.0268 -0.9554 +vn 0.4741 -0.7787 0.4110 +vn 0.4031 -0.8801 0.2511 +vn 0.3496 -0.9080 0.2309 +vn 0.3698 -0.8562 0.3607 +vn 0.3020 -0.9224 0.2406 +vn 0.3664 -0.8941 0.2574 +vn 0.3354 -0.9309 0.1448 +vn 0.3657 -0.9198 0.1424 +vn 0.3561 -0.9342 -0.0200 +vn 0.3360 -0.9410 0.0411 +vn 0.3028 -0.9397 0.1592 +vn 0.3008 -0.9446 0.1317 +vn 0.2485 -0.9516 0.1806 +vn 0.2080 -0.9673 0.1451 +vn 0.2254 -0.9738 -0.0299 +vn 0.2737 -0.9568 0.0981 +vn 0.2381 -0.9649 0.1108 +vn 0.2049 -0.9746 0.0900 +vn 0.1260 -0.9902 0.0607 +vn 0.0805 -0.9949 -0.0606 +vn 0.1878 -0.9812 0.0445 +vn 0.1301 -0.9910 0.0304 +vn 0.0597 -0.9982 0.0042 +vn -0.0040 -0.9996 -0.0267 +vn -0.0411 -0.9943 -0.0982 +vn 0.5213 -0.6636 0.5365 +vn 0.4977 -0.7613 0.4156 +vn 0.4234 -0.7715 0.4749 +vn 0.2904 -0.9549 -0.0619 +vn 0.3070 -0.9509 -0.0389 +vn 0.3518 -0.9342 0.0597 +vn -0.0356 -0.9766 -0.2119 +vn 0.1852 -0.9796 0.0774 +vn 0.3583 -0.8578 0.3686 +vn 0.2824 -0.9491 -0.1398 +vn 0.3052 -0.9498 0.0694 +vn 0.3739 -0.8946 0.2448 +vn 0.2498 -0.9452 -0.2105 +vn 0.3215 -0.9363 0.1414 +vn 0.3430 -0.9294 0.1359 +vn 0.0880 -0.9707 -0.2236 +vn 0.4009 -0.8756 0.2694 +vn 0.2270 -0.9554 -0.1888 +vn 0.2184 -0.9506 -0.2206 +vn 0.1951 -0.9482 -0.2508 +vn 0.2004 -0.9477 -0.2484 +vn 0.1989 -0.9501 -0.2403 +vn 0.2287 -0.9375 -0.2624 +vn 0.2381 -0.9246 -0.2972 +vn 0.2707 -0.9073 -0.3218 +vn 0.2920 -0.8468 -0.4445 +vn 0.3436 -0.8090 -0.4769 +vn 0.2094 -0.9422 -0.2615 +vn 0.1943 -0.9433 -0.2690 +vn 0.1691 -0.9524 -0.2538 +vn 0.1306 -0.9535 -0.2716 +vn 0.1264 -0.9184 -0.3749 +vn 0.1130 -0.9531 -0.2808 +vn 0.1523 -0.9470 -0.2828 +vn 0.1410 -0.9441 -0.2978 +vn 0.0756 -0.9411 -0.3297 +vn -0.0239 -0.9265 -0.3755 +vn 0.0138 -0.9635 -0.2672 +vn 0.0403 -0.9614 -0.2723 +vn 0.0628 -0.9435 -0.3253 +vn 0.0373 -0.9178 -0.3953 +vn -0.0233 -0.8898 -0.4557 +vn 0.2165 -0.9633 -0.1586 +vn 0.3468 -0.7437 -0.5716 +vn 0.3568 -0.7465 -0.5616 +vn 0.3721 -0.7948 -0.4794 +vn -0.0879 -0.8576 -0.5068 +vn 0.2218 -0.9401 -0.2587 +vn 0.3286 -0.7505 -0.5734 +vn 0.2466 -0.9282 -0.2785 +vn 0.1878 -0.8171 -0.5451 +vn 0.2984 -0.8920 -0.3395 +vn -0.0712 -0.8793 -0.4710 +vn 0.3656 -0.7133 -0.5980 +vn 0.2979 -0.7446 -0.5973 +vn 0.2849 -0.7332 -0.6175 +vn 0.3859 -0.7055 -0.5945 +vn 0.2388 -0.6786 -0.6946 +vn 0.3565 -0.6390 -0.6816 +vn 0.2645 -0.5599 -0.7852 +vn 0.3595 -0.4851 -0.7971 +vn 0.3436 -0.4050 -0.8473 +vn 0.4293 -0.3512 -0.8321 +vn 0.2344 -0.7271 -0.6453 +vn 0.1670 -0.7432 -0.6479 +vn 0.1321 -0.7060 -0.6958 +vn 0.1831 -0.6120 -0.7693 +vn 0.2399 -0.4567 -0.8567 +vn -0.0046 -0.7907 -0.6122 +vn 0.0697 -0.7294 -0.6805 +vn 0.0547 -0.7178 -0.6941 +vn 0.1135 -0.6431 -0.7573 +vn 0.1593 -0.4762 -0.8648 +vn -0.1221 -0.8095 -0.5744 +vn -0.0626 -0.7534 -0.6545 +vn -0.0180 -0.7262 -0.6872 +vn 0.0189 -0.6603 -0.7507 +vn -0.0041 -0.4989 -0.8666 +vn 0.3890 -0.6881 -0.6125 +vn 0.3759 -0.3245 -0.8680 +vn 0.4130 -0.3300 -0.8488 +vn 0.4453 -0.3348 -0.8304 +vn 0.0206 -0.3419 -0.9395 +vn 0.3895 -0.7103 -0.5864 +vn 0.2857 -0.3357 -0.8976 +vn 0.4298 -0.6010 -0.6738 +vn 0.2202 -0.3331 -0.9168 +vn 0.4038 -0.4494 -0.7969 +vn 0.1354 -0.3387 -0.9311 +vn 0.3487 -0.2153 -0.9122 +vn 0.2736 -0.2306 -0.9338 +vn 0.2375 -0.0451 -0.9703 +vn 0.3173 -0.0230 -0.9480 +vn 0.2590 0.0747 -0.9630 +vn 0.3295 0.1078 -0.9380 +vn 0.2479 0.0894 -0.9647 +vn 0.2786 0.0864 -0.9565 +vn 0.2459 0.1582 -0.9563 +vn 0.1290 0.0269 -0.9913 +vn 0.1888 -0.2436 -0.9513 +vn 0.1663 -0.0724 -0.9834 +vn 0.1943 0.0291 -0.9805 +vn 0.1974 0.0703 -0.9778 +vn 0.2107 0.1673 -0.9631 +vn 0.1265 -0.2313 -0.9646 +vn 0.0779 -0.0961 -0.9923 +vn 0.1580 0.0134 -0.9873 +vn 0.1445 0.0568 -0.9879 +vn 0.1358 0.1602 -0.9777 +vn -0.0051 -0.2280 -0.9736 +vn -0.0320 -0.1225 -0.9920 +vn 0.0569 -0.0371 -0.9977 +vn 0.0372 0.0516 -0.9980 +vn 0.0360 0.1609 -0.9863 +vn 0.3672 -0.2410 -0.8984 +vn -0.0874 -0.1733 -0.9810 +vn -0.5437 -0.6034 -0.5834 +vn -0.0314 -0.1453 -0.9889 +vn -0.0166 0.1740 -0.9846 +vn 0.3497 -0.0521 -0.9354 +vn -0.0299 -0.0464 -0.9985 +vn 0.3448 0.1471 -0.9271 +vn 0.0148 0.0746 -0.9971 +vn 0.2892 0.0255 -0.9569 +vn -0.0108 0.1302 -0.9914 +vn 0.0055 0.1432 0.9897 +vn 0.0652 0.0852 0.9942 +vn 0.0598 0.0974 0.9934 +vn -0.0045 0.1591 0.9873 +vn -0.8324 0.3243 0.4493 +vn -0.8567 0.3590 0.3704 +vn -0.8572 0.3523 0.3757 +vn -0.8330 0.3175 0.4531 +vn -0.4343 0.7646 0.4763 +vn -0.3247 0.7824 0.5315 +vn -0.3275 0.7759 0.5392 +vn -0.4244 0.7427 0.5179 +vn 0.3094 0.5112 0.8018 +vn 0.3025 0.4947 0.8147 +vn 0.3033 0.5038 0.8088 +vn 0.3103 0.5145 0.7994 +vn -0.8354 0.4172 0.3579 +vn -0.8401 0.4090 0.3563 +vn 0.2038 0.4758 0.8556 +vn 0.2076 0.5028 0.8391 +vn -0.7306 0.4622 0.5026 +vn -0.7381 0.4448 0.5072 +vn 0.0513 0.3555 0.9333 +vn 0.0574 0.4046 0.9127 +vn -0.5964 0.5982 0.5352 +vn -0.6048 0.5675 0.5587 +vn -0.0084 0.1869 0.9823 +vn -0.0113 0.2217 0.9751 +vn -0.9041 0.3941 0.1652 +vn -0.9138 0.3429 0.2175 +vn -0.9146 0.3430 0.2143 +vn -0.9018 0.3985 0.1668 +vn -0.8327 0.2542 0.4919 +vn -0.8316 0.2567 0.4924 +vn -0.8830 0.3427 0.3206 +vn -0.8841 0.3409 0.3194 +vn -0.8542 0.2950 0.4282 +vn -0.8546 0.2855 0.4339 +vn -0.7922 0.3292 0.5138 +vn -0.7927 0.3303 0.5124 +vn -0.8895 0.4196 0.1809 +vn -0.9051 0.3862 0.1777 +vn -0.9059 0.3850 0.1768 +vn -0.8901 0.4179 0.1818 +vn -0.8641 0.4625 0.1985 +vn -0.8641 0.4633 0.1966 +vn -0.8793 0.4303 0.2039 +vn -0.8784 0.4309 0.2069 +vn -0.9164 0.3934 0.0744 +vn -0.9153 0.3953 0.0771 +vn -0.9025 0.4182 0.1029 +vn -0.9042 0.4157 0.0978 +vn -0.0334 0.9247 0.3792 +vn -0.1592 0.9222 0.3524 +vn -0.1186 0.9190 0.3761 +vn -0.0484 0.9289 0.3671 +vn -0.4686 0.7730 0.4277 +vn -0.5491 0.7773 0.3070 +vn -0.5456 0.7761 0.3162 +vn -0.5059 0.7583 0.4110 +vn -0.5690 0.7411 0.3564 +vn -0.6283 0.7081 0.3223 +vn -0.8856 0.4341 0.1649 +vn -0.8828 0.4365 0.1739 +vn -0.2867 0.9102 0.2990 +vn -0.2324 0.9143 0.3317 +vn -0.6332 0.7078 0.3131 +vn -0.6345 0.7026 0.3221 +vn -0.4345 0.8562 0.2796 +vn -0.4131 0.8626 0.2920 +vn -0.7497 0.6255 0.2161 +vn -0.7483 0.6254 0.2210 +vn -0.5398 0.7870 0.2987 +vn -0.5544 0.7796 0.2911 +vn -0.7762 0.5454 0.3164 +vn -0.7658 0.5595 0.3172 +vn 0.4043 0.7485 0.5257 +vn 0.4925 0.6348 0.5955 +vn 0.4704 0.6585 0.5874 +vn 0.3793 0.7721 0.5099 +vn -0.2668 0.5594 0.7848 +vn -0.4808 0.6194 0.6206 +vn -0.4413 0.6037 0.6639 +vn -0.2369 0.5313 0.8134 +vn 0.8636 0.3669 0.3457 +vn 0.9287 0.2314 0.2899 +vn 0.9272 0.2361 0.2907 +vn 0.8569 0.3786 0.3499 +vn 0.0667 0.0704 0.9953 +vn 0.0697 0.0636 0.9955 +vn 0.6341 0.4825 0.6043 +vn 0.6269 0.5073 0.5913 +vn -0.0100 0.1587 0.9873 +vn 0.0121 0.1333 0.9910 +vn 0.7746 0.3192 0.5459 +vn 0.7706 0.3284 0.5462 +vn -0.0387 0.3098 0.9500 +vn -0.0024 0.2878 0.9577 +vn 0.8041 0.3726 0.4633 +vn 0.8023 0.3687 0.4694 +vn -0.0458 0.4252 0.9039 +vn -0.0113 0.3982 0.9172 +vn 0.8867 0.2906 0.3597 +vn 0.8899 0.2912 0.3512 +vn 0.8889 0.3130 0.3345 +vn 0.9161 0.3659 0.1642 +vn 0.9160 0.3690 0.1577 +vn 0.8898 0.3100 0.3349 +vn 0.9089 0.2358 0.3440 +vn 0.9049 0.2436 0.3489 +vn 0.9346 0.1889 0.3013 +vn 0.9333 0.1905 0.3044 +vn 0.9177 0.2175 0.3325 +vn 0.9204 0.2113 0.3288 +vn 0.8752 0.4550 0.1644 +vn 0.8770 0.4520 0.1627 +vn 0.8302 0.4720 0.2966 +vn 0.7938 0.5190 0.3170 +vn 0.7957 0.5146 0.3195 +vn 0.8335 0.4698 0.2907 +vn 0.8832 0.4178 0.2128 +vn 0.8831 0.4186 0.2120 +vn 0.8858 0.4084 0.2202 +vn 0.8856 0.4088 0.2205 +vn 0.8855 0.4156 0.2076 +vn 0.8870 0.4147 0.2030 +vn 0.8009 0.5427 0.2530 +vn 0.8011 0.5405 0.2571 +vn 0.7540 0.6376 0.1577 +vn 0.6176 0.7558 -0.2177 +vn 0.5203 0.8038 -0.2885 +vn 0.7516 0.6292 0.1982 +vn 0.5907 0.8020 0.0887 +vn 0.4745 0.8793 -0.0411 +vn 0.0938 0.9367 0.3373 +vn 0.0582 0.9479 0.3131 +vn 0.7808 0.5784 0.2362 +vn 0.7813 0.5803 0.2299 +vn 0.4634 0.8668 0.1842 +vn 0.4222 0.8968 0.1326 +vn 0.7156 0.6146 0.3319 +vn 0.7186 0.6148 0.3251 +vn 0.3749 0.8912 0.2554 +vn 0.3575 0.9048 0.2315 +vn 0.7113 0.6207 0.3297 +vn 0.7049 0.6231 0.3390 +vn 0.2396 0.9281 0.2849 +vn 0.2324 0.9327 0.2758 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_08 +s 1 +f 5201/2601/6385 5202/2602/6386 5203/2603/6387 5204/2604/6388 +f 5205/2605/6389 5201/2601/6385 5204/2604/6388 5206/2606/6390 +f 5207/2607/6391 5205/2605/6389 5206/2606/6390 5208/2608/6392 +f 5209/2609/6393 5207/2607/6391 5208/2608/6392 5210/2610/6394 +f 5211/2611/6395 5212/2612/6396 5202/2602/6386 5201/2601/6385 +f 5213/2613/6397 5211/2611/6395 5201/2601/6385 5205/2605/6389 +f 5214/2614/6398 5213/2613/6397 5205/2605/6389 5207/2607/6391 +f 5215/2615/6399 5214/2614/6398 5207/2607/6391 5209/2609/6393 +f 5216/2616/6400 5217/2617/6401 5212/2612/6396 5211/2611/6395 +f 5218/2618/6402 5216/2616/6400 5211/2611/6395 5213/2613/6397 +f 5219/2619/6403 5218/2618/6402 5213/2613/6397 5214/2614/6398 +f 5220/2620/6404 5219/2619/6403 5214/2614/6398 5215/2615/6399 +f 5221/2621/6405 5222/2622/6406 5217/2617/6401 5216/2616/6400 +f 5223/2623/6407 5221/2621/6405 5216/2616/6400 5218/2618/6402 +f 5224/2624/6408 5223/2623/6407 5218/2618/6402 5219/2619/6403 +f 5225/2625/6409 5224/2624/6408 5219/2619/6403 5220/2620/6404 +f 5203/2603/6387 5226/2626/6410 5227/2627/6411 5228/2628/6412 +f 5229/2629/6413 5230/2630/6414 5231/2631/6415 5210/2610/6394 +f 5225/2625/6409 5232/2632/6416 5233/2633/6417 5234/2634/6418 +f 5235/2635/6419 5236/2636/6420 5237/2637/6421 5222/2622/6406 +f 5204/2604/6388 5203/2603/6387 5228/2628/6412 5238/2638/6422 +f 5210/2610/6394 5231/2631/6415 5239/2639/6423 5209/2609/6393 +f 5224/2624/6408 5225/2625/6409 5234/2634/6418 5240/2640/6424 +f 5222/2622/6406 5237/2637/6421 5241/2641/6425 5217/2617/6401 +f 5206/2606/6390 5204/2604/6388 5238/2638/6422 5242/2642/6426 +f 5209/2609/6393 5239/2639/6423 5243/2643/6427 5215/2615/6399 +f 5223/2623/6407 5224/2624/6408 5240/2640/6424 5244/2644/6428 +f 5217/2617/6401 5241/2641/6425 5245/2645/6429 5212/2612/6396 +f 5208/2608/6392 5206/2606/6390 5242/2642/6426 5246/2646/6430 +f 5215/2615/6399 5243/2643/6427 5247/2647/6431 5220/2620/6404 +f 5221/2621/6405 5223/2623/6407 5244/2644/6428 5248/2648/6432 +f 5212/2612/6396 5245/2645/6429 5249/2649/6433 5202/2602/6386 +f 5210/2610/6394 5208/2608/6392 5246/2646/6430 5229/2629/6413 +f 5220/2620/6404 5247/2647/6431 5232/2632/6416 5225/2625/6409 +f 5222/2622/6406 5221/2621/6405 5248/2648/6432 5235/2635/6419 +f 5202/2602/6386 5249/2649/6433 5226/2626/6410 5203/2603/6387 +f 5250/2650/6434 5251/2651/6435 5252/2652/6436 5253/2653/6437 +f 5254/2654/6438 5250/2650/6434 5253/2653/6437 5255/2655/6439 +f 5256/2656/6440 5254/2654/6438 5255/2655/6439 5257/2657/6441 +f 5258/2658/6442 5256/2656/6440 5257/2657/6441 5259/2659/6443 +f 5260/2660/6444 5261/2661/6445 5251/2651/6435 5250/2650/6434 +f 5262/2662/6446 5260/2660/6444 5250/2650/6434 5254/2654/6438 +f 5263/2663/6447 5262/2662/6446 5254/2654/6438 5256/2656/6440 +f 5264/2664/6448 5263/2663/6447 5256/2656/6440 5258/2658/6442 +f 5265/2665/6449 5266/2666/6450 5261/2661/6445 5260/2660/6444 +f 5267/2667/6451 5265/2665/6449 5260/2660/6444 5262/2662/6446 +f 5268/2668/6452 5267/2667/6451 5262/2662/6446 5263/2663/6447 +f 5269/2669/6453 5268/2668/6452 5263/2663/6447 5264/2664/6448 +f 5270/2670/6454 5271/2671/6455 5266/2666/6450 5265/2665/6449 +f 5272/2672/6456 5270/2670/6454 5265/2665/6449 5267/2667/6451 +f 5273/2673/6457 5272/2672/6456 5267/2667/6451 5268/2668/6452 +f 5274/2674/6458 5273/2673/6457 5268/2668/6452 5269/2669/6453 +f 5252/2652/6436 5231/2631/6415 5230/2630/6414 5275/2675/6459 +f 5276/2676/6460 5277/2677/6461 5278/2678/6462 5259/2659/6443 +f 5274/2674/6458 5279/2679/6463 5280/2680/6464 5281/2681/6465 +f 5282/2682/6466 5233/2633/6417 5232/2632/6416 5271/2671/6455 +f 5253/2653/6437 5252/2652/6436 5275/2675/6459 5283/2683/6467 +f 5259/2659/6443 5278/2678/6462 5284/2684/6468 5258/2658/6442 +f 5273/2673/6457 5274/2674/6458 5281/2681/6465 5285/2685/6469 +f 5271/2671/6455 5232/2632/6416 5247/2647/6431 5266/2666/6450 +f 5255/2655/6439 5253/2653/6437 5283/2683/6467 5286/2686/6470 +f 5258/2658/6442 5284/2684/6468 5287/2687/6471 5264/2664/6448 +f 5272/2672/6456 5273/2673/6457 5285/2685/6469 5288/2688/6472 +f 5266/2666/6450 5247/2647/6431 5243/2643/6427 5261/2661/6445 +f 5257/2657/6441 5255/2655/6439 5286/2686/6470 5289/2689/6473 +f 5264/2664/6448 5287/2687/6471 5290/2690/6474 5269/2669/6453 +f 5270/2670/6454 5272/2672/6456 5288/2688/6472 5291/2691/6475 +f 5261/2661/6445 5243/2643/6427 5239/2639/6423 5251/2651/6435 +f 5259/2659/6443 5257/2657/6441 5289/2689/6473 5276/2676/6460 +f 5269/2669/6453 5290/2690/6474 5279/2679/6463 5274/2674/6458 +f 5271/2671/6455 5270/2670/6454 5291/2691/6475 5282/2682/6466 +f 5251/2651/6435 5239/2639/6423 5231/2631/6415 5252/2652/6436 +f 5292/2692/6476 5293/2693/6477 5294/2694/6478 5295/2695/6479 +f 5296/2696/6480 5292/2692/6476 5295/2695/6479 5297/2697/6481 +f 5298/2698/6482 5296/2696/6480 5297/2697/6481 5299/2699/6483 +f 5300/2700/6484 5298/2698/6482 5299/2699/6483 5301/2701/6485 +f 5302/2702/6486 5303/2703/6487 5293/2693/6477 5292/2692/6476 +f 5304/2704/6488 5302/2702/6486 5292/2692/6476 5296/2696/6480 +f 5305/2705/6489 5304/2704/6488 5296/2696/6480 5298/2698/6482 +f 5306/2706/6490 5305/2705/6489 5298/2698/6482 5300/2700/6484 +f 5307/2707/6491 5308/2708/6492 5303/2703/6487 5302/2702/6486 +f 5309/2709/6493 5307/2707/6491 5302/2702/6486 5304/2704/6488 +f 5310/2710/6494 5309/2709/6493 5304/2704/6488 5305/2705/6489 +f 5311/2711/6495 5310/2710/6494 5305/2705/6489 5306/2706/6490 +f 5312/2712/6496 5313/2713/6497 5308/2708/6492 5307/2707/6491 +f 5314/2714/6498 5312/2712/6496 5307/2707/6491 5309/2709/6493 +f 5315/2715/6499 5314/2714/6498 5309/2709/6493 5310/2710/6494 +f 5316/2716/6500 5315/2715/6499 5310/2710/6494 5311/2711/6495 +f 5294/2694/6478 5278/2678/6462 5277/2677/6461 5317/2717/6501 +f 5318/2718/6502 5319/2719/6503 5320/2720/6504 5301/2701/6485 +f 5316/2716/6500 5321/2721/6505 5322/2722/6506 5323/2723/6507 +f 5324/2724/6508 5280/2680/6464 5279/2679/6463 5313/2713/6497 +f 5295/2695/6479 5294/2694/6478 5317/2717/6501 5325/2725/6509 +f 5301/2701/6485 5320/2720/6504 5326/2726/6510 5300/2700/6484 +f 5315/2715/6499 5316/2716/6500 5323/2723/6507 5327/2727/6511 +f 5313/2713/6497 5279/2679/6463 5290/2690/6474 5308/2708/6492 +f 5297/2697/6481 5295/2695/6479 5325/2725/6509 5328/2728/6512 +f 5300/2700/6484 5326/2726/6510 5329/2729/6513 5306/2706/6490 +f 5314/2714/6498 5315/2715/6499 5327/2727/6511 5330/2730/6514 +f 5308/2708/6492 5290/2690/6474 5287/2687/6471 5303/2703/6487 +f 5299/2699/6483 5297/2697/6481 5328/2728/6512 5331/2731/6515 +f 5306/2706/6490 5329/2729/6513 5332/2732/6516 5311/2711/6495 +f 5312/2712/6496 5314/2714/6498 5330/2730/6514 5333/2733/6517 +f 5303/2703/6487 5287/2687/6471 5284/2684/6468 5293/2693/6477 +f 5301/2701/6485 5299/2699/6483 5331/2731/6515 5318/2718/6502 +f 5311/2711/6495 5332/2732/6516 5321/2721/6505 5316/2716/6500 +f 5313/2713/6497 5312/2712/6496 5333/2733/6517 5324/2724/6508 +f 5293/2693/6477 5284/2684/6468 5278/2678/6462 5294/2694/6478 +f 5334/2734/6518 5335/2735/6519 5336/2736/6520 5337/2737/6521 +f 5338/2738/6522 5334/2734/6518 5337/2737/6521 5339/2739/6523 +f 5340/2740/6524 5338/2738/6522 5339/2739/6523 5341/2741/6525 +f 5342/2742/6526 5340/2740/6524 5341/2741/6525 5343/2743/6527 +f 5344/2744/6528 5345/2745/6529 5335/2735/6519 5334/2734/6518 +f 5346/2746/6530 5344/2744/6528 5334/2734/6518 5338/2738/6522 +f 5347/2747/6531 5346/2746/6530 5338/2738/6522 5340/2740/6524 +f 5348/2748/6532 5347/2747/6531 5340/2740/6524 5342/2742/6526 +f 5349/2749/6533 5350/2750/6534 5345/2745/6529 5344/2744/6528 +f 5351/2751/6535 5349/2749/6533 5344/2744/6528 5346/2746/6530 +f 5352/2752/6536 5351/2751/6535 5346/2746/6530 5347/2747/6531 +f 5353/2753/6537 5352/2752/6536 5347/2747/6531 5348/2748/6532 +f 5354/2754/6538 5355/2755/6539 5350/2750/6534 5349/2749/6533 +f 5356/2756/6540 5354/2754/6538 5349/2749/6533 5351/2751/6535 +f 5357/2757/6541 5356/2756/6540 5351/2751/6535 5352/2752/6536 +f 5358/2758/6542 5357/2757/6541 5352/2752/6536 5353/2753/6537 +f 5336/2736/6520 5320/2720/6504 5319/2719/6503 5359/2759/6543 +f 5360/2760/6544 5361/2761/6545 5362/2762/6546 5343/2743/6527 +f 5358/2758/6542 5363/2763/6547 5364/2764/6548 5365/2765/6549 +f 5366/2766/6550 5322/2722/6506 5321/2721/6505 5355/2755/6539 +f 5337/2737/6521 5336/2736/6520 5359/2759/6543 5367/2767/6551 +f 5343/2743/6527 5362/2762/6546 5368/2768/6552 5342/2742/6526 +f 5357/2757/6541 5358/2758/6542 5365/2765/6549 5369/2769/6553 +f 5355/2755/6539 5321/2721/6505 5332/2732/6516 5350/2750/6534 +f 5339/2739/6523 5337/2737/6521 5367/2767/6551 5370/2770/6554 +f 5342/2742/6526 5368/2768/6552 5371/2771/6555 5348/2748/6532 +f 5356/2756/6540 5357/2757/6541 5369/2769/6553 5372/2772/6556 +f 5350/2750/6534 5332/2732/6516 5329/2729/6513 5345/2745/6529 +f 5341/2741/6525 5339/2739/6523 5370/2770/6554 5373/2773/6557 +f 5348/2748/6532 5371/2771/6555 5374/2774/6558 5353/2753/6537 +f 5354/2754/6538 5356/2756/6540 5372/2772/6556 5375/2775/6559 +f 5345/2745/6529 5329/2729/6513 5326/2726/6510 5335/2735/6519 +f 5343/2743/6527 5341/2741/6525 5373/2773/6557 5360/2760/6544 +f 5353/2753/6537 5374/2774/6558 5363/2763/6547 5358/2758/6542 +f 5355/2755/6539 5354/2754/6538 5375/2775/6559 5366/2766/6550 +f 5335/2735/6519 5326/2726/6510 5320/2720/6504 5336/2736/6520 +f 5376/2776/6560 5377/2777/6561 5378/2778/6562 5379/2779/6563 +f 5380/2780/6564 5376/2776/6560 5379/2779/6563 5381/2781/6565 +f 5382/2782/6566 5380/2780/6564 5381/2781/6565 5383/2783/6567 +f 5384/2784/6568 5382/2782/6566 5383/2783/6567 5385/2785/6569 +f 5386/2786/6570 5387/2787/6571 5377/2777/6561 5376/2776/6560 +f 5388/2788/6572 5386/2786/6570 5376/2776/6560 5380/2780/6564 +f 5389/2789/6573 5388/2788/6572 5380/2780/6564 5382/2782/6566 +f 5390/2790/6574 5389/2789/6573 5382/2782/6566 5384/2784/6568 +f 5391/2791/6575 5392/2792/6576 5387/2787/6571 5386/2786/6570 +f 5393/2793/6577 5391/2791/6575 5386/2786/6570 5388/2788/6572 +f 5394/2794/6578 5393/2793/6577 5388/2788/6572 5389/2789/6573 +f 5395/2795/6579 5394/2794/6578 5389/2789/6573 5390/2790/6574 +f 5396/2796/6580 5397/2797/6581 5392/2792/6576 5391/2791/6575 +f 5398/2798/6582 5396/2796/6580 5391/2791/6575 5393/2793/6577 +f 5399/2799/6583 5398/2798/6582 5393/2793/6577 5394/2794/6578 +f 5400/2800/6584 5399/2799/6583 5394/2794/6578 5395/2795/6579 +f 5378/2778/6562 5401/2801/6585 5402/2802/6586 5403/2803/6587 +f 5404/2804/6588 5405/2805/6589 5406/2806/6590 5385/2785/6569 +f 5400/2800/6584 5407/2807/6591 5230/2630/6414 5229/2629/6413 +f 5228/2628/6412 5227/2627/6411 5408/2808/6592 5397/2797/6581 +f 5379/2779/6563 5378/2778/6562 5403/2803/6587 5409/2809/6593 +f 5385/2785/6569 5406/2806/6590 5410/2810/6594 5384/2784/6568 +f 5399/2799/6583 5400/2800/6584 5229/2629/6413 5246/2646/6430 +f 5397/2797/6581 5408/2808/6592 5411/2811/6595 5392/2792/6576 +f 5381/2781/6565 5379/2779/6563 5409/2809/6593 5412/2812/6596 +f 5384/2784/6568 5410/2810/6594 5413/2813/6597 5390/2790/6574 +f 5398/2798/6582 5399/2799/6583 5246/2646/6430 5242/2642/6426 +f 5392/2792/6576 5411/2811/6595 5414/2814/6598 5387/2787/6571 +f 5383/2783/6567 5381/2781/6565 5412/2812/6596 5415/2815/6599 +f 5390/2790/6574 5413/2813/6597 5416/2816/6600 5395/2795/6579 +f 5396/2796/6580 5398/2798/6582 5242/2642/6426 5238/2638/6422 +f 5387/2787/6571 5414/2814/6598 5417/2817/6601 5377/2777/6561 +f 5385/2785/6569 5383/2783/6567 5415/2815/6599 5404/2804/6588 +f 5395/2795/6579 5416/2816/6600 5407/2807/6591 5400/2800/6584 +f 5397/2797/6581 5396/2796/6580 5238/2638/6422 5228/2628/6412 +f 5377/2777/6561 5417/2817/6601 5401/2801/6585 5378/2778/6562 +f 5418/2818/6602 5419/2819/6603 5420/2820/6604 5421/2821/6605 +f 5422/2822/6606 5418/2818/6602 5421/2821/6605 5423/2823/6607 +f 5424/2824/6608 5422/2822/6606 5423/2823/6607 5425/2825/6609 +f 5426/2826/6610 5424/2824/6608 5425/2825/6609 5427/2827/6611 +f 5428/2828/6612 5429/2829/6613 5419/2819/6603 5418/2818/6602 +f 5430/2830/6614 5428/2828/6612 5418/2818/6602 5422/2822/6606 +f 5431/2831/6615 5430/2830/6614 5422/2822/6606 5424/2824/6608 +f 5432/2832/6616 5431/2831/6615 5424/2824/6608 5426/2826/6610 +f 5433/2833/6617 5434/2834/6618 5429/2829/6613 5428/2828/6612 +f 5435/2835/6619 5433/2833/6617 5428/2828/6612 5430/2830/6614 +f 5436/2836/6620 5435/2835/6619 5430/2830/6614 5431/2831/6615 +f 5437/2837/6621 5436/2836/6620 5431/2831/6615 5432/2832/6616 +f 5438/2838/6622 5439/2839/6623 5434/2834/6618 5433/2833/6617 +f 5440/2840/6624 5438/2838/6622 5433/2833/6617 5435/2835/6619 +f 5441/2841/6625 5440/2840/6624 5435/2835/6619 5436/2836/6620 +f 5442/2842/6626 5441/2841/6625 5436/2836/6620 5437/2837/6621 +f 5420/2820/6604 5406/2806/6590 5405/2805/6589 5443/2843/6627 +f 5444/2844/6628 5445/2845/6629 5446/2846/6630 5427/2827/6611 +f 5442/2842/6626 5447/2847/6631 5277/2677/6461 5276/2676/6460 +f 5275/2675/6459 5230/2630/6414 5407/2807/6591 5439/2839/6623 +f 5421/2821/6605 5420/2820/6604 5443/2843/6627 5448/2848/6632 +f 5427/2827/6611 5446/2846/6630 5449/2849/6633 5426/2826/6610 +f 5441/2841/6625 5442/2842/6626 5276/2676/6460 5289/2689/6473 +f 5439/2839/6623 5407/2807/6591 5416/2816/6600 5434/2834/6618 +f 5423/2823/6607 5421/2821/6605 5448/2848/6632 5450/2850/6634 +f 5426/2826/6610 5449/2849/6633 5451/2851/6635 5432/2832/6616 +f 5440/2840/6624 5441/2841/6625 5289/2689/6473 5286/2686/6470 +f 5434/2834/6618 5416/2816/6600 5413/2813/6597 5429/2829/6613 +f 5425/2825/6609 5423/2823/6607 5450/2850/6634 5452/2852/6636 +f 5432/2832/6616 5451/2851/6635 5453/2853/6637 5437/2837/6621 +f 5438/2838/6622 5440/2840/6624 5286/2686/6470 5283/2683/6467 +f 5429/2829/6613 5413/2813/6597 5410/2810/6594 5419/2819/6603 +f 5427/2827/6611 5425/2825/6609 5452/2852/6636 5444/2844/6628 +f 5437/2837/6621 5453/2853/6637 5447/2847/6631 5442/2842/6626 +f 5439/2839/6623 5438/2838/6622 5283/2683/6467 5275/2675/6459 +f 5419/2819/6603 5410/2810/6594 5406/2806/6590 5420/2820/6604 +f 5454/2854/6638 5455/2855/6639 5456/2856/6640 5457/2857/6641 +f 5458/2858/6642 5454/2854/6638 5457/2857/6641 5459/2859/6643 +f 5460/2860/6644 5458/2858/6642 5459/2859/6643 5461/2861/6645 +f 5462/2862/6646 5460/2860/6644 5461/2861/6645 5463/2863/6647 +f 5464/2864/6648 5465/2865/6649 5455/2855/6639 5454/2854/6638 +f 5466/2866/6650 5464/2864/6648 5454/2854/6638 5458/2858/6642 +f 5467/2867/6651 5466/2866/6650 5458/2858/6642 5460/2860/6644 +f 5468/2868/6652 5467/2867/6651 5460/2860/6644 5462/2862/6646 +f 5469/2869/6653 5470/2870/6654 5465/2865/6649 5464/2864/6648 +f 5471/2871/6655 5469/2869/6653 5464/2864/6648 5466/2866/6650 +f 5472/2872/6656 5471/2871/6655 5466/2866/6650 5467/2867/6651 +f 5473/2873/6657 5472/2872/6656 5467/2867/6651 5468/2868/6652 +f 5474/2874/6658 5475/2875/6659 5470/2870/6654 5469/2869/6653 +f 5476/2876/6660 5474/2874/6658 5469/2869/6653 5471/2871/6655 +f 5477/2877/6661 5476/2876/6660 5471/2871/6655 5472/2872/6656 +f 5478/2878/6662 5477/2877/6661 5472/2872/6656 5473/2873/6657 +f 5456/2856/6640 5446/2846/6630 5445/2845/6629 5479/2879/6663 +f 5480/2880/6664 5481/2881/6665 5482/2882/6666 5463/2863/6647 +f 5478/2878/6662 5483/2883/6667 5319/2719/6503 5318/2718/6502 +f 5317/2717/6501 5277/2677/6461 5447/2847/6631 5475/2875/6659 +f 5457/2857/6641 5456/2856/6640 5479/2879/6663 5484/2884/6668 +f 5463/2863/6647 5482/2882/6666 5485/2885/6669 5462/2862/6646 +f 5477/2877/6661 5478/2878/6662 5318/2718/6502 5331/2731/6515 +f 5475/2875/6659 5447/2847/6631 5453/2853/6637 5470/2870/6654 +f 5459/2859/6643 5457/2857/6641 5484/2884/6668 5486/2886/6670 +f 5462/2862/6646 5485/2885/6669 5487/2887/6671 5468/2868/6652 +f 5476/2876/6660 5477/2877/6661 5331/2731/6515 5328/2728/6512 +f 5470/2870/6654 5453/2853/6637 5451/2851/6635 5465/2865/6649 +f 5461/2861/6645 5459/2859/6643 5486/2886/6670 5488/2888/6672 +f 5468/2868/6652 5487/2887/6671 5489/2889/6673 5473/2873/6657 +f 5474/2874/6658 5476/2876/6660 5328/2728/6512 5325/2725/6509 +f 5465/2865/6649 5451/2851/6635 5449/2849/6633 5455/2855/6639 +f 5463/2863/6647 5461/2861/6645 5488/2888/6672 5480/2880/6664 +f 5473/2873/6657 5489/2889/6673 5483/2883/6667 5478/2878/6662 +f 5475/2875/6659 5474/2874/6658 5325/2725/6509 5317/2717/6501 +f 5455/2855/6639 5449/2849/6633 5446/2846/6630 5456/2856/6640 +f 5490/2890/6674 5491/2891/6675 5492/2892/6676 5493/2893/6677 +f 5494/2894/6678 5490/2890/6674 5493/2893/6677 5495/2895/6679 +f 5496/2896/6680 5494/2894/6678 5495/2895/6679 5497/2897/6681 +f 5498/2898/6682 5496/2896/6680 5497/2897/6681 5499/2899/6683 +f 5500/2900/6684 5501/2901/6685 5491/2891/6675 5490/2890/6674 +f 5502/2902/6686 5500/2900/6684 5490/2890/6674 5494/2894/6678 +f 5503/2903/6687 5502/2902/6686 5494/2894/6678 5496/2896/6680 +f 5504/2904/6688 5503/2903/6687 5496/2896/6680 5498/2898/6682 +f 5505/2905/6689 5506/2906/6690 5501/2901/6685 5500/2900/6684 +f 5507/2907/6691 5505/2905/6689 5500/2900/6684 5502/2902/6686 +f 5508/2908/6692 5507/2907/6691 5502/2902/6686 5503/2903/6687 +f 5509/2909/6693 5508/2908/6692 5503/2903/6687 5504/2904/6688 +f 5510/2910/6694 5511/2911/6695 5506/2906/6690 5505/2905/6689 +f 5512/2912/6696 5510/2910/6694 5505/2905/6689 5507/2907/6691 +f 5513/2913/6697 5512/2912/6696 5507/2907/6691 5508/2908/6692 +f 5514/2914/6698 5513/2913/6697 5508/2908/6692 5509/2909/6693 +f 5492/2892/6676 5482/2882/6666 5481/2881/6665 5515/2915/6699 +f 5516/2916/6700 5517/2917/6701 5518/2918/6702 5499/2899/6683 +f 5514/2914/6698 5519/2919/6703 5361/2761/6545 5360/2760/6544 +f 5359/2759/6543 5319/2719/6503 5483/2883/6667 5511/2911/6695 +f 5493/2893/6677 5492/2892/6676 5515/2915/6699 5520/2920/6704 +f 5499/2899/6683 5518/2918/6702 5521/2921/6705 5498/2898/6682 +f 5513/2913/6697 5514/2914/6698 5360/2760/6544 5373/2773/6557 +f 5511/2911/6695 5483/2883/6667 5489/2889/6673 5506/2906/6690 +f 5495/2895/6679 5493/2893/6677 5520/2920/6704 5522/2922/6706 +f 5498/2898/6682 5521/2921/6705 5523/2923/6707 5504/2904/6688 +f 5512/2912/6696 5513/2913/6697 5373/2773/6557 5370/2770/6554 +f 5506/2906/6690 5489/2889/6673 5487/2887/6671 5501/2901/6685 +f 5497/2897/6681 5495/2895/6679 5522/2922/6706 5524/2924/6708 +f 5504/2904/6688 5523/2923/6707 5525/2925/6709 5509/2909/6693 +f 5510/2910/6694 5512/2912/6696 5370/2770/6554 5367/2767/6551 +f 5501/2901/6685 5487/2887/6671 5485/2885/6669 5491/2891/6675 +f 5499/2899/6683 5497/2897/6681 5524/2924/6708 5516/2916/6700 +f 5509/2909/6693 5525/2925/6709 5519/2919/6703 5514/2914/6698 +f 5511/2911/6695 5510/2910/6694 5367/2767/6551 5359/2759/6543 +f 5491/2891/6675 5485/2885/6669 5482/2882/6666 5492/2892/6676 +f 5526/2603/6710 5527/2602/6711 5528/2601/6712 5529/2604/6713 +f 5529/2604/6713 5528/2601/6712 5530/2605/6714 5531/2606/6715 +f 5531/2606/6715 5530/2605/6714 5532/2607/6716 5533/2608/6717 +f 5533/2608/6717 5532/2607/6716 5534/2609/6718 5535/2610/6719 +f 5527/2602/6711 5536/2612/6720 5537/2611/6721 5528/2601/6712 +f 5528/2601/6712 5537/2611/6721 5538/2613/6722 5530/2605/6714 +f 5530/2605/6714 5538/2613/6722 5539/2614/6723 5532/2607/6716 +f 5532/2607/6716 5539/2614/6723 5540/2615/6724 5534/2609/6718 +f 5536/2612/6720 5541/2617/6725 5542/2616/6726 5537/2611/6721 +f 5537/2611/6721 5542/2616/6726 5543/2618/6727 5538/2613/6722 +f 5538/2613/6722 5543/2618/6727 5544/2619/6728 5539/2614/6723 +f 5539/2614/6723 5544/2619/6728 5545/2620/6729 5540/2615/6724 +f 5541/2617/6725 5546/2622/6730 5547/2621/6731 5542/2616/6726 +f 5542/2616/6726 5547/2621/6731 5548/2623/6732 5543/2618/6727 +f 5543/2618/6727 5548/2623/6732 5549/2624/6733 5544/2619/6728 +f 5544/2619/6728 5549/2624/6733 5550/2625/6734 5545/2620/6729 +f 5551/2627/6735 5552/2626/6736 5526/2603/6710 5553/2628/6737 +f 5554/2631/6738 5555/2630/6739 5556/2629/6740 5535/2610/6719 +f 5557/2633/6741 5558/2632/6742 5550/2625/6734 5559/2634/6743 +f 5560/2637/6744 5561/2636/6745 5562/2635/6746 5546/2622/6730 +f 5553/2628/6737 5526/2603/6710 5529/2604/6713 5563/2638/6747 +f 5564/2639/6748 5554/2631/6738 5535/2610/6719 5534/2609/6718 +f 5559/2634/6743 5550/2625/6734 5549/2624/6733 5565/2640/6749 +f 5566/2641/6750 5560/2637/6744 5546/2622/6730 5541/2617/6725 +f 5563/2638/6747 5529/2604/6713 5531/2606/6715 5567/2642/6751 +f 5568/2643/6752 5564/2639/6748 5534/2609/6718 5540/2615/6724 +f 5565/2640/6749 5549/2624/6733 5548/2623/6732 5569/2644/6753 +f 5570/2645/6754 5566/2641/6750 5541/2617/6725 5536/2612/6720 +f 5567/2642/6751 5531/2606/6715 5533/2608/6717 5571/2646/6755 +f 5572/2647/6756 5568/2643/6752 5540/2615/6724 5545/2620/6729 +f 5569/2644/6753 5548/2623/6732 5547/2621/6731 5573/2648/6757 +f 5574/2649/6758 5570/2645/6754 5536/2612/6720 5527/2602/6711 +f 5571/2646/6755 5533/2608/6717 5535/2610/6719 5556/2629/6740 +f 5558/2632/6742 5572/2647/6756 5545/2620/6729 5550/2625/6734 +f 5573/2648/6757 5547/2621/6731 5546/2622/6730 5562/2635/6746 +f 5552/2626/6736 5574/2649/6758 5527/2602/6711 5526/2603/6710 +f 5575/2652/6759 5576/2651/6760 5577/2650/6761 5578/2653/6762 +f 5578/2653/6762 5577/2650/6761 5579/2654/6763 5580/2655/6764 +f 5580/2655/6764 5579/2654/6763 5581/2656/6765 5582/2657/6766 +f 5582/2657/6766 5581/2656/6765 5583/2658/6767 5584/2659/6768 +f 5576/2651/6760 5585/2661/6769 5586/2660/6770 5577/2650/6761 +f 5577/2650/6761 5586/2660/6770 5587/2662/6771 5579/2654/6763 +f 5579/2654/6763 5587/2662/6771 5588/2663/6772 5581/2656/6765 +f 5581/2656/6765 5588/2663/6772 5589/2664/6773 5583/2658/6767 +f 5585/2661/6769 5590/2666/6774 5591/2665/6775 5586/2660/6770 +f 5586/2660/6770 5591/2665/6775 5592/2667/6776 5587/2662/6771 +f 5587/2662/6771 5592/2667/6776 5593/2668/6777 5588/2663/6772 +f 5588/2663/6772 5593/2668/6777 5594/2669/6778 5589/2664/6773 +f 5590/2666/6774 5595/2671/6779 5596/2670/6780 5591/2665/6775 +f 5591/2665/6775 5596/2670/6780 5597/2672/6781 5592/2667/6776 +f 5592/2667/6776 5597/2672/6781 5598/2673/6782 5593/2668/6777 +f 5593/2668/6777 5598/2673/6782 5599/2674/6783 5594/2669/6778 +f 5555/2630/6739 5554/2631/6738 5575/2652/6759 5600/2675/6784 +f 5601/2678/6785 5602/2677/6786 5603/2676/6787 5584/2659/6768 +f 5604/2680/6788 5605/2679/6789 5599/2674/6783 5606/2681/6790 +f 5558/2632/6742 5557/2633/6741 5607/2682/6791 5595/2671/6779 +f 5600/2675/6784 5575/2652/6759 5578/2653/6762 5608/2683/6792 +f 5609/2684/6793 5601/2678/6785 5584/2659/6768 5583/2658/6767 +f 5606/2681/6790 5599/2674/6783 5598/2673/6782 5610/2685/6794 +f 5572/2647/6756 5558/2632/6742 5595/2671/6779 5590/2666/6774 +f 5608/2683/6792 5578/2653/6762 5580/2655/6764 5611/2686/6795 +f 5612/2687/6796 5609/2684/6793 5583/2658/6767 5589/2664/6773 +f 5610/2685/6794 5598/2673/6782 5597/2672/6781 5613/2688/6797 +f 5568/2643/6752 5572/2647/6756 5590/2666/6774 5585/2661/6769 +f 5611/2686/6795 5580/2655/6764 5582/2657/6766 5614/2689/6798 +f 5615/2690/6799 5612/2687/6796 5589/2664/6773 5594/2669/6778 +f 5613/2688/6797 5597/2672/6781 5596/2670/6780 5616/2691/6800 +f 5564/2639/6748 5568/2643/6752 5585/2661/6769 5576/2651/6760 +f 5614/2689/6798 5582/2657/6766 5584/2659/6768 5603/2676/6787 +f 5605/2679/6789 5615/2690/6799 5594/2669/6778 5599/2674/6783 +f 5616/2691/6800 5596/2670/6780 5595/2671/6779 5607/2682/6791 +f 5554/2631/6738 5564/2639/6748 5576/2651/6760 5575/2652/6759 +f 5617/2694/6801 5618/2693/6802 5619/2692/6803 5620/2695/6804 +f 5620/2695/6804 5619/2692/6803 5621/2696/6805 5622/2697/6806 +f 5622/2697/6806 5621/2696/6805 5623/2698/6807 5624/2699/6808 +f 5624/2699/6808 5623/2698/6807 5625/2700/6809 5626/2701/6810 +f 5618/2693/6802 5627/2703/6811 5628/2702/6812 5619/2692/6803 +f 5619/2692/6803 5628/2702/6812 5629/2704/6813 5621/2696/6805 +f 5621/2696/6805 5629/2704/6813 5630/2705/6814 5623/2698/6807 +f 5623/2698/6807 5630/2705/6814 5631/2706/6815 5625/2700/6809 +f 5627/2703/6811 5632/2708/6816 5633/2707/6817 5628/2702/6812 +f 5628/2702/6812 5633/2707/6817 5634/2709/6818 5629/2704/6813 +f 5629/2704/6813 5634/2709/6818 5635/2710/6819 5630/2705/6814 +f 5630/2705/6814 5635/2710/6819 5636/2711/6820 5631/2706/6815 +f 5632/2708/6816 5637/2713/6821 5638/2712/6822 5633/2707/6817 +f 5633/2707/6817 5638/2712/6822 5639/2714/6823 5634/2709/6818 +f 5634/2709/6818 5639/2714/6823 5640/2715/6824 5635/2710/6819 +f 5635/2710/6819 5640/2715/6824 5641/2716/6825 5636/2711/6820 +f 5602/2677/6786 5601/2678/6785 5617/2694/6801 5642/2717/6826 +f 5643/2720/6827 5644/2719/6828 5645/2718/6829 5626/2701/6810 +f 5646/2722/6830 5647/2721/6831 5641/2716/6825 5648/2723/6832 +f 5605/2679/6789 5604/2680/6788 5649/2724/6833 5637/2713/6821 +f 5642/2717/6826 5617/2694/6801 5620/2695/6804 5650/2725/6834 +f 5651/2726/6835 5643/2720/6827 5626/2701/6810 5625/2700/6809 +f 5648/2723/6832 5641/2716/6825 5640/2715/6824 5652/2727/6836 +f 5615/2690/6799 5605/2679/6789 5637/2713/6821 5632/2708/6816 +f 5650/2725/6834 5620/2695/6804 5622/2697/6806 5653/2728/6837 +f 5654/2729/6838 5651/2726/6835 5625/2700/6809 5631/2706/6815 +f 5652/2727/6836 5640/2715/6824 5639/2714/6823 5655/2730/6839 +f 5612/2687/6796 5615/2690/6799 5632/2708/6816 5627/2703/6811 +f 5653/2728/6837 5622/2697/6806 5624/2699/6808 5656/2731/6840 +f 5657/2732/6841 5654/2729/6838 5631/2706/6815 5636/2711/6820 +f 5655/2730/6839 5639/2714/6823 5638/2712/6822 5658/2733/6842 +f 5609/2684/6793 5612/2687/6796 5627/2703/6811 5618/2693/6802 +f 5656/2731/6840 5624/2699/6808 5626/2701/6810 5645/2718/6829 +f 5647/2721/6831 5657/2732/6841 5636/2711/6820 5641/2716/6825 +f 5658/2733/6842 5638/2712/6822 5637/2713/6821 5649/2724/6833 +f 5601/2678/6785 5609/2684/6793 5618/2693/6802 5617/2694/6801 +f 5659/2736/6843 5660/2735/6844 5661/2734/6845 5662/2737/6846 +f 5662/2737/6846 5661/2734/6845 5663/2738/6847 5664/2739/6848 +f 5664/2739/6848 5663/2738/6847 5665/2740/6849 5666/2741/6850 +f 5666/2741/6850 5665/2740/6849 5667/2742/6851 5668/2743/6852 +f 5660/2735/6844 5669/2745/6853 5670/2744/6854 5661/2734/6845 +f 5661/2734/6845 5670/2744/6854 5671/2746/6855 5663/2738/6847 +f 5663/2738/6847 5671/2746/6855 5672/2747/6856 5665/2740/6849 +f 5665/2740/6849 5672/2747/6856 5673/2748/6857 5667/2742/6851 +f 5669/2745/6853 5674/2750/6858 5675/2749/6859 5670/2744/6854 +f 5670/2744/6854 5675/2749/6859 5676/2751/6860 5671/2746/6855 +f 5671/2746/6855 5676/2751/6860 5677/2752/6861 5672/2747/6856 +f 5672/2747/6856 5677/2752/6861 5678/2753/6862 5673/2748/6857 +f 5674/2750/6858 5679/2755/6863 5680/2754/6864 5675/2749/6859 +f 5675/2749/6859 5680/2754/6864 5681/2756/6865 5676/2751/6860 +f 5676/2751/6860 5681/2756/6865 5682/2757/6866 5677/2752/6861 +f 5677/2752/6861 5682/2757/6866 5683/2758/6867 5678/2753/6862 +f 5644/2719/6828 5643/2720/6827 5659/2736/6843 5684/2759/6868 +f 5685/2762/6869 5686/2761/6870 5687/2760/6871 5668/2743/6852 +f 5688/2764/6872 5689/2763/6873 5683/2758/6867 5690/2765/6874 +f 5647/2721/6831 5646/2722/6830 5691/2766/6875 5679/2755/6863 +f 5684/2759/6868 5659/2736/6843 5662/2737/6846 5692/2767/6876 +f 5693/2768/6877 5685/2762/6869 5668/2743/6852 5667/2742/6851 +f 5690/2765/6874 5683/2758/6867 5682/2757/6866 5694/2769/6878 +f 5657/2732/6841 5647/2721/6831 5679/2755/6863 5674/2750/6858 +f 5692/2767/6876 5662/2737/6846 5664/2739/6848 5695/2770/6879 +f 5696/2771/6880 5693/2768/6877 5667/2742/6851 5673/2748/6857 +f 5694/2769/6878 5682/2757/6866 5681/2756/6865 5697/2772/6881 +f 5654/2729/6838 5657/2732/6841 5674/2750/6858 5669/2745/6853 +f 5695/2770/6879 5664/2739/6848 5666/2741/6850 5698/2773/6882 +f 5699/2774/6883 5696/2771/6880 5673/2748/6857 5678/2753/6862 +f 5697/2772/6881 5681/2756/6865 5680/2754/6864 5700/2775/6884 +f 5651/2726/6835 5654/2729/6838 5669/2745/6853 5660/2735/6844 +f 5698/2773/6882 5666/2741/6850 5668/2743/6852 5687/2760/6871 +f 5689/2763/6873 5699/2774/6883 5678/2753/6862 5683/2758/6867 +f 5700/2775/6884 5680/2754/6864 5679/2755/6863 5691/2766/6875 +f 5643/2720/6827 5651/2726/6835 5660/2735/6844 5659/2736/6843 +f 5701/2778/6885 5702/2777/6886 5703/2776/6887 5704/2779/6888 +f 5704/2779/6888 5703/2776/6887 5705/2780/6889 5706/2781/6890 +f 5706/2781/6890 5705/2780/6889 5707/2782/6891 5708/2783/6892 +f 5708/2783/6892 5707/2782/6891 5709/2784/6893 5710/2785/6894 +f 5702/2777/6886 5711/2787/6895 5712/2786/6896 5703/2776/6887 +f 5703/2776/6887 5712/2786/6896 5713/2788/6897 5705/2780/6889 +f 5705/2780/6889 5713/2788/6897 5714/2789/6898 5707/2782/6891 +f 5707/2782/6891 5714/2789/6898 5715/2790/6899 5709/2784/6893 +f 5711/2787/6895 5716/2792/6900 5717/2791/6901 5712/2786/6896 +f 5712/2786/6896 5717/2791/6901 5718/2793/6902 5713/2788/6897 +f 5713/2788/6897 5718/2793/6902 5719/2794/6903 5714/2789/6898 +f 5714/2789/6898 5719/2794/6903 5720/2795/6904 5715/2790/6899 +f 5716/2792/6900 5721/2797/6905 5722/2796/6906 5717/2791/6901 +f 5717/2791/6901 5722/2796/6906 5723/2798/6907 5718/2793/6902 +f 5718/2793/6902 5723/2798/6907 5724/2799/6908 5719/2794/6903 +f 5719/2794/6903 5724/2799/6908 5725/2800/6909 5720/2795/6904 +f 5726/2802/6910 5727/2801/6911 5701/2778/6885 5728/2803/6912 +f 5729/2806/6913 5730/2805/6914 5731/2804/6915 5710/2785/6894 +f 5555/2630/6739 5732/2807/6916 5725/2800/6909 5556/2629/6740 +f 5733/2808/6917 5551/2627/6735 5553/2628/6737 5721/2797/6905 +f 5728/2803/6912 5701/2778/6885 5704/2779/6888 5734/2809/6918 +f 5735/2810/6919 5729/2806/6913 5710/2785/6894 5709/2784/6893 +f 5556/2629/6740 5725/2800/6909 5724/2799/6908 5571/2646/6755 +f 5736/2811/6920 5733/2808/6917 5721/2797/6905 5716/2792/6900 +f 5734/2809/6918 5704/2779/6888 5706/2781/6890 5737/2812/6921 +f 5738/2813/6922 5735/2810/6919 5709/2784/6893 5715/2790/6899 +f 5571/2646/6755 5724/2799/6908 5723/2798/6907 5567/2642/6751 +f 5739/2814/6923 5736/2811/6920 5716/2792/6900 5711/2787/6895 +f 5737/2812/6921 5706/2781/6890 5708/2783/6892 5740/2815/6924 +f 5741/2816/6925 5738/2813/6922 5715/2790/6899 5720/2795/6904 +f 5567/2642/6751 5723/2798/6907 5722/2796/6906 5563/2638/6747 +f 5742/2817/6926 5739/2814/6923 5711/2787/6895 5702/2777/6886 +f 5740/2815/6924 5708/2783/6892 5710/2785/6894 5731/2804/6915 +f 5732/2807/6916 5741/2816/6925 5720/2795/6904 5725/2800/6909 +f 5563/2638/6747 5722/2796/6906 5721/2797/6905 5553/2628/6737 +f 5727/2801/6911 5742/2817/6926 5702/2777/6886 5701/2778/6885 +f 5743/2820/6927 5744/2819/6928 5745/2818/6929 5746/2821/6930 +f 5746/2821/6930 5745/2818/6929 5747/2822/6931 5748/2823/6932 +f 5748/2823/6932 5747/2822/6931 5749/2824/6933 5750/2825/6934 +f 5750/2825/6934 5749/2824/6933 5751/2826/6935 5752/2827/6936 +f 5744/2819/6928 5753/2829/6937 5754/2828/6938 5745/2818/6929 +f 5745/2818/6929 5754/2828/6938 5755/2830/6939 5747/2822/6931 +f 5747/2822/6931 5755/2830/6939 5756/2831/6940 5749/2824/6933 +f 5749/2824/6933 5756/2831/6940 5757/2832/6941 5751/2826/6935 +f 5753/2829/6937 5758/2834/6942 5759/2833/6943 5754/2828/6938 +f 5754/2828/6938 5759/2833/6943 5760/2835/6944 5755/2830/6939 +f 5755/2830/6939 5760/2835/6944 5761/2836/6945 5756/2831/6940 +f 5756/2831/6940 5761/2836/6945 5762/2837/6946 5757/2832/6941 +f 5758/2834/6942 5763/2839/6947 5764/2838/6948 5759/2833/6943 +f 5759/2833/6943 5764/2838/6948 5765/2840/6949 5760/2835/6944 +f 5760/2835/6944 5765/2840/6949 5766/2841/6950 5761/2836/6945 +f 5761/2836/6945 5766/2841/6950 5767/2842/6951 5762/2837/6946 +f 5730/2805/6914 5729/2806/6913 5743/2820/6927 5768/2843/6952 +f 5769/2846/6953 5770/2845/6954 5771/2844/6955 5752/2827/6936 +f 5602/2677/6786 5772/2847/6956 5767/2842/6951 5603/2676/6787 +f 5732/2807/6916 5555/2630/6739 5600/2675/6784 5763/2839/6947 +f 5768/2843/6952 5743/2820/6927 5746/2821/6930 5773/2848/6957 +f 5774/2849/6958 5769/2846/6953 5752/2827/6936 5751/2826/6935 +f 5603/2676/6787 5767/2842/6951 5766/2841/6950 5614/2689/6798 +f 5741/2816/6925 5732/2807/6916 5763/2839/6947 5758/2834/6942 +f 5773/2848/6957 5746/2821/6930 5748/2823/6932 5775/2850/6959 +f 5776/2851/6960 5774/2849/6958 5751/2826/6935 5757/2832/6941 +f 5614/2689/6798 5766/2841/6950 5765/2840/6949 5611/2686/6795 +f 5738/2813/6922 5741/2816/6925 5758/2834/6942 5753/2829/6937 +f 5775/2850/6959 5748/2823/6932 5750/2825/6934 5777/2852/6961 +f 5778/2853/6962 5776/2851/6960 5757/2832/6941 5762/2837/6946 +f 5611/2686/6795 5765/2840/6949 5764/2838/6948 5608/2683/6792 +f 5735/2810/6919 5738/2813/6922 5753/2829/6937 5744/2819/6928 +f 5777/2852/6961 5750/2825/6934 5752/2827/6936 5771/2844/6955 +f 5772/2847/6956 5778/2853/6962 5762/2837/6946 5767/2842/6951 +f 5608/2683/6792 5764/2838/6948 5763/2839/6947 5600/2675/6784 +f 5729/2806/6913 5735/2810/6919 5744/2819/6928 5743/2820/6927 +f 5779/2856/6963 5780/2855/6964 5781/2854/6965 5782/2857/6966 +f 5782/2857/6966 5781/2854/6965 5783/2858/6967 5784/2859/6968 +f 5784/2859/6968 5783/2858/6967 5785/2860/6969 5786/2861/6970 +f 5786/2861/6970 5785/2860/6969 5787/2862/6971 5788/2863/6972 +f 5780/2855/6964 5789/2865/6973 5790/2864/6974 5781/2854/6965 +f 5781/2854/6965 5790/2864/6974 5791/2866/6975 5783/2858/6967 +f 5783/2858/6967 5791/2866/6975 5792/2867/6976 5785/2860/6969 +f 5785/2860/6969 5792/2867/6976 5793/2868/6977 5787/2862/6971 +f 5789/2865/6973 5794/2870/6978 5795/2869/6979 5790/2864/6974 +f 5790/2864/6974 5795/2869/6979 5796/2871/6980 5791/2866/6975 +f 5791/2866/6975 5796/2871/6980 5797/2872/6981 5792/2867/6976 +f 5792/2867/6976 5797/2872/6981 5798/2873/6982 5793/2868/6977 +f 5794/2870/6978 5799/2875/6983 5800/2874/6984 5795/2869/6979 +f 5795/2869/6979 5800/2874/6984 5801/2876/6985 5796/2871/6980 +f 5796/2871/6980 5801/2876/6985 5802/2877/6986 5797/2872/6981 +f 5797/2872/6981 5802/2877/6986 5803/2878/6987 5798/2873/6982 +f 5770/2845/6954 5769/2846/6953 5779/2856/6963 5804/2879/6988 +f 5805/2882/6989 5806/2881/6990 5807/2880/6991 5788/2863/6972 +f 5644/2719/6828 5808/2883/6992 5803/2878/6987 5645/2718/6829 +f 5772/2847/6956 5602/2677/6786 5642/2717/6826 5799/2875/6983 +f 5804/2879/6988 5779/2856/6963 5782/2857/6966 5809/2884/6993 +f 5810/2885/6994 5805/2882/6989 5788/2863/6972 5787/2862/6971 +f 5645/2718/6829 5803/2878/6987 5802/2877/6986 5656/2731/6840 +f 5778/2853/6962 5772/2847/6956 5799/2875/6983 5794/2870/6978 +f 5809/2884/6993 5782/2857/6966 5784/2859/6968 5811/2886/6995 +f 5812/2887/6996 5810/2885/6994 5787/2862/6971 5793/2868/6977 +f 5656/2731/6840 5802/2877/6986 5801/2876/6985 5653/2728/6837 +f 5776/2851/6960 5778/2853/6962 5794/2870/6978 5789/2865/6973 +f 5811/2886/6995 5784/2859/6968 5786/2861/6970 5813/2888/6997 +f 5814/2889/6998 5812/2887/6996 5793/2868/6977 5798/2873/6982 +f 5653/2728/6837 5801/2876/6985 5800/2874/6984 5650/2725/6834 +f 5774/2849/6958 5776/2851/6960 5789/2865/6973 5780/2855/6964 +f 5813/2888/6997 5786/2861/6970 5788/2863/6972 5807/2880/6991 +f 5808/2883/6992 5814/2889/6998 5798/2873/6982 5803/2878/6987 +f 5650/2725/6834 5800/2874/6984 5799/2875/6983 5642/2717/6826 +f 5769/2846/6953 5774/2849/6958 5780/2855/6964 5779/2856/6963 +f 5815/2892/6999 5816/2891/7000 5817/2890/7001 5818/2893/7002 +f 5818/2893/7002 5817/2890/7001 5819/2894/7003 5820/2895/7004 +f 5820/2895/7004 5819/2894/7003 5821/2896/7005 5822/2897/7006 +f 5822/2897/7006 5821/2896/7005 5823/2898/7007 5824/2899/7008 +f 5816/2891/7000 5825/2901/7009 5826/2900/7010 5817/2890/7001 +f 5817/2890/7001 5826/2900/7010 5827/2902/7011 5819/2894/7003 +f 5819/2894/7003 5827/2902/7011 5828/2903/7012 5821/2896/7005 +f 5821/2896/7005 5828/2903/7012 5829/2904/7013 5823/2898/7007 +f 5825/2901/7009 5830/2906/7014 5831/2905/7015 5826/2900/7010 +f 5826/2900/7010 5831/2905/7015 5832/2907/7016 5827/2902/7011 +f 5827/2902/7011 5832/2907/7016 5833/2908/7017 5828/2903/7012 +f 5828/2903/7012 5833/2908/7017 5834/2909/7018 5829/2904/7013 +f 5830/2906/7014 5835/2911/7019 5836/2910/7020 5831/2905/7015 +f 5831/2905/7015 5836/2910/7020 5837/2912/7021 5832/2907/7016 +f 5832/2907/7016 5837/2912/7021 5838/2913/7022 5833/2908/7017 +f 5833/2908/7017 5838/2913/7022 5839/2914/7023 5834/2909/7018 +f 5806/2881/6990 5805/2882/6989 5815/2892/6999 5840/2915/7024 +f 5841/2918/7025 5842/2917/7026 5843/2916/7027 5824/2899/7008 +f 5686/2761/6870 5844/2919/7028 5839/2914/7023 5687/2760/6871 +f 5808/2883/6992 5644/2719/6828 5684/2759/6868 5835/2911/7019 +f 5840/2915/7024 5815/2892/6999 5818/2893/7002 5845/2920/7029 +f 5846/2921/7030 5841/2918/7025 5824/2899/7008 5823/2898/7007 +f 5687/2760/6871 5839/2914/7023 5838/2913/7022 5698/2773/6882 +f 5814/2889/6998 5808/2883/6992 5835/2911/7019 5830/2906/7014 +f 5845/2920/7029 5818/2893/7002 5820/2895/7004 5847/2922/7031 +f 5848/2923/7032 5846/2921/7030 5823/2898/7007 5829/2904/7013 +f 5698/2773/6882 5838/2913/7022 5837/2912/7021 5695/2770/6879 +f 5812/2887/6996 5814/2889/6998 5830/2906/7014 5825/2901/7009 +f 5847/2922/7031 5820/2895/7004 5822/2897/7006 5849/2924/7033 +f 5850/2925/7034 5848/2923/7032 5829/2904/7013 5834/2909/7018 +f 5695/2770/6879 5837/2912/7021 5836/2910/7020 5692/2767/6876 +f 5810/2885/6994 5812/2887/6996 5825/2901/7009 5816/2891/7000 +f 5849/2924/7033 5822/2897/7006 5824/2899/7008 5843/2916/7027 +f 5844/2919/7028 5850/2925/7034 5834/2909/7018 5839/2914/7023 +f 5692/2767/6876 5836/2910/7020 5835/2911/7019 5684/2759/6868 +f 5805/2882/6989 5810/2885/6994 5816/2891/7000 5815/2892/6999 +s 2 +f 5552/2626/7035 5551/2627/7036 5227/2627/7037 5226/2626/7038 +s 4 +f 5557/2633/7039 5559/2634/7040 5234/2634/7041 5233/2633/7042 +f 5562/2635/7043 5561/2636/7044 5236/2636/7045 5235/2635/7046 +s 2 +f 5561/2636/7047 5560/2637/7048 5237/2637/7049 5236/2636/7050 +s 4 +f 5559/2634/7040 5565/2640/7051 5240/2640/7052 5234/2634/7041 +s 2 +f 5560/2637/7048 5566/2641/7053 5241/2641/7054 5237/2637/7049 +s 4 +f 5565/2640/7051 5569/2644/7055 5244/2644/7056 5240/2640/7052 +s 2 +f 5566/2641/7053 5570/2645/7057 5245/2645/7058 5241/2641/7054 +s 4 +f 5569/2644/7055 5573/2648/7059 5248/2648/7060 5244/2644/7056 +s 2 +f 5570/2645/7057 5574/2649/7061 5249/2649/7062 5245/2645/7058 +s 4 +f 5573/2648/7059 5562/2635/7043 5235/2635/7046 5248/2648/7060 +s 2 +f 5574/2649/7061 5552/2626/7035 5226/2626/7038 5249/2649/7062 +s 4 +f 5604/2680/7063 5606/2681/7064 5281/2681/7065 5280/2680/7066 +f 5607/2682/7067 5557/2633/7039 5233/2633/7042 5282/2682/7068 +f 5606/2681/7064 5610/2685/7069 5285/2685/7070 5281/2681/7065 +f 5610/2685/7069 5613/2688/7071 5288/2688/7072 5285/2685/7070 +f 5613/2688/7071 5616/2691/7073 5291/2691/7074 5288/2688/7072 +f 5616/2691/7073 5607/2682/7067 5282/2682/7068 5291/2691/7074 +f 5646/2722/7075 5648/2723/7076 5323/2723/7077 5322/2722/7078 +f 5649/2724/7079 5604/2680/7063 5280/2680/7066 5324/2724/7080 +f 5648/2723/7076 5652/2727/7081 5327/2727/7082 5323/2723/7077 +f 5652/2727/7081 5655/2730/7083 5330/2730/7084 5327/2727/7082 +f 5655/2730/7083 5658/2733/7085 5333/2733/7086 5330/2730/7084 +f 5658/2733/7085 5649/2724/7079 5324/2724/7080 5333/2733/7086 +f 5686/2761/7087 5685/2762/7088 5362/2762/7089 5361/2761/7090 +f 5688/2764/7091 5690/2765/7092 5365/2765/7093 5364/2764/7094 +f 5689/2763/7095 5688/2764/7091 5364/2764/7094 5363/2763/7096 +f 5691/2766/7097 5646/2722/7075 5322/2722/7078 5366/2766/7098 +f 5685/2762/7088 5693/2768/7099 5368/2768/7100 5362/2762/7089 +f 5690/2765/7092 5694/2769/7101 5369/2769/7102 5365/2765/7093 +f 5693/2768/7099 5696/2771/7103 5371/2771/7104 5368/2768/7100 +f 5694/2769/7101 5697/2772/7105 5372/2772/7106 5369/2769/7102 +f 5696/2771/7103 5699/2774/7107 5374/2774/7108 5371/2771/7104 +f 5697/2772/7105 5700/2775/7109 5375/2775/7110 5372/2772/7106 +f 5699/2774/7107 5689/2763/7095 5363/2763/7096 5374/2774/7108 +f 5700/2775/7109 5691/2766/7097 5366/2766/7098 5375/2775/7110 +f 5726/2802/7111 5728/2803/7112 5403/2803/7113 5402/2802/7114 +s 2 +f 5727/2801/7115 5726/2802/7116 5402/2802/7117 5401/2801/7118 +s 4 +f 5731/2804/7119 5730/2805/7120 5405/2805/7121 5404/2804/7122 +s 2 +f 5551/2627/7036 5733/2808/7123 5408/2808/7124 5227/2627/7037 +s 4 +f 5728/2803/7112 5734/2809/7125 5409/2809/7126 5403/2803/7113 +s 2 +f 5733/2808/7123 5736/2811/7127 5411/2811/7128 5408/2808/7124 +s 4 +f 5734/2809/7125 5737/2812/7129 5412/2812/7130 5409/2809/7126 +s 2 +f 5736/2811/7127 5739/2814/7131 5414/2814/7132 5411/2811/7128 +s 4 +f 5737/2812/7129 5740/2815/7133 5415/2815/7134 5412/2812/7130 +s 2 +f 5739/2814/7131 5742/2817/7135 5417/2817/7136 5414/2814/7132 +s 4 +f 5740/2815/7133 5731/2804/7119 5404/2804/7122 5415/2815/7134 +s 2 +f 5742/2817/7135 5727/2801/7115 5401/2801/7118 5417/2817/7136 +s 4 +f 5730/2805/7120 5768/2843/7137 5443/2843/7138 5405/2805/7121 +f 5771/2844/7139 5770/2845/7140 5445/2845/7141 5444/2844/7142 +f 5768/2843/7137 5773/2848/7143 5448/2848/7144 5443/2843/7138 +f 5773/2848/7143 5775/2850/7145 5450/2850/7146 5448/2848/7144 +f 5775/2850/7145 5777/2852/7147 5452/2852/7148 5450/2850/7146 +f 5777/2852/7147 5771/2844/7139 5444/2844/7142 5452/2852/7148 +f 5770/2845/7140 5804/2879/7149 5479/2879/7150 5445/2845/7141 +f 5807/2880/7151 5806/2881/7152 5481/2881/7153 5480/2880/7154 +f 5804/2879/7149 5809/2884/7155 5484/2884/7156 5479/2879/7150 +f 5809/2884/7155 5811/2886/7157 5486/2886/7158 5484/2884/7156 +f 5811/2886/7157 5813/2888/7159 5488/2888/7160 5486/2886/7158 +f 5813/2888/7159 5807/2880/7151 5480/2880/7154 5488/2888/7160 +f 5806/2881/7152 5840/2915/7161 5515/2915/7162 5481/2881/7153 +f 5843/2916/7163 5842/2917/7164 5517/2917/7165 5516/2916/7166 +f 5842/2917/7164 5841/2918/7167 5518/2918/7168 5517/2917/7165 +f 5844/2919/7169 5686/2761/7087 5361/2761/7090 5519/2919/7170 +f 5840/2915/7161 5845/2920/7171 5520/2920/7172 5515/2915/7162 +f 5841/2918/7167 5846/2921/7173 5521/2921/7174 5518/2918/7168 +f 5845/2920/7171 5847/2922/7175 5522/2922/7176 5520/2920/7172 +f 5846/2921/7173 5848/2923/7177 5523/2923/7178 5521/2921/7174 +f 5847/2922/7175 5849/2924/7179 5524/2924/7180 5522/2922/7176 +f 5848/2923/7177 5850/2925/7181 5525/2925/7182 5523/2923/7178 +f 5849/2924/7179 5843/2916/7163 5516/2916/7166 5524/2924/7180 +f 5850/2925/7181 5844/2919/7169 5519/2919/7170 5525/2925/7182 +# 648 polygons + +# +# object lotu_petal_09 +# + +v -0.2065 0.0633 0.2211 +v -0.1553 0.0541 0.1891 +v -0.1534 0.0492 0.1315 +v -0.2084 0.0599 0.1566 +v -0.2652 0.0750 0.2512 +v -0.2674 0.0750 0.1789 +v -0.3286 0.0812 0.2782 +v -0.3292 0.0804 0.2001 +v -0.3956 0.0965 0.2983 +v -0.4026 0.0966 0.2129 +v -0.2014 0.0776 0.2876 +v -0.1527 0.0667 0.2491 +v -0.2551 0.0886 0.3249 +v -0.3157 0.0969 0.3564 +v -0.3863 0.1143 0.3836 +v -0.1937 0.1008 0.3568 +v -0.1476 0.0910 0.3099 +v -0.2516 0.1080 0.4001 +v -0.3126 0.1243 0.4348 +v -0.3786 0.1524 0.4707 +v -0.1917 0.1345 0.4239 +v -0.1421 0.1249 0.3710 +v -0.2420 0.1453 0.4720 +v -0.3076 0.1700 0.5108 +v -0.3808 0.1950 0.5519 +v -0.1075 0.0377 0.1184 +v -0.1060 0.0300 0.0722 +v -0.1533 0.0412 0.0792 +v -0.4079 0.1053 0.1255 +v -0.4899 0.1258 0.1360 +v -0.4842 0.1257 0.2263 +v -0.4560 0.2273 0.5831 +v -0.4482 0.2610 0.6690 +v -0.3791 0.2376 0.6289 +v -0.1382 0.1666 0.4256 +v -0.0954 0.1540 0.3560 +v -0.1030 0.1174 0.3065 +v -0.2075 0.0485 0.0953 +v -0.4725 0.1299 0.3156 +v -0.3073 0.2149 0.5865 +v -0.1087 0.0863 0.2573 +v -0.2677 0.0666 0.1079 +v -0.4640 0.1500 0.4061 +v -0.2438 0.1928 0.5388 +v -0.1106 0.0610 0.2114 +v -0.3344 0.0872 0.1200 +v -0.4546 0.1830 0.4940 +v -0.1824 0.1793 0.4872 +v -0.1095 0.0450 0.1649 +v -0.6364 0.2141 0.3626 +v -0.5521 0.1715 0.3325 +v -0.5671 0.1583 0.2392 +v -0.6488 0.1966 0.2655 +v -0.7231 0.2632 0.3914 +v -0.7313 0.2384 0.2886 +v -0.8158 0.3085 0.3988 +v -0.8235 0.2853 0.2920 +v -0.9104 0.3727 0.3868 +v -0.9239 0.3541 0.2802 +v -0.6191 0.2414 0.4590 +v -0.5400 0.1960 0.4268 +v -0.7087 0.2895 0.4950 +v -0.8040 0.3418 0.5030 +v -0.9001 0.3976 0.4907 +v -0.6243 0.2697 0.5555 +v -0.5371 0.2261 0.5214 +v -0.7147 0.3219 0.5962 +v -0.8068 0.3760 0.6066 +v -0.8961 0.4273 0.5963 +v -0.6187 0.3009 0.6486 +v -0.5395 0.2613 0.6112 +v -0.6997 0.3411 0.6892 +v -0.7860 0.3915 0.7090 +v -0.8672 0.4579 0.7000 +v -0.5726 0.1548 0.1455 +v -0.9290 0.3395 0.1730 +v -1.0326 0.4243 0.1539 +v -1.0258 0.4345 0.2629 +v -0.9558 0.5365 0.6896 +v -0.9144 0.5617 0.7893 +v -0.8268 0.4808 0.7990 +v -0.5194 0.2938 0.7013 +v -0.6570 0.1920 0.1688 +v -1.0121 0.4411 0.3714 +v -0.7403 0.4081 0.8063 +v -0.7389 0.2239 0.1873 +v -0.9985 0.4653 0.4788 +v -0.6630 0.3702 0.7772 +v -0.8292 0.2685 0.1853 +v -0.9853 0.5058 0.5872 +v -0.5902 0.3330 0.7379 +v -1.2295 0.6790 0.3530 +v -1.1211 0.5424 0.3646 +v -1.1340 0.5344 0.2592 +v -1.2477 0.6721 0.2496 +v -1.3599 0.8370 0.3569 +v -1.3701 0.8266 0.2567 +v -1.4487 0.9954 0.3522 +v -1.4662 0.9784 0.2631 +v -1.4942 1.1520 0.3478 +v -1.5073 1.1278 0.2622 +v -1.2060 0.7028 0.4580 +v -1.0968 0.5645 0.4725 +v -1.3217 0.8578 0.4599 +v -1.4224 1.0216 0.4433 +v -1.4763 1.1722 0.4334 +v -1.1772 0.7410 0.5663 +v -1.0777 0.6045 0.5793 +v -1.2893 0.8925 0.5639 +v -1.3897 1.0459 0.5374 +v -1.4561 1.1941 0.5177 +v -1.1446 0.7699 0.6721 +v -1.0433 0.6394 0.6778 +v -1.2595 0.9204 0.6606 +v -1.3576 1.0699 0.6269 +v -1.4236 1.2175 0.5974 +v -1.1393 0.5341 0.1531 +v -1.5196 1.1226 0.1804 +v -1.5729 1.2707 0.1619 +v -1.5583 1.2758 0.2379 +v -1.4658 1.3491 0.5415 +v -1.4395 1.3673 0.6241 +v -1.3966 1.2430 0.6756 +v -1.0123 0.6750 0.7813 +v -1.2535 0.6669 0.1486 +v -1.5414 1.2909 0.3124 +v -1.3331 1.0960 0.7188 +v -1.3780 0.8105 0.1617 +v -1.5198 1.3086 0.3841 +v -1.2337 0.9498 0.7580 +v -1.4652 0.9666 0.1759 +v -1.4968 1.3301 0.4602 +v -1.1228 0.8002 0.7806 +v -1.5702 1.5377 0.2668 +v -1.5662 1.4198 0.2950 +v -1.5840 1.4086 0.2263 +v -1.5884 1.5300 0.2059 +v -1.5623 1.6460 0.2328 +v -1.5788 1.6415 0.1830 +v -1.5545 1.7436 0.1991 +v -1.5679 1.7417 0.1602 +v -1.5448 1.8296 0.1721 +v -1.5496 1.8312 0.1432 +v -1.5467 1.5439 0.3265 +v -1.5387 1.4250 0.3600 +v -1.5417 1.6539 0.2835 +v -1.5401 1.7452 0.2418 +v -1.5376 1.8262 0.2044 +v -1.5146 1.5543 0.3850 +v -1.5062 1.4461 0.4242 +v -1.5186 1.6551 0.3348 +v -1.5190 1.7507 0.2852 +v -1.5300 1.8233 0.2367 +v -1.4865 1.5697 0.4452 +v -1.4801 1.4639 0.4946 +v -1.4982 1.6640 0.3834 +v -1.5071 1.7482 0.3242 +v -1.5196 1.8217 0.2648 +v -1.6007 1.4035 0.1556 +v -1.5519 1.8350 0.1210 +v -1.5295 1.9120 0.1244 +v -1.5296 1.9096 0.1391 +v -1.5278 1.8802 0.2015 +v -1.5249 1.8652 0.2134 +v -1.5114 1.8147 0.2885 +v -1.4489 1.4799 0.5696 +v -1.6035 1.5283 0.1444 +v -1.5300 1.9055 0.1544 +v -1.4958 1.7465 0.3573 +v -1.5908 1.6414 0.1359 +v -1.5300 1.8992 0.1700 +v -1.4773 1.6691 0.4306 +v -1.5735 1.7428 0.1270 +v -1.5301 1.8909 0.1860 +v -1.4613 1.5805 0.5084 +v -0.2100 0.0770 -0.1752 +v -0.1559 0.0625 -0.1495 +v -0.1634 0.0858 -0.2054 +v -0.2138 0.1056 -0.2415 +v -0.2695 0.0939 -0.2005 +v -0.2668 0.1294 -0.2752 +v -0.3363 0.1220 -0.2137 +v -0.3318 0.1528 -0.2972 +v -0.4037 0.1536 -0.2359 +v -0.4013 0.1856 -0.3278 +v -0.2065 0.0631 -0.1042 +v -0.1565 0.0483 -0.0909 +v -0.2640 0.0798 -0.1204 +v -0.3290 0.1002 -0.1282 +v -0.4001 0.1264 -0.1441 +v -0.2090 0.0504 -0.0341 +v -0.1570 0.0355 -0.0310 +v -0.2689 0.0688 -0.0408 +v -0.3343 0.0849 -0.0447 +v -0.4065 0.1088 -0.0537 +v -0.2054 0.0432 0.0332 +v -0.1519 0.0339 0.0266 +v -0.2663 0.0658 0.0356 +v -0.3337 0.0842 0.0381 +v -0.4063 0.1026 0.0359 +v -0.1120 0.0790 -0.1609 +v -0.1194 0.1064 -0.2047 +v -0.1590 0.1245 -0.2591 +v -0.3998 0.2151 -0.4235 +v -0.4752 0.2306 -0.4511 +v -0.4795 0.2102 -0.3475 +v -0.4906 0.1269 0.0437 +v -0.1060 0.0283 0.0258 +v -0.2096 0.1462 -0.3049 +v -0.4756 0.1855 -0.2456 +v -0.1100 0.0275 -0.0211 +v -0.2704 0.1676 -0.3509 +v -0.4800 0.1621 -0.1479 +v -0.1113 0.0387 -0.0679 +v -0.3326 0.1927 -0.3844 +v -0.4835 0.1353 -0.0512 +v -0.1110 0.0583 -0.1138 +v -0.6417 0.2391 -0.2517 +v -0.5573 0.2110 -0.2581 +v -0.5559 0.2345 -0.3638 +v -0.6384 0.2624 -0.3583 +v -0.7288 0.2756 -0.2466 +v -0.7254 0.2923 -0.3589 +v -0.8165 0.3187 -0.2565 +v -0.8133 0.3396 -0.3726 +v -0.9096 0.3774 -0.2721 +v -0.9044 0.3962 -0.3863 +v -0.6423 0.2174 -0.1422 +v -0.5607 0.1883 -0.1526 +v -0.7314 0.2499 -0.1342 +v -0.8164 0.2943 -0.1439 +v -0.9132 0.3545 -0.1588 +v -0.6488 0.1921 -0.0340 +v -0.5674 0.1618 -0.0495 +v -0.7360 0.2263 -0.0234 +v -0.8226 0.2735 -0.0320 +v -0.9200 0.3409 -0.0466 +v -0.6594 0.1886 0.0700 +v -0.5763 0.1541 0.0500 +v -0.7486 0.2215 0.0843 +v -0.8370 0.2713 0.0783 +v -0.9343 0.3428 0.0645 +v -0.5562 0.2495 -0.4695 +v -0.9061 0.4218 -0.5004 +v -1.0014 0.4985 -0.5105 +v -1.0051 0.4791 -0.3968 +v -1.0387 0.4241 0.0451 +v -0.6405 0.2848 -0.4662 +v -1.0131 0.4482 -0.2852 +v -0.7273 0.3201 -0.4694 +v -1.0170 0.4301 -0.1746 +v -0.8153 0.3653 -0.4855 +v -1.0289 0.4226 -0.0643 +v -1.2403 0.6760 -0.2662 +v -1.1262 0.5473 -0.2759 +v -1.1115 0.5802 -0.3838 +v -1.2256 0.7060 -0.3691 +v -1.3435 0.8247 -0.2343 +v -1.3328 0.8545 -0.3326 +v -1.4351 0.9846 -0.2010 +v -1.4168 1.0022 -0.2985 +v -1.4961 1.1479 -0.1653 +v -1.4765 1.1532 -0.2530 +v -1.2571 0.6615 -0.1610 +v -1.1354 0.5333 -0.1677 +v -1.3574 0.8185 -0.1338 +v -1.4494 0.9820 -0.1023 +v -1.5099 1.1465 -0.0769 +v -1.2574 0.6598 -0.0559 +v -1.1407 0.5286 -0.0604 +v -1.3661 0.8161 -0.0324 +v -1.4549 0.9823 -0.0059 +v -1.5202 1.1426 0.0120 +v -1.2572 0.6597 0.0475 +v -1.1461 0.5336 0.0465 +v -1.3674 0.8107 0.0666 +v -1.4666 0.9693 0.0873 +v -1.5201 1.1322 0.0984 +v -1.1046 0.6111 -0.4910 +v -1.4554 1.1747 -0.3402 +v -1.4860 1.3033 -0.3208 +v -1.5197 1.2904 -0.2384 +v -1.5803 1.2737 0.0844 +v -1.2032 0.7317 -0.4707 +v -1.5409 1.2885 -0.1547 +v -1.3112 0.8740 -0.4257 +v -1.5619 1.2868 -0.0737 +v -1.3922 1.0263 -0.3917 +v -1.5730 1.2805 0.0059 +v -1.5960 1.5317 -0.0935 +v -1.5789 1.4113 -0.1223 +v -1.5544 1.4142 -0.1951 +v -1.5723 1.5310 -0.1543 +v -1.5795 1.6431 -0.0679 +v -1.5653 1.6355 -0.1210 +v -1.5691 1.7406 -0.0363 +v -1.5593 1.7357 -0.0774 +v -1.5581 1.8269 0.0053 +v -1.5564 1.8184 -0.0247 +v -1.6086 1.5327 -0.0352 +v -1.6010 1.4128 -0.0537 +v -1.5861 1.6422 -0.0146 +v -1.5795 1.7447 0.0083 +v -1.5613 1.8320 0.0382 +v -1.6113 1.5307 0.0239 +v -1.6117 1.4092 0.0151 +v -1.5936 1.6427 0.0379 +v -1.5815 1.7442 0.0528 +v -1.5587 1.8328 0.0703 +v -1.6134 1.5289 0.0837 +v -1.6115 1.4058 0.0846 +v -1.5957 1.6424 0.0885 +v -1.5775 1.7437 0.0934 +v -1.5546 1.8348 0.0989 +v -1.5222 1.4200 -0.2722 +v -1.5567 1.8087 -0.0504 +v -1.5391 1.8881 0.0241 +v -1.5346 1.8943 0.0467 +v -1.5296 1.9128 0.1096 +v -1.5481 1.5282 -0.2190 +v -1.5333 1.9018 0.0644 +v -1.5502 1.6319 -0.1708 +v -1.5322 1.9078 0.0801 +v -1.5479 1.7235 -0.1135 +v -1.5306 1.9110 0.0949 +v -0.1543 0.0293 0.1348 +v -0.1567 0.0333 0.1921 +v -0.2091 0.0430 0.2255 +v -0.2089 0.0394 0.1578 +v -0.2671 0.0544 0.2555 +v -0.2706 0.0552 0.1805 +v -0.3307 0.0598 0.2828 +v -0.3360 0.0592 0.2020 +v -0.4020 0.0762 0.3033 +v -0.4074 0.0766 0.2171 +v -0.1504 0.0473 0.2539 +v -0.2009 0.0575 0.2926 +v -0.2572 0.0689 0.3297 +v -0.3222 0.0776 0.3612 +v -0.3935 0.0954 0.3881 +v -0.1430 0.0732 0.3156 +v -0.1942 0.0818 0.3619 +v -0.2538 0.0890 0.4053 +v -0.3159 0.1053 0.4407 +v -0.3825 0.1340 0.4748 +v -0.1378 0.1111 0.3750 +v -0.1879 0.1188 0.4299 +v -0.2404 0.1283 0.4804 +v -0.3089 0.1534 0.5200 +v -0.3834 0.1767 0.5622 +v -0.1085 0.0098 0.0747 +v -0.1086 0.0176 0.1220 +v -0.1546 0.0211 0.0811 +v -0.4898 0.1059 0.2321 +v -0.4942 0.1065 0.1401 +v -0.4126 0.0848 0.1269 +v -0.4521 0.2427 0.6776 +v -0.4624 0.2095 0.5908 +v -0.3812 0.2207 0.6402 +v -0.0932 0.1023 0.3136 +v -0.0847 0.1402 0.3634 +v -0.1289 0.1520 0.4322 +v -0.2095 0.0282 0.0942 +v -0.4780 0.1118 0.3212 +v -0.3102 0.1967 0.5948 +v -0.1002 0.0702 0.2661 +v -0.2717 0.0469 0.1069 +v -0.4713 0.1332 0.4102 +v -0.2413 0.1764 0.5487 +v -0.1081 0.0430 0.2179 +v -0.3392 0.0674 0.1195 +v -0.4620 0.1659 0.5011 +v -0.1792 0.1656 0.4965 +v -0.1079 0.0240 0.1692 +v -0.5764 0.1394 0.2426 +v -0.5591 0.1535 0.3394 +v -0.6439 0.1964 0.3690 +v -0.6594 0.1774 0.2694 +v -0.7324 0.2452 0.3962 +v -0.7432 0.2187 0.2919 +v -0.8256 0.2907 0.4020 +v -0.8347 0.2685 0.2928 +v -0.9247 0.3559 0.3915 +v -0.9346 0.3386 0.2836 +v -0.5488 0.1793 0.4338 +v -0.6277 0.2245 0.4665 +v -0.7174 0.2710 0.5001 +v -0.8169 0.3245 0.5100 +v -0.9131 0.3802 0.4981 +v -0.5454 0.2094 0.5284 +v -0.6332 0.2535 0.5633 +v -0.7254 0.3042 0.6038 +v -0.8190 0.3593 0.6136 +v -0.9105 0.4102 0.6025 +v -0.5460 0.2424 0.6202 +v -0.6262 0.2819 0.6577 +v -0.7091 0.3219 0.6983 +v -0.7959 0.3740 0.7170 +v -0.8799 0.4402 0.7088 +v -0.5807 0.1358 0.1468 +v -1.0396 0.4179 0.2636 +v -1.0474 0.4101 0.1550 +v -0.9401 0.3246 0.1752 +v -0.9287 0.5489 0.7979 +v -0.9696 0.5236 0.6989 +v -0.8386 0.4671 0.8082 +v -0.5235 0.2744 0.7090 +v -0.6669 0.1733 0.1713 +v -1.0256 0.4250 0.3734 +v -0.7497 0.3912 0.8179 +v -0.7519 0.2028 0.1896 +v -1.0120 0.4499 0.4827 +v -0.6711 0.3504 0.7891 +v -0.8401 0.2515 0.1867 +v -1.0022 0.4912 0.5915 +v -0.5974 0.3154 0.7482 +v -1.1486 0.5216 0.2603 +v -1.1377 0.5282 0.3678 +v -1.2443 0.6702 0.3553 +v -1.2628 0.6632 0.2519 +v -1.3753 0.8265 0.3585 +v -1.3862 0.8147 0.2591 +v -1.4674 0.9882 0.3595 +v -1.4864 0.9669 0.2666 +v -1.5140 1.1447 0.3519 +v -1.5265 1.1235 0.2657 +v -1.1117 0.5535 0.4742 +v -1.2217 0.6946 0.4607 +v -1.3362 0.8505 0.4622 +v -1.4401 1.0148 0.4509 +v -1.4958 1.1665 0.4404 +v -1.0940 0.5930 0.5840 +v -1.1918 0.7340 0.5689 +v -1.3037 0.8855 0.5684 +v -1.4074 1.0388 0.5439 +v -1.4752 1.1899 0.5261 +v -1.0603 0.6266 0.6876 +v -1.1601 0.7618 0.6759 +v -1.2759 0.9118 0.6669 +v -1.3756 1.0636 0.6365 +v -1.4427 1.2120 0.6097 +v -1.1558 0.5194 0.1523 +v -1.5786 1.2734 0.2437 +v -1.5928 1.2657 0.1653 +v -1.5382 1.1153 0.1830 +v -1.4597 1.3682 0.6322 +v -1.4859 1.3495 0.5493 +v -1.4170 1.2401 0.6849 +v -1.0256 0.6643 0.7879 +v -1.2681 0.6523 0.1511 +v -1.5602 1.2864 0.3205 +v -1.3507 1.0895 0.7256 +v -1.3950 0.7998 0.1621 +v -1.5391 1.3021 0.3949 +v -1.2493 0.9425 0.7663 +v -1.4841 0.9541 0.1750 +v -1.5156 1.3278 0.4678 +v -1.1393 0.7903 0.7840 +v -1.6035 1.4062 0.2311 +v -1.5861 1.4176 0.3000 +v -1.5896 1.5376 0.2698 +v -1.6087 1.5324 0.2063 +v -1.5813 1.6491 0.2393 +v -1.5987 1.6462 0.1880 +v -1.5742 1.7494 0.2065 +v -1.5874 1.7462 0.1658 +v -1.5644 1.8374 0.1756 +v -1.5690 1.8381 0.1456 +v -1.5573 1.4219 0.3684 +v -1.5648 1.5425 0.3322 +v -1.5601 1.6568 0.2916 +v -1.5595 1.7517 0.2493 +v -1.5567 1.8348 0.2085 +v -1.5256 1.4431 0.4344 +v -1.5325 1.5527 0.3934 +v -1.5370 1.6567 0.3430 +v -1.5389 1.7552 0.2921 +v -1.5493 1.8321 0.2412 +v -1.4989 1.4658 0.5015 +v -1.5053 1.5710 0.4534 +v -1.5173 1.6656 0.3933 +v -1.5280 1.7512 0.3334 +v -1.5379 1.8312 0.2707 +v -1.6207 1.4031 0.1592 +v -1.5493 1.9179 0.1399 +v -1.5492 1.9217 0.1239 +v -1.5718 1.8397 0.1213 +v -1.5433 1.8761 0.2200 +v -1.5480 1.8879 0.2055 +v -1.5303 1.8208 0.2937 +v -1.4692 1.4817 0.5767 +v -1.6239 1.5287 0.1436 +v -1.5501 1.9124 0.1562 +v -1.5150 1.7510 0.3678 +v -1.6111 1.6441 0.1394 +v -1.5502 1.9074 0.1727 +v -1.4955 1.6745 0.4399 +v -1.5938 1.7483 0.1300 +v -1.5504 1.8988 0.1894 +v -1.4805 1.5846 0.5160 +v -0.1582 0.0668 -0.2179 +v -0.1546 0.0424 -0.1605 +v -0.2104 0.0578 -0.1829 +v -0.2101 0.0876 -0.2532 +v -0.2720 0.0746 -0.2059 +v -0.2660 0.1107 -0.2863 +v -0.3386 0.1039 -0.2193 +v -0.3349 0.1346 -0.3068 +v -0.4095 0.1354 -0.2406 +v -0.4059 0.1670 -0.3356 +v -0.1537 0.0280 -0.0975 +v -0.2077 0.0429 -0.1111 +v -0.2662 0.0597 -0.1231 +v -0.3324 0.0803 -0.1342 +v -0.4051 0.1076 -0.1474 +v -0.1576 0.0151 -0.0345 +v -0.2109 0.0310 -0.0392 +v -0.2705 0.0495 -0.0435 +v -0.3378 0.0647 -0.0487 +v -0.4103 0.0895 -0.0556 +v -0.1565 0.0133 0.0259 +v -0.2084 0.0234 0.0302 +v -0.2686 0.0468 0.0332 +v -0.3370 0.0643 0.0360 +v -0.4115 0.0823 0.0355 +v -0.1097 0.0911 -0.2201 +v -0.1073 0.0600 -0.1720 +v -0.1515 0.1081 -0.2715 +v -0.4857 0.1899 -0.3502 +v -0.4795 0.2088 -0.4566 +v -0.4049 0.1951 -0.4301 +v -0.4927 0.1061 0.0454 +v -0.1117 0.0083 0.0257 +v -0.2077 0.1267 -0.3157 +v -0.4825 0.1662 -0.2491 +v -0.1114 0.0066 -0.0246 +v -0.2716 0.1493 -0.3599 +v -0.4852 0.1433 -0.1489 +v -0.1100 0.0190 -0.0755 +v -0.3368 0.1741 -0.3915 +v -0.4897 0.1159 -0.0510 +v -0.1071 0.0381 -0.1244 +v -0.5638 0.2144 -0.3671 +v -0.5622 0.1916 -0.2594 +v -0.6492 0.2199 -0.2536 +v -0.6449 0.2441 -0.3643 +v -0.7402 0.2581 -0.2493 +v -0.7349 0.2742 -0.3630 +v -0.8287 0.2997 -0.2613 +v -0.8269 0.3203 -0.3749 +v -0.9200 0.3605 -0.2760 +v -0.9168 0.3791 -0.3910 +v -0.5686 0.1694 -0.1535 +v -0.6519 0.1976 -0.1417 +v -0.7413 0.2309 -0.1357 +v -0.8284 0.2766 -0.1467 +v -0.9247 0.3365 -0.1608 +v -0.5739 0.1427 -0.0507 +v -0.6583 0.1722 -0.0327 +v -0.7465 0.2068 -0.0231 +v -0.8353 0.2564 -0.0322 +v -0.9314 0.3241 -0.0469 +v -0.5826 0.1355 0.0499 +v -0.6694 0.1688 0.0721 +v -0.7582 0.2015 0.0859 +v -0.8499 0.2554 0.0794 +v -0.9461 0.3261 0.0653 +v -0.5608 0.2299 -0.4742 +v -1.0180 0.4665 -0.4029 +v -1.0146 0.4856 -0.5166 +v -0.9199 0.4054 -0.5058 +v -1.0504 0.4104 0.0453 +v -0.6481 0.2663 -0.4704 +v -1.0265 0.4336 -0.2898 +v -0.7365 0.3007 -0.4743 +v -1.0296 0.4148 -0.1768 +v -0.8257 0.3491 -0.4918 +v -1.0410 0.4088 -0.0652 +v -1.1270 0.5685 -0.3909 +v -1.1414 0.5324 -0.2808 +v -1.2567 0.6663 -0.2709 +v -1.2428 0.6963 -0.3773 +v -1.3599 0.8159 -0.2404 +v -1.3506 0.8461 -0.3408 +v -1.4538 0.9799 -0.2035 +v -1.4345 0.9972 -0.3025 +v -1.5152 1.1414 -0.1710 +v -1.4956 1.1508 -0.2594 +v -1.1494 0.5172 -0.1724 +v -1.2734 0.6507 -0.1632 +v -1.3761 0.8095 -0.1373 +v -1.4662 0.9759 -0.1062 +v -1.5288 1.1374 -0.0796 +v -1.1543 0.5145 -0.0642 +v -1.2730 0.6493 -0.0562 +v -1.3846 0.8049 -0.0353 +v -1.4737 0.9756 -0.0104 +v -1.5402 1.1324 0.0112 +v -1.1614 0.5196 0.0442 +v -1.2739 0.6468 0.0488 +v -1.3838 0.8002 0.0650 +v -1.4849 0.9624 0.0842 +v -1.5392 1.1234 0.0992 +v -1.1198 0.5972 -0.4998 +v -1.5398 1.2897 -0.2413 +v -1.5060 1.3042 -0.3286 +v -1.4743 1.1702 -0.3457 +v -1.5999 1.2693 0.0860 +v -1.2208 0.7187 -0.4797 +v -1.5593 1.2839 -0.1575 +v -1.3283 0.8648 -0.4368 +v -1.5812 1.2803 -0.0753 +v -1.4101 1.0200 -0.3979 +v -1.5926 1.2742 0.0058 +v -1.5743 1.4128 -0.1997 +v -1.5978 1.4104 -0.1278 +v -1.6156 1.5312 -0.1022 +v -1.5915 1.5307 -0.1620 +v -1.5988 1.6448 -0.0728 +v -1.5848 1.6388 -0.1257 +v -1.5894 1.7444 -0.0390 +v -1.5789 1.7391 -0.0824 +v -1.5772 1.8322 0.0013 +v -1.5762 1.8225 -0.0296 +v -1.6211 1.4096 -0.0557 +v -1.6294 1.5315 -0.0411 +v -1.6063 1.6461 -0.0183 +v -1.5994 1.7474 0.0068 +v -1.5804 1.8371 0.0343 +v -1.6321 1.4059 0.0155 +v -1.6320 1.5303 0.0201 +v -1.6139 1.6456 0.0367 +v -1.6024 1.7485 0.0521 +v -1.5785 1.8381 0.0670 +v -1.6316 1.4028 0.0866 +v -1.6341 1.5277 0.0815 +v -1.6161 1.6435 0.0899 +v -1.5984 1.7490 0.0940 +v -1.5746 1.8397 0.0969 +v -1.5396 1.4208 -0.2778 +v -1.5548 1.8947 0.0439 +v -1.5589 1.8817 0.0262 +v -1.5771 1.8118 -0.0538 +v -1.5492 1.9212 0.1080 +v -1.5663 1.5283 -0.2253 +v -1.5539 1.9041 0.0612 +v -1.5688 1.6335 -0.1777 +v -1.5519 1.9122 0.0771 +v -1.5674 1.7261 -0.1199 +v -1.5503 1.9179 0.0925 +# 650 vertices + +vn 0.0813 0.9950 -0.0576 +vn 0.0918 0.9943 -0.0540 +vn 0.0517 0.9986 0.0085 +vn 0.0480 0.9988 0.0018 +vn 0.0498 0.9967 -0.0645 +vn 0.0077 0.9998 -0.0191 +vn 0.0552 0.9975 -0.0450 +vn -0.0672 0.9977 -0.0032 +vn 0.0581 0.9915 0.1168 +vn -0.0870 0.9896 0.1147 +vn 0.2112 0.9667 -0.1446 +vn 0.2454 0.9462 -0.2108 +vn 0.1808 0.9767 -0.1157 +vn 0.2286 0.9697 -0.0866 +vn 0.2522 0.9653 0.0676 +vn 0.3450 0.8871 -0.3065 +vn 0.3726 0.8244 -0.4261 +vn 0.3210 0.9305 -0.1766 +vn 0.3632 0.9298 -0.0604 +vn 0.3666 0.9292 0.0472 +vn 0.4564 0.7915 -0.4064 +vn 0.4542 0.6934 -0.5594 +vn 0.4818 0.8349 -0.2662 +vn 0.4620 0.8806 -0.1052 +vn 0.4134 0.9104 -0.0176 +vn 0.0741 0.9969 0.0277 +vn 0.0214 0.9985 0.0506 +vn 0.0750 0.9970 -0.0203 +vn -0.0800 0.9936 0.0803 +vn -0.0568 0.9907 0.1237 +vn -0.0170 0.9838 0.1785 +vn 0.3421 0.9351 0.0926 +vn 0.3331 0.9402 0.0715 +vn 0.4441 0.8895 -0.1074 +vn 0.4972 0.6326 -0.5938 +vn 0.4588 0.6470 -0.6090 +vn 0.4263 0.6531 -0.6259 +vn 0.0660 0.9977 0.0123 +vn 0.0879 0.9668 0.2399 +vn 0.4799 0.8645 -0.1494 +vn 0.4102 0.7120 -0.5699 +vn -0.0224 0.9947 0.1004 +vn 0.2175 0.9473 0.2352 +vn 0.5416 0.7881 -0.2925 +vn 0.3152 0.8851 -0.3423 +vn -0.0894 0.9919 0.0901 +vn 0.3273 0.9337 0.1455 +vn 0.5090 0.7562 -0.4112 +vn 0.1330 0.9873 -0.0871 +vn 0.1825 0.9543 0.2366 +vn 0.1503 0.9589 0.2408 +vn 0.0428 0.9769 0.2093 +vn 0.0712 0.9670 0.2445 +vn 0.1884 0.9446 0.2687 +vn 0.1169 0.9586 0.2598 +vn 0.1843 0.9198 0.3463 +vn 0.1074 0.9254 0.3634 +vn 0.1437 0.8884 0.4360 +vn 0.0794 0.8858 0.4572 +vn 0.1992 0.9506 0.2380 +vn 0.1979 0.9423 0.2700 +vn 0.1960 0.9426 0.2705 +vn 0.2045 0.9194 0.3359 +vn 0.1818 0.8846 0.4294 +vn 0.2032 0.9541 0.2201 +vn 0.2482 0.9467 0.2052 +vn 0.1666 0.9417 0.2923 +vn 0.1835 0.9103 0.3712 +vn 0.2240 0.8581 0.4620 +vn 0.2939 0.9460 0.1366 +vn 0.3034 0.9433 0.1348 +vn 0.2557 0.9429 0.2136 +vn 0.2324 0.8796 0.4150 +vn 0.2922 0.8103 0.5079 +vn -0.0376 0.9804 0.1935 +vn -0.0164 0.8837 0.4677 +vn -0.0271 0.8457 0.5330 +vn 0.0335 0.8518 0.5227 +vn 0.3171 0.7459 0.5858 +vn 0.3413 0.7435 0.5751 +vn 0.3232 0.7878 0.5244 +vn 0.3127 0.9396 0.1389 +vn -0.0080 0.9771 0.2125 +vn 0.1128 0.8546 0.5070 +vn 0.3129 0.8819 0.3526 +vn 0.0355 0.9723 0.2310 +vn 0.2072 0.8318 0.5149 +vn 0.3348 0.9331 0.1313 +vn 0.0118 0.9304 0.3663 +vn 0.2660 0.7809 0.5652 +vn 0.3289 0.9365 0.1217 +vn 0.1496 0.7368 0.6593 +vn 0.1250 0.7800 0.6132 +vn 0.0085 0.7920 0.6105 +vn 0.0264 0.7564 0.6536 +vn 0.1752 0.6846 0.7076 +vn 0.0621 0.7101 0.7013 +vn 0.1947 0.5417 0.8177 +vn 0.0588 0.5508 0.8325 +vn 0.1549 0.4205 0.8940 +vn 0.0929 0.4490 0.8887 +vn 0.2557 0.7007 0.6661 +vn 0.2321 0.7471 0.6228 +vn 0.3015 0.6594 0.6887 +vn 0.2792 0.5411 0.7933 +vn 0.1938 0.4118 0.8904 +vn 0.2919 0.6799 0.6727 +vn 0.2990 0.7112 0.6363 +vn 0.3062 0.6454 0.6998 +vn 0.3121 0.5474 0.7765 +vn 0.2789 0.4014 0.8724 +vn 0.2656 0.6886 0.6748 +vn 0.3243 0.7064 0.6292 +vn 0.2811 0.6480 0.7079 +vn 0.2850 0.5411 0.7912 +vn 0.3115 0.4006 0.8617 +vn -0.0452 0.7889 0.6129 +vn -0.0175 0.4822 0.8759 +vn 0.0412 0.4349 0.8995 +vn 0.1369 0.4005 0.9060 +vn 0.2708 0.2258 0.9358 +vn 0.2424 0.2461 0.9385 +vn 0.2866 0.4103 0.8657 +vn 0.3296 0.7189 0.6120 +vn -0.0125 0.7717 0.6358 +vn 0.2043 0.3635 0.9089 +vn 0.2501 0.5439 0.8010 +vn -0.0530 0.7041 0.7081 +vn 0.2402 0.3037 0.9220 +vn 0.2602 0.6511 0.7130 +vn -0.0686 0.5625 0.8239 +vn 0.2495 0.2423 0.9376 +vn 0.2395 0.7010 0.6717 +vn 0.2388 0.0806 0.9677 +vn 0.2433 0.2281 0.9428 +vn 0.1641 0.2596 0.9517 +vn 0.1819 0.1089 0.9773 +vn 0.2473 0.0125 0.9689 +vn 0.2004 0.0293 0.9793 +vn 0.2362 -0.0013 0.9717 +vn 0.1698 -0.0158 0.9853 +vn 0.1404 -0.0333 0.9895 +vn 0.0868 -0.0592 0.9945 +vn 0.3369 0.0586 0.9397 +vn 0.3399 0.1925 0.9206 +vn 0.3081 -0.0083 0.9513 +vn 0.2862 0.0082 0.9581 +vn 0.1685 0.0037 0.9857 +vn 0.3528 0.0618 0.9337 +vn 0.3059 0.1359 0.9423 +vn 0.3136 0.0068 0.9495 +vn 0.2843 0.0412 0.9579 +vn 0.2414 0.0033 0.9704 +vn 0.2969 0.0640 0.9528 +vn 0.2776 0.1135 0.9540 +vn 0.3040 0.0351 0.9520 +vn 0.2471 0.0553 0.9674 +vn 0.3122 -0.0573 0.9483 +vn 0.1018 0.2829 0.9537 +vn 0.0580 -0.0756 0.9954 +vn -0.0259 -0.1190 0.9926 +vn -0.0157 -0.0931 0.9955 +vn 0.2460 -0.0613 0.9673 +vn 0.2812 -0.4770 -0.8327 +vn 0.2958 0.0198 0.9551 +vn 0.2776 0.1104 0.9543 +vn 0.1211 0.1204 0.9853 +vn 0.0046 -0.0614 0.9981 +vn 0.2651 0.0513 0.9629 +vn 0.1039 0.0266 0.9942 +vn 0.0294 -0.0182 0.9994 +vn 0.3102 0.0383 0.9499 +vn 0.0741 -0.0269 0.9969 +vn 0.0387 0.0282 0.9989 +vn 0.2811 0.0641 0.9575 +vn -0.3369 0.9404 -0.0460 +vn -0.3559 0.9096 -0.2144 +vn -0.5047 0.7995 -0.3257 +vn -0.5239 0.8352 -0.1675 +vn -0.3632 0.9308 0.0405 +vn -0.4939 0.8674 -0.0611 +vn -0.3624 0.9245 0.1181 +vn -0.4368 0.8987 0.0383 +vn -0.3577 0.9207 0.1562 +vn -0.3714 0.9266 0.0587 +vn -0.2460 0.9683 0.0435 +vn -0.2991 0.9518 -0.0686 +vn -0.2251 0.9723 0.0636 +vn -0.2596 0.9592 0.1119 +vn -0.3000 0.9410 0.1567 +vn -0.1948 0.9759 0.0985 +vn -0.1902 0.9817 0.0073 +vn -0.1568 0.9846 0.0775 +vn -0.1661 0.9824 0.0852 +vn -0.2107 0.9691 0.1281 +vn -0.0687 0.9940 0.0856 +vn -0.0013 0.9996 -0.0298 +vn -0.0858 0.9876 0.1318 +vn -0.0567 0.9953 0.0783 +vn -0.0854 0.9921 0.0921 +vn -0.4537 0.7741 -0.4415 +vn -0.5360 0.6572 -0.5299 +vn -0.5713 0.7419 -0.3509 +vn -0.3135 0.9492 -0.0279 +vn -0.2367 0.9716 -0.0005 +vn -0.2858 0.9571 0.0477 +vn -0.1188 0.9848 0.1268 +vn -0.0007 0.9997 -0.0254 +vn -0.5395 0.8131 -0.2189 +vn -0.3063 0.9447 0.1173 +vn -0.1494 0.9877 -0.0460 +vn -0.4807 0.8728 -0.0850 +vn -0.3191 0.9353 0.1529 +vn -0.3282 0.9372 -0.1179 +vn -0.4186 0.9080 -0.0161 +vn -0.2465 0.9588 0.1411 +vn -0.3722 0.8818 -0.2897 +vn -0.2725 0.9466 0.1726 +vn -0.2756 0.9547 0.1117 +vn -0.2476 0.9635 0.1019 +vn -0.2524 0.9547 0.1575 +vn -0.2610 0.9395 0.2220 +vn -0.2533 0.9455 0.2047 +vn -0.2533 0.9220 0.2929 +vn -0.2602 0.9187 0.2970 +vn -0.2514 0.8984 0.3602 +vn -0.2632 0.8866 0.3803 +vn -0.2803 0.9444 0.1721 +vn -0.3009 0.9437 0.1371 +vn -0.2770 0.9348 0.2225 +vn -0.2615 0.9173 0.3003 +vn -0.2388 0.8971 0.3717 +vn -0.2269 0.9548 0.1920 +vn -0.2505 0.9551 0.1584 +vn -0.2220 0.9442 0.2435 +vn -0.2148 0.9154 0.3404 +vn -0.1860 0.8943 0.4071 +vn -0.0883 0.9769 0.1946 +vn -0.1162 0.9768 0.1799 +vn -0.0934 0.9634 0.2511 +vn -0.1212 0.9171 0.3799 +vn -0.1148 0.8861 0.4492 +vn -0.2179 0.9702 0.1062 +vn -0.2530 0.8793 0.4035 +vn -0.2548 0.8192 0.5138 +vn -0.2901 0.8227 0.4889 +vn -0.0981 0.8466 0.5231 +vn -0.2668 0.9460 0.1841 +vn -0.2763 0.8493 0.4498 +vn -0.2852 0.9327 0.2210 +vn -0.2206 0.8617 0.4569 +vn -0.2667 0.9179 0.2938 +vn -0.1709 0.8542 0.4911 +vn -0.3287 0.6856 0.6496 +vn -0.3091 0.7766 0.5489 +vn -0.3413 0.7468 0.5708 +vn -0.3729 0.6666 0.6454 +vn -0.2863 0.6212 0.7295 +vn -0.3564 0.5937 0.7214 +vn -0.2788 0.5222 0.8059 +vn -0.3631 0.4815 0.7977 +vn -0.2832 0.4458 0.8491 +vn -0.3455 0.4169 0.8407 +vn -0.2048 0.7213 0.6617 +vn -0.1925 0.8118 0.5514 +vn -0.2123 0.6271 0.7495 +vn -0.1942 0.5495 0.8126 +vn -0.2292 0.4793 0.8472 +vn -0.1065 0.7467 0.6566 +vn -0.1306 0.8064 0.5768 +vn -0.1609 0.6490 0.7436 +vn -0.1959 0.5438 0.8160 +vn -0.1751 0.5119 0.8410 +vn -0.0684 0.7593 0.6471 +vn -0.0719 0.7964 0.6004 +vn -0.1516 0.6753 0.7218 +vn -0.1667 0.5538 0.8158 +vn -0.1317 0.5024 0.8545 +vn -0.3350 0.7253 0.6014 +vn -0.3935 0.3896 0.8327 +vn -0.4720 0.2681 0.8398 +vn -0.4022 0.3299 0.8540 +vn -0.1007 0.4564 0.8841 +vn -0.3954 0.6476 0.6513 +vn -0.3334 0.3934 0.8568 +vn -0.3866 0.5849 0.7130 +vn -0.2848 0.4327 0.8553 +vn -0.4037 0.4610 0.7903 +vn -0.2154 0.4547 0.8642 +vn -0.3495 0.0711 0.9342 +vn -0.3804 0.2656 0.8858 +vn -0.4352 0.2153 0.8742 +vn -0.4260 0.0556 0.9030 +vn -0.2835 -0.0147 0.9588 +vn -0.3576 -0.0209 0.9336 +vn -0.3089 -0.0629 0.9490 +vn -0.3685 -0.0786 0.9263 +vn -0.2102 -0.1521 0.9658 +vn -0.1783 -0.0763 0.9810 +vn -0.2179 0.0826 0.9725 +vn -0.3035 0.2766 0.9118 +vn -0.2019 0.0037 0.9794 +vn -0.2022 -0.0274 0.9790 +vn -0.1116 -0.1345 0.9846 +vn -0.1247 0.0942 0.9877 +vn -0.1697 0.2996 0.9388 +vn -0.1474 0.0002 0.9891 +vn -0.0509 -0.0020 0.9987 +vn 0.0190 -0.0893 0.9958 +vn -0.0153 0.1071 0.9941 +vn -0.0237 0.3019 0.9530 +vn -0.0386 0.0064 0.9992 +vn 0.0297 -0.0174 0.9994 +vn 0.0469 -0.0847 0.9953 +vn -0.4618 0.2150 0.8605 +vn -0.0346 0.2520 0.9671 +vn 0.1032 0.1309 0.9860 +vn -0.1045 -0.1395 0.9847 +vn -0.0292 -0.1427 0.9893 +vn -0.4192 0.1184 0.9002 +vn -0.1349 -0.2059 0.9692 +vn -0.3703 -0.0012 0.9289 +vn -0.0638 -0.1923 0.9793 +vn -0.4140 -0.1053 0.9042 +vn -0.0314 -0.1664 0.9856 +vn -0.0453 -0.9989 -0.0117 +vn -0.0906 -0.9946 0.0513 +vn -0.0805 -0.9951 0.0569 +vn -0.0433 -0.9991 -0.0016 +vn -0.0531 -0.9960 0.0718 +vn -0.0037 -0.9996 0.0293 +vn -0.0687 -0.9960 0.0578 +vn 0.0749 -0.9972 0.0025 +vn -0.0615 -0.9893 -0.1325 +vn 0.0879 -0.9882 -0.1257 +vn -0.2609 -0.9372 0.2316 +vn -0.2202 -0.9635 0.1524 +vn -0.1878 -0.9754 0.1152 +vn -0.2366 -0.9682 0.0819 +vn -0.2607 -0.9623 -0.0772 +vn -0.3982 -0.8072 0.4357 +vn -0.3569 -0.8805 0.3121 +vn -0.3238 -0.9296 0.1760 +vn -0.3649 -0.9291 0.0599 +vn -0.3584 -0.9319 -0.0556 +vn -0.4626 -0.7095 0.5316 +vn -0.4612 -0.7696 0.4416 +vn -0.4801 -0.8319 0.2785 +vn -0.4603 -0.8802 0.1157 +vn -0.4073 -0.9130 0.0217 +vn -0.0303 -0.9980 -0.0551 +vn -0.0696 -0.9971 -0.0308 +vn -0.0777 -0.9968 0.0161 +vn 0.0106 -0.9842 -0.1768 +vn 0.0578 -0.9905 -0.1248 +vn 0.0796 -0.9935 -0.0817 +vn -0.3338 -0.9403 -0.0661 +vn -0.3386 -0.9369 -0.0874 +vn -0.4484 -0.8866 0.1133 +vn -0.4516 -0.6886 0.5674 +vn -0.4640 -0.6483 0.6036 +vn -0.4760 -0.7044 0.5265 +vn -0.0602 -0.9980 -0.0184 +vn -0.0970 -0.9649 -0.2439 +vn -0.4722 -0.8687 0.1495 +vn -0.4082 -0.7461 0.5260 +vn 0.0332 -0.9947 -0.0978 +vn -0.2155 -0.9460 -0.2420 +vn -0.5364 -0.7899 0.2972 +vn -0.3390 -0.8660 0.3676 +vn 0.0986 -0.9913 -0.0869 +vn -0.3195 -0.9365 -0.1446 +vn -0.4996 -0.7526 0.4290 +vn -0.1357 -0.9865 0.0913 +vn -0.0450 -0.9780 -0.2036 +vn -0.1588 -0.9588 -0.2354 +vn -0.1909 -0.9540 -0.2310 +vn -0.0776 -0.9689 -0.2350 +vn -0.1942 -0.9445 -0.2651 +vn -0.1283 -0.9561 -0.2633 +vn -0.1771 -0.9220 -0.3442 +vn -0.1017 -0.9192 -0.3805 +vn -0.1311 -0.8902 -0.4363 +vn -0.0671 -0.8879 -0.4552 +vn -0.2026 -0.9440 -0.2605 +vn -0.2018 -0.9517 -0.2316 +vn -0.1944 -0.9450 -0.2631 +vn -0.2014 -0.9222 -0.3301 +vn -0.1752 -0.8845 -0.4324 +vn -0.2366 -0.9491 -0.2077 +vn -0.1958 -0.9569 -0.2143 +vn -0.1600 -0.9437 -0.2896 +vn -0.1870 -0.9123 -0.3644 +vn -0.2235 -0.8575 -0.4634 +vn -0.2972 -0.9460 -0.1297 +vn -0.2829 -0.9497 -0.1340 +vn -0.2449 -0.9439 -0.2214 +vn -0.2350 -0.8792 -0.4145 +vn -0.3007 -0.8092 -0.5048 +vn 0.0439 -0.9810 -0.1890 +vn -0.0278 -0.8545 -0.5187 +vn 0.0360 -0.8471 -0.5303 +vn 0.0122 -0.8847 -0.4660 +vn -0.3485 -0.7334 -0.5836 +vn -0.3261 -0.7405 -0.5876 +vn -0.3403 -0.7839 -0.5193 +vn -0.3183 -0.9393 -0.1282 +vn 0.0056 -0.9813 -0.1923 +vn -0.1128 -0.8537 -0.5084 +vn -0.3089 -0.8765 -0.3691 +vn -0.0342 -0.9708 -0.2376 +vn -0.1973 -0.8253 -0.5291 +vn -0.3289 -0.9342 -0.1382 +vn -0.0074 -0.9209 -0.3898 +vn -0.2588 -0.7780 -0.5725 +vn -0.3337 -0.9375 -0.0982 +vn -0.0067 -0.7848 -0.6197 +vn -0.1286 -0.7736 -0.6205 +vn -0.1482 -0.7304 -0.6668 +vn -0.0451 -0.7565 -0.6525 +vn -0.1883 -0.6917 -0.6972 +vn -0.0721 -0.7185 -0.6918 +vn -0.2100 -0.5470 -0.8104 +vn -0.0630 -0.5539 -0.8302 +vn -0.1478 -0.4202 -0.8953 +vn -0.0854 -0.4435 -0.8922 +vn -0.2359 -0.7392 -0.6309 +vn -0.2607 -0.6940 -0.6711 +vn -0.3059 -0.6641 -0.6822 +vn -0.2867 -0.5506 -0.7840 +vn -0.1981 -0.4140 -0.8885 +vn -0.2742 -0.7026 -0.6567 +vn -0.2866 -0.6770 -0.6779 +vn -0.2930 -0.6546 -0.6969 +vn -0.3078 -0.5601 -0.7691 +vn -0.2704 -0.4030 -0.8744 +vn -0.3296 -0.6995 -0.6341 +vn -0.2513 -0.6826 -0.6862 +vn -0.2729 -0.6555 -0.7042 +vn -0.2845 -0.5506 -0.7848 +vn -0.3064 -0.4042 -0.8618 +vn 0.0404 -0.7900 -0.6118 +vn -0.1374 -0.3993 -0.9065 +vn -0.0381 -0.4330 -0.9006 +vn 0.0134 -0.4823 -0.8759 +vn -0.2399 -0.2405 -0.9405 +vn -0.2602 -0.2215 -0.9398 +vn -0.2946 -0.4074 -0.8644 +vn -0.3639 -0.7088 -0.6043 +vn -0.0007 -0.7709 -0.6369 +vn -0.1973 -0.3632 -0.9106 +vn -0.2618 -0.5476 -0.7947 +vn 0.0569 -0.7068 -0.7051 +vn -0.2392 -0.3046 -0.9219 +vn -0.2629 -0.6534 -0.7099 +vn 0.0867 -0.5614 -0.8230 +vn -0.2558 -0.2413 -0.9361 +vn -0.2356 -0.6939 -0.6805 +vn -0.1620 -0.2557 -0.9531 +vn -0.2406 -0.2215 -0.9450 +vn -0.2429 -0.0828 -0.9665 +vn -0.1824 -0.1094 -0.9771 +vn -0.2549 -0.0235 -0.9667 +vn -0.2017 -0.0358 -0.9788 +vn -0.2298 0.0010 -0.9732 +vn -0.1654 0.0154 -0.9861 +vn -0.1295 0.0322 -0.9911 +vn -0.0710 0.0594 -0.9957 +vn -0.3265 -0.1847 -0.9270 +vn -0.3329 -0.0614 -0.9410 +vn -0.3114 -0.0051 -0.9503 +vn -0.2890 -0.0100 -0.9573 +vn -0.1648 -0.0064 -0.9863 +vn -0.3055 -0.1333 -0.9428 +vn -0.3381 -0.0653 -0.9388 +vn -0.3035 -0.0271 -0.9524 +vn -0.2713 -0.0440 -0.9615 +vn -0.2412 -0.0005 -0.9705 +vn -0.2751 -0.1125 -0.9548 +vn -0.2914 -0.0676 -0.9542 +vn -0.3013 -0.0490 -0.9523 +vn -0.2443 -0.0466 -0.9686 +vn -0.3441 0.0963 -0.9340 +vn -0.1019 -0.2781 -0.9551 +vn 0.0135 0.0822 -0.9965 +vn 0.0302 0.1089 -0.9936 +vn -0.0520 0.0759 -0.9958 +vn -0.6642 0.6113 -0.4303 +vn -0.2452 0.0539 -0.9680 +vn -0.3249 0.0283 -0.9453 +vn -0.2641 -0.1101 -0.9582 +vn -0.1168 -0.1228 -0.9855 +vn 0.0137 0.0538 -0.9985 +vn -0.2868 -0.0410 -0.9571 +vn -0.0991 -0.0318 -0.9946 +vn -0.0079 0.0077 -0.9999 +vn -0.3164 -0.0429 -0.9477 +vn -0.0821 0.0274 -0.9962 +vn -0.0196 -0.0482 -0.9986 +vn -0.2730 -0.0682 -0.9596 +vn 0.5125 -0.7983 0.3163 +vn 0.3571 -0.9117 0.2033 +vn 0.3424 -0.9390 0.0328 +vn 0.5230 -0.8362 0.1653 +vn 0.3614 -0.9313 -0.0461 +vn 0.4900 -0.8699 0.0558 +vn 0.3633 -0.9236 -0.1219 +vn 0.4329 -0.9006 -0.0397 +vn 0.3489 -0.9250 -0.1506 +vn 0.3651 -0.9295 -0.0527 +vn 0.2879 -0.9551 0.0702 +vn 0.2423 -0.9691 -0.0458 +vn 0.2244 -0.9726 -0.0603 +vn 0.2663 -0.9570 -0.1148 +vn 0.3033 -0.9392 -0.1613 +vn 0.1982 -0.9800 -0.0155 +vn 0.1945 -0.9754 -0.1036 +vn 0.1486 -0.9862 -0.0726 +vn 0.1659 -0.9828 -0.0808 +vn 0.2144 -0.9677 -0.1329 +vn 0.0048 -0.9997 0.0225 +vn 0.0800 -0.9915 -0.1023 +vn 0.0927 -0.9870 -0.1316 +vn 0.0559 -0.9963 -0.0647 +vn 0.0898 -0.9916 -0.0928 +vn 0.5352 -0.6607 0.5264 +vn 0.4521 -0.7728 0.4453 +vn 0.5811 -0.7306 0.3586 +vn 0.2743 -0.9605 -0.0463 +vn 0.2301 -0.9732 -0.0012 +vn 0.3007 -0.9530 0.0380 +vn 0.1176 -0.9846 -0.1290 +vn -0.0080 -0.9995 0.0318 +vn 0.5413 -0.8124 0.2165 +vn 0.2981 -0.9475 -0.1156 +vn 0.1635 -0.9857 0.0411 +vn 0.4901 -0.8680 0.0797 +vn 0.3151 -0.9370 -0.1507 +vn 0.3223 -0.9397 0.1146 +vn 0.4191 -0.9077 0.0222 +vn 0.2456 -0.9594 -0.1389 +vn 0.3612 -0.8878 0.2853 +vn 0.2451 -0.9630 -0.1119 +vn 0.2703 -0.9563 -0.1113 +vn 0.2740 -0.9465 -0.1706 +vn 0.2541 -0.9533 -0.1632 +vn 0.2606 -0.9415 -0.2137 +vn 0.2488 -0.9496 -0.1908 +vn 0.2487 -0.9232 -0.2930 +vn 0.2643 -0.9167 -0.2997 +vn 0.2494 -0.8936 -0.3732 +vn 0.2634 -0.8819 -0.3910 +vn 0.2990 -0.9455 -0.1290 +vn 0.2832 -0.9444 -0.1669 +vn 0.2793 -0.9337 -0.2241 +vn 0.2546 -0.9191 -0.3008 +vn 0.2348 -0.8938 -0.3821 +vn 0.2488 -0.9570 -0.1488 +vn 0.2242 -0.9572 -0.1828 +vn 0.2218 -0.9428 -0.2489 +vn 0.2102 -0.9139 -0.3473 +vn 0.1825 -0.8900 -0.4179 +vn 0.1163 -0.9783 -0.1714 +vn 0.0851 -0.9803 -0.1783 +vn 0.1026 -0.9593 -0.2630 +vn 0.1151 -0.9136 -0.3900 +vn 0.1106 -0.8837 -0.4548 +vn 0.2245 -0.9672 -0.1190 +vn 0.2932 -0.8185 -0.4940 +vn 0.2493 -0.8175 -0.5192 +vn 0.2499 -0.8768 -0.4108 +vn 0.1062 -0.8465 -0.5218 +vn 0.2619 -0.9485 -0.1780 +vn 0.2784 -0.8493 -0.4484 +vn 0.2865 -0.9340 -0.2134 +vn 0.2134 -0.8635 -0.4570 +vn 0.2843 -0.9118 -0.2965 +vn 0.1634 -0.8544 -0.4933 +vn 0.3389 -0.7499 -0.5682 +vn 0.3141 -0.7741 -0.5497 +vn 0.3247 -0.6843 -0.6529 +vn 0.3571 -0.6735 -0.6473 +vn 0.2857 -0.6186 -0.7319 +vn 0.3470 -0.5913 -0.7280 +vn 0.2751 -0.5248 -0.8055 +vn 0.3592 -0.4807 -0.7999 +vn 0.2901 -0.4432 -0.8482 +vn 0.3489 -0.4150 -0.8403 +vn 0.1853 -0.8133 -0.5516 +vn 0.2020 -0.7210 -0.6628 +vn 0.2239 -0.6201 -0.7519 +vn 0.2013 -0.5495 -0.8109 +vn 0.2349 -0.4809 -0.8447 +vn 0.1291 -0.8083 -0.5744 +vn 0.1098 -0.7463 -0.6565 +vn 0.1547 -0.6525 -0.7419 +vn 0.2011 -0.5430 -0.8153 +vn 0.1735 -0.5131 -0.8406 +vn 0.0812 -0.7999 -0.5946 +vn 0.0777 -0.7564 -0.6495 +vn 0.1483 -0.6774 -0.7206 +vn 0.1769 -0.5485 -0.8172 +vn 0.1205 -0.5053 -0.8545 +vn 0.3211 -0.7369 -0.5949 +vn 0.3922 -0.3359 -0.8564 +vn 0.4636 -0.2722 -0.8432 +vn 0.3902 -0.3914 -0.8334 +vn 0.0978 -0.4512 -0.8871 +vn 0.3778 -0.6572 -0.6522 +vn 0.3366 -0.3891 -0.8575 +vn 0.3788 -0.5800 -0.7212 +vn 0.2892 -0.4285 -0.8560 +vn 0.3935 -0.4633 -0.7941 +vn 0.2120 -0.4511 -0.8669 +vn 0.4387 -0.2157 -0.8724 +vn 0.3788 -0.2734 -0.8842 +vn 0.3596 -0.0687 -0.9306 +vn 0.4388 -0.0495 -0.8972 +vn 0.2870 0.0154 -0.9578 +vn 0.3584 0.0191 -0.9334 +vn 0.3024 0.0585 -0.9514 +vn 0.3674 0.0741 -0.9271 +vn 0.2050 0.1535 -0.9666 +vn 0.1737 0.0840 -0.9812 +vn 0.3043 -0.2829 -0.9096 +vn 0.2217 -0.0874 -0.9712 +vn 0.2090 -0.0010 -0.9779 +vn 0.2050 0.0261 -0.9784 +vn 0.1216 0.1391 -0.9828 +vn 0.1665 -0.3028 -0.9384 +vn 0.1227 -0.0968 -0.9877 +vn 0.1421 -0.0060 -0.9898 +vn 0.0642 0.0087 -0.9979 +vn -0.0022 0.0965 -0.9953 +vn 0.0193 -0.3038 -0.9526 +vn 0.0164 -0.1097 -0.9938 +vn 0.0374 -0.0127 -0.9992 +vn -0.0297 0.0190 -0.9994 +vn -0.0408 0.0868 -0.9954 +vn 0.4799 -0.1881 -0.8569 +vn 0.2405 0.3085 -0.9203 +vn -0.1585 -0.2002 -0.9668 +vn -0.0159 -0.3170 -0.9483 +vn 0.0553 0.1411 -0.9885 +vn 0.4357 -0.1130 -0.8930 +vn 0.1435 0.2161 -0.9658 +vn 0.3748 -0.0032 -0.9271 +vn 0.1107 0.2181 -0.9696 +vn 0.4084 0.0924 -0.9081 +vn 0.0681 0.1771 -0.9818 +vn -0.0910 0.1065 0.9901 +vn -0.0793 0.0305 0.9964 +vn -0.0907 0.0592 0.9941 +vn -0.1005 0.1336 0.9859 +vn -0.8596 0.3178 0.4000 +vn -0.7948 0.4505 0.4065 +vn -0.7944 0.4480 0.4101 +vn -0.8632 0.2999 0.4062 +vn -0.4476 0.7034 0.5522 +vn -0.3939 0.7654 0.5089 +vn -0.3975 0.7570 0.5186 +vn -0.4570 0.6906 0.5606 +vn 0.3344 0.5540 0.7624 +vn 0.2870 0.5227 0.8028 +vn 0.2934 0.5351 0.7922 +vn 0.3366 0.5634 0.7545 +vn -0.8095 0.3196 0.4926 +vn -0.8087 0.3117 0.4988 +vn 0.1890 0.4586 0.8683 +vn 0.1929 0.4968 0.8462 +vn -0.7066 0.5369 0.4609 +vn -0.7144 0.5165 0.4720 +vn 0.0195 0.2651 0.9640 +vn 0.0313 0.3012 0.9530 +vn -0.6041 0.5982 0.5266 +vn -0.5968 0.5821 0.5522 +vn -0.0829 0.2275 0.9703 +vn -0.0879 0.2521 0.9637 +vn -0.9414 0.3141 0.1231 +vn -0.9234 0.3670 0.1126 +vn -0.9259 0.3614 0.1103 +vn -0.9426 0.3111 0.1213 +vn -0.8763 0.2552 0.4086 +vn -0.8754 0.2531 0.4118 +vn -0.8922 0.3814 0.2419 +vn -0.8936 0.3793 0.2400 +vn -0.8664 0.3108 0.3908 +vn -0.8635 0.3087 0.3989 +vn -0.8524 0.2775 0.4433 +vn -0.8516 0.2813 0.4423 +vn -0.8694 0.4483 0.2076 +vn -0.8904 0.4177 0.1807 +vn -0.8886 0.4188 0.1872 +vn -0.8686 0.4498 0.2079 +vn -0.9583 0.2523 0.1342 +vn -0.9608 0.2452 0.1293 +vn -0.9358 0.3413 0.0877 +vn -0.9348 0.3438 0.0891 +vn -0.9166 0.3740 0.1413 +vn -0.9148 0.3758 0.1481 +vn -0.9932 0.1155 0.0151 +vn -0.9935 0.1122 0.0208 +vn -0.1525 0.9544 0.2565 +vn -0.3226 0.9268 0.1921 +vn -0.2874 0.9316 0.2227 +vn -0.1632 0.9539 0.2517 +vn -0.4816 0.7839 0.3920 +vn -0.6127 0.7583 0.2228 +vn -0.6164 0.7524 0.2321 +vn -0.5389 0.7598 0.3636 +vn -0.5722 0.7776 0.2606 +vn -0.6661 0.7153 0.2114 +vn -0.8649 0.4683 0.1808 +vn -0.8636 0.4693 0.1842 +vn -0.3793 0.9098 0.1683 +vn -0.3846 0.9082 0.1650 +vn -0.6356 0.7102 0.3027 +vn -0.6381 0.7104 0.2970 +vn -0.4178 0.8833 0.2126 +vn -0.4415 0.8759 0.1947 +vn -0.6608 0.6790 0.3199 +vn -0.6589 0.6787 0.3246 +vn -0.5202 0.8280 0.2092 +vn -0.5260 0.8248 0.2076 +vn -0.7717 0.5890 0.2398 +vn -0.7698 0.5869 0.2510 +vn 0.1935 0.7975 0.5715 +vn 0.3370 0.7285 0.5964 +vn 0.3037 0.7525 0.5844 +vn 0.1718 0.8100 0.5606 +vn -0.1562 0.3966 0.9046 +vn -0.2867 0.5102 0.8109 +vn -0.2412 0.4895 0.8380 +vn -0.1243 0.3770 0.9178 +vn 0.8323 0.2999 0.4662 +vn 0.8988 0.2804 0.3370 +vn 0.8959 0.2850 0.3408 +vn 0.8227 0.3048 0.4799 +vn -0.0124 -0.0735 0.9972 +vn -0.0089 -0.0810 0.9967 +vn 0.5751 0.5542 0.6018 +vn 0.5498 0.5812 0.5999 +vn -0.0711 0.1201 0.9902 +vn -0.0491 0.0801 0.9956 +vn 0.6862 0.4582 0.5650 +vn 0.6711 0.4778 0.5669 +vn -0.1306 0.2298 0.9644 +vn -0.1083 0.2068 0.9724 +vn 0.7783 0.3344 0.5314 +vn 0.7700 0.3504 0.5332 +vn -0.1703 0.3132 0.9343 +vn -0.1582 0.2993 0.9410 +vn 0.9410 0.2796 0.1907 +vn 0.9415 0.2830 0.1830 +vn 0.9380 0.2289 0.2602 +vn 0.9165 0.3299 0.2265 +vn 0.9196 0.3225 0.2245 +vn 0.9375 0.2299 0.2612 +vn 0.9585 0.2625 0.1116 +vn 0.9583 0.2629 0.1116 +vn 0.9424 0.2508 0.2215 +vn 0.9446 0.2467 0.2164 +vn 0.9081 0.2856 0.3064 +vn 0.9076 0.2856 0.3076 +vn 0.8777 0.4252 0.2210 +vn 0.8792 0.4230 0.2191 +vn 0.8977 0.3815 0.2203 +vn 0.8218 0.4503 0.3492 +vn 0.8344 0.4229 0.3535 +vn 0.8995 0.3816 0.2130 +vn 0.8708 0.4530 0.1913 +vn 0.8730 0.4515 0.1846 +vn 0.8004 0.5196 0.2989 +vn 0.8012 0.5169 0.3015 +vn 0.8763 0.4444 0.1861 +vn 0.8739 0.4465 0.1921 +vn 0.7858 0.5583 0.2660 +vn 0.7859 0.5566 0.2694 +vn 0.6971 0.7058 0.1258 +vn 0.4896 0.8022 -0.3416 +vn 0.3633 0.8358 -0.4118 +vn 0.6960 0.6991 0.1636 +vn 0.4837 0.8752 0.0019 +vn 0.3611 0.9228 -0.1342 +vn 0.0351 0.9665 0.2544 +vn -0.0189 0.9759 0.2173 +vn 0.7981 0.5370 0.2732 +vn 0.7994 0.5363 0.2709 +vn 0.3944 0.9163 0.0696 +vn 0.3418 0.9397 0.0127 +vn 0.7766 0.5430 0.3195 +vn 0.7742 0.5485 0.3158 +vn 0.3273 0.9329 0.1504 +vn 0.2473 0.9654 0.0833 +vn 0.7217 0.6351 0.2753 +vn 0.7185 0.6360 0.2816 +vn 0.2055 0.9530 0.2224 +vn 0.1355 0.9763 0.1686 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_09 +s 1 +f 5851/2926/7183 5852/2927/7184 5853/2928/7185 5854/2929/7186 +f 5855/2930/7187 5851/2926/7183 5854/2929/7186 5856/2931/7188 +f 5857/2932/7189 5855/2930/7187 5856/2931/7188 5858/2933/7190 +f 5859/2934/7191 5857/2932/7189 5858/2933/7190 5860/2935/7192 +f 5861/2936/7193 5862/2937/7194 5852/2927/7184 5851/2926/7183 +f 5863/2938/7195 5861/2936/7193 5851/2926/7183 5855/2930/7187 +f 5864/2939/7196 5863/2938/7195 5855/2930/7187 5857/2932/7189 +f 5865/2940/7197 5864/2939/7196 5857/2932/7189 5859/2934/7191 +f 5866/2941/7198 5867/2942/7199 5862/2937/7194 5861/2936/7193 +f 5868/2943/7200 5866/2941/7198 5861/2936/7193 5863/2938/7195 +f 5869/2944/7201 5868/2943/7200 5863/2938/7195 5864/2939/7196 +f 5870/2945/7202 5869/2944/7201 5864/2939/7196 5865/2940/7197 +f 5871/2946/7203 5872/2947/7204 5867/2942/7199 5866/2941/7198 +f 5873/2948/7205 5871/2946/7203 5866/2941/7198 5868/2943/7200 +f 5874/2949/7206 5873/2948/7205 5868/2943/7200 5869/2944/7201 +f 5875/2950/7207 5874/2949/7206 5869/2944/7201 5870/2945/7202 +f 5853/2928/7185 5876/2951/7208 5877/2952/7209 5878/2953/7210 +f 5879/2954/7211 5880/2955/7212 5881/2956/7213 5860/2935/7192 +f 5875/2950/7207 5882/2957/7214 5883/2958/7215 5884/2959/7216 +f 5885/2960/7217 5886/2961/7218 5887/2962/7219 5872/2947/7204 +f 5854/2929/7186 5853/2928/7185 5878/2953/7210 5888/2963/7220 +f 5860/2935/7192 5881/2956/7213 5889/2964/7221 5859/2934/7191 +f 5874/2949/7206 5875/2950/7207 5884/2959/7216 5890/2965/7222 +f 5872/2947/7204 5887/2962/7219 5891/2966/7223 5867/2942/7199 +f 5856/2931/7188 5854/2929/7186 5888/2963/7220 5892/2967/7224 +f 5859/2934/7191 5889/2964/7221 5893/2968/7225 5865/2940/7197 +f 5873/2948/7205 5874/2949/7206 5890/2965/7222 5894/2969/7226 +f 5867/2942/7199 5891/2966/7223 5895/2970/7227 5862/2937/7194 +f 5858/2933/7190 5856/2931/7188 5892/2967/7224 5896/2971/7228 +f 5865/2940/7197 5893/2968/7225 5897/2972/7229 5870/2945/7202 +f 5871/2946/7203 5873/2948/7205 5894/2969/7226 5898/2973/7230 +f 5862/2937/7194 5895/2970/7227 5899/2974/7231 5852/2927/7184 +f 5860/2935/7192 5858/2933/7190 5896/2971/7228 5879/2954/7211 +f 5870/2945/7202 5897/2972/7229 5882/2957/7214 5875/2950/7207 +f 5872/2947/7204 5871/2946/7203 5898/2973/7230 5885/2960/7217 +f 5852/2927/7184 5899/2974/7231 5876/2951/7208 5853/2928/7185 +f 5900/2975/7232 5901/2976/7233 5902/2977/7234 5903/2978/7235 +f 5904/2979/7236 5900/2975/7232 5903/2978/7235 5905/2980/7237 +f 5906/2981/7238 5904/2979/7236 5905/2980/7237 5907/2982/7239 +f 5908/2983/7240 5906/2981/7238 5907/2982/7239 5909/2984/7241 +f 5910/2985/7242 5911/2986/7243 5901/2976/7233 5900/2975/7232 +f 5912/2987/7244 5910/2985/7242 5900/2975/7232 5904/2979/7236 +f 5913/2988/7245 5912/2987/7244 5904/2979/7236 5906/2981/7238 +f 5914/2989/7246 5913/2988/7245 5906/2981/7238 5908/2983/7240 +f 5915/2990/7247 5916/2991/7248 5911/2986/7243 5910/2985/7242 +f 5917/2992/7249 5915/2990/7247 5910/2985/7242 5912/2987/7244 +f 5918/2993/7250 5917/2992/7249 5912/2987/7244 5913/2988/7245 +f 5919/2994/7251 5918/2993/7250 5913/2988/7245 5914/2989/7246 +f 5920/2995/7252 5921/2996/7253 5916/2991/7248 5915/2990/7247 +f 5922/2997/7254 5920/2995/7252 5915/2990/7247 5917/2992/7249 +f 5923/2998/7255 5922/2997/7254 5917/2992/7249 5918/2993/7250 +f 5924/2999/7256 5923/2998/7255 5918/2993/7250 5919/2994/7251 +f 5902/2977/7234 5881/2956/7213 5880/2955/7212 5925/3000/7257 +f 5926/3001/7258 5927/3002/7259 5928/3003/7260 5909/2984/7241 +f 5924/2999/7256 5929/3004/7261 5930/3005/7262 5931/3006/7263 +f 5932/3007/7264 5883/2958/7215 5882/2957/7214 5921/2996/7253 +f 5903/2978/7235 5902/2977/7234 5925/3000/7257 5933/3008/7265 +f 5909/2984/7241 5928/3003/7260 5934/3009/7266 5908/2983/7240 +f 5923/2998/7255 5924/2999/7256 5931/3006/7263 5935/3010/7267 +f 5921/2996/7253 5882/2957/7214 5897/2972/7229 5916/2991/7248 +f 5905/2980/7237 5903/2978/7235 5933/3008/7265 5936/3011/7268 +f 5908/2983/7240 5934/3009/7266 5937/3012/7269 5914/2989/7246 +f 5922/2997/7254 5923/2998/7255 5935/3010/7267 5938/3013/7270 +f 5916/2991/7248 5897/2972/7229 5893/2968/7225 5911/2986/7243 +f 5907/2982/7239 5905/2980/7237 5936/3011/7268 5939/3014/7271 +f 5914/2989/7246 5937/3012/7269 5940/3015/7272 5919/2994/7251 +f 5920/2995/7252 5922/2997/7254 5938/3013/7270 5941/3016/7273 +f 5911/2986/7243 5893/2968/7225 5889/2964/7221 5901/2976/7233 +f 5909/2984/7241 5907/2982/7239 5939/3014/7271 5926/3001/7258 +f 5919/2994/7251 5940/3015/7272 5929/3004/7261 5924/2999/7256 +f 5921/2996/7253 5920/2995/7252 5941/3016/7273 5932/3007/7264 +f 5901/2976/7233 5889/2964/7221 5881/2956/7213 5902/2977/7234 +f 5942/3017/7274 5943/3018/7275 5944/3019/7276 5945/3020/7277 +f 5946/3021/7278 5942/3017/7274 5945/3020/7277 5947/3022/7279 +f 5948/3023/7280 5946/3021/7278 5947/3022/7279 5949/3024/7281 +f 5950/3025/7282 5948/3023/7280 5949/3024/7281 5951/3026/7283 +f 5952/3027/7284 5953/3028/7285 5943/3018/7275 5942/3017/7274 +f 5954/3029/7286 5952/3027/7284 5942/3017/7274 5946/3021/7278 +f 5955/3030/7287 5954/3029/7286 5946/3021/7278 5948/3023/7280 +f 5956/3031/7288 5955/3030/7287 5948/3023/7280 5950/3025/7282 +f 5957/3032/7289 5958/3033/7290 5953/3028/7285 5952/3027/7284 +f 5959/3034/7291 5957/3032/7289 5952/3027/7284 5954/3029/7286 +f 5960/3035/7292 5959/3034/7291 5954/3029/7286 5955/3030/7287 +f 5961/3036/7293 5960/3035/7292 5955/3030/7287 5956/3031/7288 +f 5962/3037/7294 5963/3038/7295 5958/3033/7290 5957/3032/7289 +f 5964/3039/7296 5962/3037/7294 5957/3032/7289 5959/3034/7291 +f 5965/3040/7297 5964/3039/7296 5959/3034/7291 5960/3035/7292 +f 5966/3041/7298 5965/3040/7297 5960/3035/7292 5961/3036/7293 +f 5944/3019/7276 5928/3003/7260 5927/3002/7259 5967/3042/7299 +f 5968/3043/7300 5969/3044/7301 5970/3045/7302 5951/3026/7283 +f 5966/3041/7298 5971/3046/7303 5972/3047/7304 5973/3048/7305 +f 5974/3049/7306 5930/3005/7262 5929/3004/7261 5963/3038/7295 +f 5945/3020/7277 5944/3019/7276 5967/3042/7299 5975/3050/7307 +f 5951/3026/7283 5970/3045/7302 5976/3051/7308 5950/3025/7282 +f 5965/3040/7297 5966/3041/7298 5973/3048/7305 5977/3052/7309 +f 5963/3038/7295 5929/3004/7261 5940/3015/7272 5958/3033/7290 +f 5947/3022/7279 5945/3020/7277 5975/3050/7307 5978/3053/7310 +f 5950/3025/7282 5976/3051/7308 5979/3054/7311 5956/3031/7288 +f 5964/3039/7296 5965/3040/7297 5977/3052/7309 5980/3055/7312 +f 5958/3033/7290 5940/3015/7272 5937/3012/7269 5953/3028/7285 +f 5949/3024/7281 5947/3022/7279 5978/3053/7310 5981/3056/7313 +f 5956/3031/7288 5979/3054/7311 5982/3057/7314 5961/3036/7293 +f 5962/3037/7294 5964/3039/7296 5980/3055/7312 5983/3058/7315 +f 5953/3028/7285 5937/3012/7269 5934/3009/7266 5943/3018/7275 +f 5951/3026/7283 5949/3024/7281 5981/3056/7313 5968/3043/7300 +f 5961/3036/7293 5982/3057/7314 5971/3046/7303 5966/3041/7298 +f 5963/3038/7295 5962/3037/7294 5983/3058/7315 5974/3049/7306 +f 5943/3018/7275 5934/3009/7266 5928/3003/7260 5944/3019/7276 +f 5984/3059/7316 5985/3060/7317 5986/3061/7318 5987/3062/7319 +f 5988/3063/7320 5984/3059/7316 5987/3062/7319 5989/3064/7321 +f 5990/3065/7322 5988/3063/7320 5989/3064/7321 5991/3066/7323 +f 5992/3067/7324 5990/3065/7322 5991/3066/7323 5993/3068/7325 +f 5994/3069/7326 5995/3070/7327 5985/3060/7317 5984/3059/7316 +f 5996/3071/7328 5994/3069/7326 5984/3059/7316 5988/3063/7320 +f 5997/3072/7329 5996/3071/7328 5988/3063/7320 5990/3065/7322 +f 5998/3073/7330 5997/3072/7329 5990/3065/7322 5992/3067/7324 +f 5999/3074/7331 6000/3075/7332 5995/3070/7327 5994/3069/7326 +f 6001/3076/7333 5999/3074/7331 5994/3069/7326 5996/3071/7328 +f 6002/3077/7334 6001/3076/7333 5996/3071/7328 5997/3072/7329 +f 6003/3078/7335 6002/3077/7334 5997/3072/7329 5998/3073/7330 +f 6004/3079/7336 6005/3080/7337 6000/3075/7332 5999/3074/7331 +f 6006/3081/7338 6004/3079/7336 5999/3074/7331 6001/3076/7333 +f 6007/3082/7339 6006/3081/7338 6001/3076/7333 6002/3077/7334 +f 6008/3083/7340 6007/3082/7339 6002/3077/7334 6003/3078/7335 +f 5986/3061/7318 5970/3045/7302 5969/3044/7301 6009/3084/7341 +f 6010/3085/7342 6011/3086/7343 6012/3087/7344 5993/3068/7325 +f 6008/3083/7340 6013/3088/7345 6014/3089/7346 6015/3090/7347 +f 6016/3091/7348 5972/3047/7304 5971/3046/7303 6005/3080/7337 +f 5987/3062/7319 5986/3061/7318 6009/3084/7341 6017/3092/7349 +f 5993/3068/7325 6012/3087/7344 6018/3093/7350 5992/3067/7324 +f 6007/3082/7339 6008/3083/7340 6015/3090/7347 6019/3094/7351 +f 6005/3080/7337 5971/3046/7303 5982/3057/7314 6000/3075/7332 +f 5989/3064/7321 5987/3062/7319 6017/3092/7349 6020/3095/7352 +f 5992/3067/7324 6018/3093/7350 6021/3096/7353 5998/3073/7330 +f 6006/3081/7338 6007/3082/7339 6019/3094/7351 6022/3097/7354 +f 6000/3075/7332 5982/3057/7314 5979/3054/7311 5995/3070/7327 +f 5991/3066/7323 5989/3064/7321 6020/3095/7352 6023/3098/7355 +f 5998/3073/7330 6021/3096/7353 6024/3099/7356 6003/3078/7335 +f 6004/3079/7336 6006/3081/7338 6022/3097/7354 6025/3100/7357 +f 5995/3070/7327 5979/3054/7311 5976/3051/7308 5985/3060/7317 +f 5993/3068/7325 5991/3066/7323 6023/3098/7355 6010/3085/7342 +f 6003/3078/7335 6024/3099/7356 6013/3088/7345 6008/3083/7340 +f 6005/3080/7337 6004/3079/7336 6025/3100/7357 6016/3091/7348 +f 5985/3060/7317 5976/3051/7308 5970/3045/7302 5986/3061/7318 +f 6026/3101/7358 6027/3102/7359 6028/3103/7360 6029/3104/7361 +f 6030/3105/7362 6026/3101/7358 6029/3104/7361 6031/3106/7363 +f 6032/3107/7364 6030/3105/7362 6031/3106/7363 6033/3108/7365 +f 6034/3109/7366 6032/3107/7364 6033/3108/7365 6035/3110/7367 +f 6036/3111/7368 6037/3112/7369 6027/3102/7359 6026/3101/7358 +f 6038/3113/7370 6036/3111/7368 6026/3101/7358 6030/3105/7362 +f 6039/3114/7371 6038/3113/7370 6030/3105/7362 6032/3107/7364 +f 6040/3115/7372 6039/3114/7371 6032/3107/7364 6034/3109/7366 +f 6041/3116/7373 6042/3117/7374 6037/3112/7369 6036/3111/7368 +f 6043/3118/7375 6041/3116/7373 6036/3111/7368 6038/3113/7370 +f 6044/3119/7376 6043/3118/7375 6038/3113/7370 6039/3114/7371 +f 6045/3120/7377 6044/3119/7376 6039/3114/7371 6040/3115/7372 +f 6046/3121/7378 6047/3122/7379 6042/3117/7374 6041/3116/7373 +f 6048/3123/7380 6046/3121/7378 6041/3116/7373 6043/3118/7375 +f 6049/3124/7381 6048/3123/7380 6043/3118/7375 6044/3119/7376 +f 6050/3125/7382 6049/3124/7381 6044/3119/7376 6045/3120/7377 +f 6028/3103/7360 6051/3126/7383 6052/3127/7384 6053/3128/7385 +f 6054/3129/7386 6055/3130/7387 6056/3131/7388 6035/3110/7367 +f 6050/3125/7382 6057/3132/7389 5880/2955/7212 5879/2954/7211 +f 5878/2953/7210 5877/2952/7209 6058/3133/7390 6047/3122/7379 +f 6029/3104/7361 6028/3103/7360 6053/3128/7385 6059/3134/7391 +f 6035/3110/7367 6056/3131/7388 6060/3135/7392 6034/3109/7366 +f 6049/3124/7381 6050/3125/7382 5879/2954/7211 5896/2971/7228 +f 6047/3122/7379 6058/3133/7390 6061/3136/7393 6042/3117/7374 +f 6031/3106/7363 6029/3104/7361 6059/3134/7391 6062/3137/7394 +f 6034/3109/7366 6060/3135/7392 6063/3138/7395 6040/3115/7372 +f 6048/3123/7380 6049/3124/7381 5896/2971/7228 5892/2967/7224 +f 6042/3117/7374 6061/3136/7393 6064/3139/7396 6037/3112/7369 +f 6033/3108/7365 6031/3106/7363 6062/3137/7394 6065/3140/7397 +f 6040/3115/7372 6063/3138/7395 6066/3141/7398 6045/3120/7377 +f 6046/3121/7378 6048/3123/7380 5892/2967/7224 5888/2963/7220 +f 6037/3112/7369 6064/3139/7396 6067/3142/7399 6027/3102/7359 +f 6035/3110/7367 6033/3108/7365 6065/3140/7397 6054/3129/7386 +f 6045/3120/7377 6066/3141/7398 6057/3132/7389 6050/3125/7382 +f 6047/3122/7379 6046/3121/7378 5888/2963/7220 5878/2953/7210 +f 6027/3102/7359 6067/3142/7399 6051/3126/7383 6028/3103/7360 +f 6068/3143/7400 6069/3144/7401 6070/3145/7402 6071/3146/7403 +f 6072/3147/7404 6068/3143/7400 6071/3146/7403 6073/3148/7405 +f 6074/3149/7406 6072/3147/7404 6073/3148/7405 6075/3150/7407 +f 6076/3151/7408 6074/3149/7406 6075/3150/7407 6077/3152/7409 +f 6078/3153/7410 6079/3154/7411 6069/3144/7401 6068/3143/7400 +f 6080/3155/7412 6078/3153/7410 6068/3143/7400 6072/3147/7404 +f 6081/3156/7413 6080/3155/7412 6072/3147/7404 6074/3149/7406 +f 6082/3157/7414 6081/3156/7413 6074/3149/7406 6076/3151/7408 +f 6083/3158/7415 6084/3159/7416 6079/3154/7411 6078/3153/7410 +f 6085/3160/7417 6083/3158/7415 6078/3153/7410 6080/3155/7412 +f 6086/3161/7418 6085/3160/7417 6080/3155/7412 6081/3156/7413 +f 6087/3162/7419 6086/3161/7418 6081/3156/7413 6082/3157/7414 +f 6088/3163/7420 6089/3164/7421 6084/3159/7416 6083/3158/7415 +f 6090/3165/7422 6088/3163/7420 6083/3158/7415 6085/3160/7417 +f 6091/3166/7423 6090/3165/7422 6085/3160/7417 6086/3161/7418 +f 6092/3167/7424 6091/3166/7423 6086/3161/7418 6087/3162/7419 +f 6070/3145/7402 6056/3131/7388 6055/3130/7387 6093/3168/7425 +f 6094/3169/7426 6095/3170/7427 6096/3171/7428 6077/3152/7409 +f 6092/3167/7424 6097/3172/7429 5927/3002/7259 5926/3001/7258 +f 5925/3000/7257 5880/2955/7212 6057/3132/7389 6089/3164/7421 +f 6071/3146/7403 6070/3145/7402 6093/3168/7425 6098/3173/7430 +f 6077/3152/7409 6096/3171/7428 6099/3174/7431 6076/3151/7408 +f 6091/3166/7423 6092/3167/7424 5926/3001/7258 5939/3014/7271 +f 6089/3164/7421 6057/3132/7389 6066/3141/7398 6084/3159/7416 +f 6073/3148/7405 6071/3146/7403 6098/3173/7430 6100/3175/7432 +f 6076/3151/7408 6099/3174/7431 6101/3176/7433 6082/3157/7414 +f 6090/3165/7422 6091/3166/7423 5939/3014/7271 5936/3011/7268 +f 6084/3159/7416 6066/3141/7398 6063/3138/7395 6079/3154/7411 +f 6075/3150/7407 6073/3148/7405 6100/3175/7432 6102/3177/7434 +f 6082/3157/7414 6101/3176/7433 6103/3178/7435 6087/3162/7419 +f 6088/3163/7420 6090/3165/7422 5936/3011/7268 5933/3008/7265 +f 6079/3154/7411 6063/3138/7395 6060/3135/7392 6069/3144/7401 +f 6077/3152/7409 6075/3150/7407 6102/3177/7434 6094/3169/7426 +f 6087/3162/7419 6103/3178/7435 6097/3172/7429 6092/3167/7424 +f 6089/3164/7421 6088/3163/7420 5933/3008/7265 5925/3000/7257 +f 6069/3144/7401 6060/3135/7392 6056/3131/7388 6070/3145/7402 +f 6104/3179/7436 6105/3180/7437 6106/3181/7438 6107/3182/7439 +f 6108/3183/7440 6104/3179/7436 6107/3182/7439 6109/3184/7441 +f 6110/3185/7442 6108/3183/7440 6109/3184/7441 6111/3186/7443 +f 6112/3187/7444 6110/3185/7442 6111/3186/7443 6113/3188/7445 +f 6114/3189/7446 6115/3190/7447 6105/3180/7437 6104/3179/7436 +f 6116/3191/7448 6114/3189/7446 6104/3179/7436 6108/3183/7440 +f 6117/3192/7449 6116/3191/7448 6108/3183/7440 6110/3185/7442 +f 6118/3193/7450 6117/3192/7449 6110/3185/7442 6112/3187/7444 +f 6119/3194/7451 6120/3195/7452 6115/3190/7447 6114/3189/7446 +f 6121/3196/7453 6119/3194/7451 6114/3189/7446 6116/3191/7448 +f 6122/3197/7454 6121/3196/7453 6116/3191/7448 6117/3192/7449 +f 6123/3198/7455 6122/3197/7454 6117/3192/7449 6118/3193/7450 +f 6124/3199/7456 6125/3200/7457 6120/3195/7452 6119/3194/7451 +f 6126/3201/7458 6124/3199/7456 6119/3194/7451 6121/3196/7453 +f 6127/3202/7459 6126/3201/7458 6121/3196/7453 6122/3197/7454 +f 6128/3203/7460 6127/3202/7459 6122/3197/7454 6123/3198/7455 +f 6106/3181/7438 6096/3171/7428 6095/3170/7427 6129/3204/7461 +f 6130/3205/7462 6131/3206/7463 6132/3207/7464 6113/3188/7445 +f 6128/3203/7460 6133/3208/7465 5969/3044/7301 5968/3043/7300 +f 5967/3042/7299 5927/3002/7259 6097/3172/7429 6125/3200/7457 +f 6107/3182/7439 6106/3181/7438 6129/3204/7461 6134/3209/7466 +f 6113/3188/7445 6132/3207/7464 6135/3210/7467 6112/3187/7444 +f 6127/3202/7459 6128/3203/7460 5968/3043/7300 5981/3056/7313 +f 6125/3200/7457 6097/3172/7429 6103/3178/7435 6120/3195/7452 +f 6109/3184/7441 6107/3182/7439 6134/3209/7466 6136/3211/7468 +f 6112/3187/7444 6135/3210/7467 6137/3212/7469 6118/3193/7450 +f 6126/3201/7458 6127/3202/7459 5981/3056/7313 5978/3053/7310 +f 6120/3195/7452 6103/3178/7435 6101/3176/7433 6115/3190/7447 +f 6111/3186/7443 6109/3184/7441 6136/3211/7468 6138/3213/7470 +f 6118/3193/7450 6137/3212/7469 6139/3214/7471 6123/3198/7455 +f 6124/3199/7456 6126/3201/7458 5978/3053/7310 5975/3050/7307 +f 6115/3190/7447 6101/3176/7433 6099/3174/7431 6105/3180/7437 +f 6113/3188/7445 6111/3186/7443 6138/3213/7470 6130/3205/7462 +f 6123/3198/7455 6139/3214/7471 6133/3208/7465 6128/3203/7460 +f 6125/3200/7457 6124/3199/7456 5975/3050/7307 5967/3042/7299 +f 6105/3180/7437 6099/3174/7431 6096/3171/7428 6106/3181/7438 +f 6140/3215/7472 6141/3216/7473 6142/3217/7474 6143/3218/7475 +f 6144/3219/7476 6140/3215/7472 6143/3218/7475 6145/3220/7477 +f 6146/3221/7478 6144/3219/7476 6145/3220/7477 6147/3222/7479 +f 6148/3223/7480 6146/3221/7478 6147/3222/7479 6149/3224/7481 +f 6150/3225/7482 6151/3226/7483 6141/3216/7473 6140/3215/7472 +f 6152/3227/7484 6150/3225/7482 6140/3215/7472 6144/3219/7476 +f 6153/3228/7485 6152/3227/7484 6144/3219/7476 6146/3221/7478 +f 6154/3229/7486 6153/3228/7485 6146/3221/7478 6148/3223/7480 +f 6155/3230/7487 6156/3231/7488 6151/3226/7483 6150/3225/7482 +f 6157/3232/7489 6155/3230/7487 6150/3225/7482 6152/3227/7484 +f 6158/3233/7490 6157/3232/7489 6152/3227/7484 6153/3228/7485 +f 6159/3234/7491 6158/3233/7490 6153/3228/7485 6154/3229/7486 +f 6160/3235/7492 6161/3236/7493 6156/3231/7488 6155/3230/7487 +f 6162/3237/7494 6160/3235/7492 6155/3230/7487 6157/3232/7489 +f 6163/3238/7495 6162/3237/7494 6157/3232/7489 6158/3233/7490 +f 6164/3239/7496 6163/3238/7495 6158/3233/7490 6159/3234/7491 +f 6142/3217/7474 6132/3207/7464 6131/3206/7463 6165/3240/7497 +f 6166/3241/7498 6167/3242/7499 6168/3243/7500 6149/3224/7481 +f 6164/3239/7496 6169/3244/7501 6011/3086/7343 6010/3085/7342 +f 6009/3084/7341 5969/3044/7301 6133/3208/7465 6161/3236/7493 +f 6143/3218/7475 6142/3217/7474 6165/3240/7497 6170/3245/7502 +f 6149/3224/7481 6168/3243/7500 6171/3246/7503 6148/3223/7480 +f 6163/3238/7495 6164/3239/7496 6010/3085/7342 6023/3098/7355 +f 6161/3236/7493 6133/3208/7465 6139/3214/7471 6156/3231/7488 +f 6145/3220/7477 6143/3218/7475 6170/3245/7502 6172/3247/7504 +f 6148/3223/7480 6171/3246/7503 6173/3248/7505 6154/3229/7486 +f 6162/3237/7494 6163/3238/7495 6023/3098/7355 6020/3095/7352 +f 6156/3231/7488 6139/3214/7471 6137/3212/7469 6151/3226/7483 +f 6147/3222/7479 6145/3220/7477 6172/3247/7504 6174/3249/7506 +f 6154/3229/7486 6173/3248/7505 6175/3250/7507 6159/3234/7491 +f 6160/3235/7492 6162/3237/7494 6020/3095/7352 6017/3092/7349 +f 6151/3226/7483 6137/3212/7469 6135/3210/7467 6141/3216/7473 +f 6149/3224/7481 6147/3222/7479 6174/3249/7506 6166/3241/7498 +f 6159/3234/7491 6175/3250/7507 6169/3244/7501 6164/3239/7496 +f 6161/3236/7493 6160/3235/7492 6017/3092/7349 6009/3084/7341 +f 6141/3216/7473 6135/3210/7467 6132/3207/7464 6142/3217/7474 +f 6176/2928/7508 6177/2927/7509 6178/2926/7510 6179/2929/7511 +f 6179/2929/7511 6178/2926/7510 6180/2930/7512 6181/2931/7513 +f 6181/2931/7513 6180/2930/7512 6182/2932/7514 6183/2933/7515 +f 6183/2933/7515 6182/2932/7514 6184/2934/7516 6185/2935/7517 +f 6177/2927/7509 6186/2937/7518 6187/2936/7519 6178/2926/7510 +f 6178/2926/7510 6187/2936/7519 6188/2938/7520 6180/2930/7512 +f 6180/2930/7512 6188/2938/7520 6189/2939/7521 6182/2932/7514 +f 6182/2932/7514 6189/2939/7521 6190/2940/7522 6184/2934/7516 +f 6186/2937/7518 6191/2942/7523 6192/2941/7524 6187/2936/7519 +f 6187/2936/7519 6192/2941/7524 6193/2943/7525 6188/2938/7520 +f 6188/2938/7520 6193/2943/7525 6194/2944/7526 6189/2939/7521 +f 6189/2939/7521 6194/2944/7526 6195/2945/7527 6190/2940/7522 +f 6191/2942/7523 6196/2947/7528 6197/2946/7529 6192/2941/7524 +f 6192/2941/7524 6197/2946/7529 6198/2948/7530 6193/2943/7525 +f 6193/2943/7525 6198/2948/7530 6199/2949/7531 6194/2944/7526 +f 6194/2944/7526 6199/2949/7531 6200/2950/7532 6195/2945/7527 +f 6201/2952/7533 6202/2951/7534 6176/2928/7508 6203/2953/7535 +f 6204/2956/7536 6205/2955/7537 6206/2954/7538 6185/2935/7517 +f 6207/2958/7539 6208/2957/7540 6200/2950/7532 6209/2959/7541 +f 6210/2962/7542 6211/2961/7543 6212/2960/7544 6196/2947/7528 +f 6203/2953/7535 6176/2928/7508 6179/2929/7511 6213/2963/7545 +f 6214/2964/7546 6204/2956/7536 6185/2935/7517 6184/2934/7516 +f 6209/2959/7541 6200/2950/7532 6199/2949/7531 6215/2965/7547 +f 6216/2966/7548 6210/2962/7542 6196/2947/7528 6191/2942/7523 +f 6213/2963/7545 6179/2929/7511 6181/2931/7513 6217/2967/7549 +f 6218/2968/7550 6214/2964/7546 6184/2934/7516 6190/2940/7522 +f 6215/2965/7547 6199/2949/7531 6198/2948/7530 6219/2969/7551 +f 6220/2970/7552 6216/2966/7548 6191/2942/7523 6186/2937/7518 +f 6217/2967/7549 6181/2931/7513 6183/2933/7515 6221/2971/7553 +f 6222/2972/7554 6218/2968/7550 6190/2940/7522 6195/2945/7527 +f 6219/2969/7551 6198/2948/7530 6197/2946/7529 6223/2973/7555 +f 6224/2974/7556 6220/2970/7552 6186/2937/7518 6177/2927/7509 +f 6221/2971/7553 6183/2933/7515 6185/2935/7517 6206/2954/7538 +f 6208/2957/7540 6222/2972/7554 6195/2945/7527 6200/2950/7532 +f 6223/2973/7555 6197/2946/7529 6196/2947/7528 6212/2960/7544 +f 6202/2951/7534 6224/2974/7556 6177/2927/7509 6176/2928/7508 +f 6225/2977/7557 6226/2976/7558 6227/2975/7559 6228/2978/7560 +f 6228/2978/7560 6227/2975/7559 6229/2979/7561 6230/2980/7562 +f 6230/2980/7562 6229/2979/7561 6231/2981/7563 6232/2982/7564 +f 6232/2982/7564 6231/2981/7563 6233/2983/7565 6234/2984/7566 +f 6226/2976/7558 6235/2986/7567 6236/2985/7568 6227/2975/7559 +f 6227/2975/7559 6236/2985/7568 6237/2987/7569 6229/2979/7561 +f 6229/2979/7561 6237/2987/7569 6238/2988/7570 6231/2981/7563 +f 6231/2981/7563 6238/2988/7570 6239/2989/7571 6233/2983/7565 +f 6235/2986/7567 6240/2991/7572 6241/2990/7573 6236/2985/7568 +f 6236/2985/7568 6241/2990/7573 6242/2992/7574 6237/2987/7569 +f 6237/2987/7569 6242/2992/7574 6243/2993/7575 6238/2988/7570 +f 6238/2988/7570 6243/2993/7575 6244/2994/7576 6239/2989/7571 +f 6240/2991/7572 6245/2996/7577 6246/2995/7578 6241/2990/7573 +f 6241/2990/7573 6246/2995/7578 6247/2997/7579 6242/2992/7574 +f 6242/2992/7574 6247/2997/7579 6248/2998/7580 6243/2993/7575 +f 6243/2993/7575 6248/2998/7580 6249/2999/7581 6244/2994/7576 +f 6205/2955/7537 6204/2956/7536 6225/2977/7557 6250/3000/7582 +f 6251/3003/7583 6252/3002/7584 6253/3001/7585 6234/2984/7566 +f 6254/3005/7586 6255/3004/7587 6249/2999/7581 6256/3006/7588 +f 6208/2957/7540 6207/2958/7539 6257/3007/7589 6245/2996/7577 +f 6250/3000/7582 6225/2977/7557 6228/2978/7560 6258/3008/7590 +f 6259/3009/7591 6251/3003/7583 6234/2984/7566 6233/2983/7565 +f 6256/3006/7588 6249/2999/7581 6248/2998/7580 6260/3010/7592 +f 6222/2972/7554 6208/2957/7540 6245/2996/7577 6240/2991/7572 +f 6258/3008/7590 6228/2978/7560 6230/2980/7562 6261/3011/7593 +f 6262/3012/7594 6259/3009/7591 6233/2983/7565 6239/2989/7571 +f 6260/3010/7592 6248/2998/7580 6247/2997/7579 6263/3013/7595 +f 6218/2968/7550 6222/2972/7554 6240/2991/7572 6235/2986/7567 +f 6261/3011/7593 6230/2980/7562 6232/2982/7564 6264/3014/7596 +f 6265/3015/7597 6262/3012/7594 6239/2989/7571 6244/2994/7576 +f 6263/3013/7595 6247/2997/7579 6246/2995/7578 6266/3016/7598 +f 6214/2964/7546 6218/2968/7550 6235/2986/7567 6226/2976/7558 +f 6264/3014/7596 6232/2982/7564 6234/2984/7566 6253/3001/7585 +f 6255/3004/7587 6265/3015/7597 6244/2994/7576 6249/2999/7581 +f 6266/3016/7598 6246/2995/7578 6245/2996/7577 6257/3007/7589 +f 6204/2956/7536 6214/2964/7546 6226/2976/7558 6225/2977/7557 +f 6267/3019/7599 6268/3018/7600 6269/3017/7601 6270/3020/7602 +f 6270/3020/7602 6269/3017/7601 6271/3021/7603 6272/3022/7604 +f 6272/3022/7604 6271/3021/7603 6273/3023/7605 6274/3024/7606 +f 6274/3024/7606 6273/3023/7605 6275/3025/7607 6276/3026/7608 +f 6268/3018/7600 6277/3028/7609 6278/3027/7610 6269/3017/7601 +f 6269/3017/7601 6278/3027/7610 6279/3029/7611 6271/3021/7603 +f 6271/3021/7603 6279/3029/7611 6280/3030/7612 6273/3023/7605 +f 6273/3023/7605 6280/3030/7612 6281/3031/7613 6275/3025/7607 +f 6277/3028/7609 6282/3033/7614 6283/3032/7615 6278/3027/7610 +f 6278/3027/7610 6283/3032/7615 6284/3034/7616 6279/3029/7611 +f 6279/3029/7611 6284/3034/7616 6285/3035/7617 6280/3030/7612 +f 6280/3030/7612 6285/3035/7617 6286/3036/7618 6281/3031/7613 +f 6282/3033/7614 6287/3038/7619 6288/3037/7620 6283/3032/7615 +f 6283/3032/7615 6288/3037/7620 6289/3039/7621 6284/3034/7616 +f 6284/3034/7616 6289/3039/7621 6290/3040/7622 6285/3035/7617 +f 6285/3035/7617 6290/3040/7622 6291/3041/7623 6286/3036/7618 +f 6252/3002/7584 6251/3003/7583 6267/3019/7599 6292/3042/7624 +f 6293/3045/7625 6294/3044/7626 6295/3043/7627 6276/3026/7608 +f 6296/3047/7628 6297/3046/7629 6291/3041/7623 6298/3048/7630 +f 6255/3004/7587 6254/3005/7586 6299/3049/7631 6287/3038/7619 +f 6292/3042/7624 6267/3019/7599 6270/3020/7602 6300/3050/7632 +f 6301/3051/7633 6293/3045/7625 6276/3026/7608 6275/3025/7607 +f 6298/3048/7630 6291/3041/7623 6290/3040/7622 6302/3052/7634 +f 6265/3015/7597 6255/3004/7587 6287/3038/7619 6282/3033/7614 +f 6300/3050/7632 6270/3020/7602 6272/3022/7604 6303/3053/7635 +f 6304/3054/7636 6301/3051/7633 6275/3025/7607 6281/3031/7613 +f 6302/3052/7634 6290/3040/7622 6289/3039/7621 6305/3055/7637 +f 6262/3012/7594 6265/3015/7597 6282/3033/7614 6277/3028/7609 +f 6303/3053/7635 6272/3022/7604 6274/3024/7606 6306/3056/7638 +f 6307/3057/7639 6304/3054/7636 6281/3031/7613 6286/3036/7618 +f 6305/3055/7637 6289/3039/7621 6288/3037/7620 6308/3058/7640 +f 6259/3009/7591 6262/3012/7594 6277/3028/7609 6268/3018/7600 +f 6306/3056/7638 6274/3024/7606 6276/3026/7608 6295/3043/7627 +f 6297/3046/7629 6307/3057/7639 6286/3036/7618 6291/3041/7623 +f 6308/3058/7640 6288/3037/7620 6287/3038/7619 6299/3049/7631 +f 6251/3003/7583 6259/3009/7591 6268/3018/7600 6267/3019/7599 +f 6309/3061/7641 6310/3060/7642 6311/3059/7643 6312/3062/7644 +f 6312/3062/7644 6311/3059/7643 6313/3063/7645 6314/3064/7646 +f 6314/3064/7646 6313/3063/7645 6315/3065/7647 6316/3066/7648 +f 6316/3066/7648 6315/3065/7647 6317/3067/7649 6318/3068/7650 +f 6310/3060/7642 6319/3070/7651 6320/3069/7652 6311/3059/7643 +f 6311/3059/7643 6320/3069/7652 6321/3071/7653 6313/3063/7645 +f 6313/3063/7645 6321/3071/7653 6322/3072/7654 6315/3065/7647 +f 6315/3065/7647 6322/3072/7654 6323/3073/7655 6317/3067/7649 +f 6319/3070/7651 6324/3075/7656 6325/3074/7657 6320/3069/7652 +f 6320/3069/7652 6325/3074/7657 6326/3076/7658 6321/3071/7653 +f 6321/3071/7653 6326/3076/7658 6327/3077/7659 6322/3072/7654 +f 6322/3072/7654 6327/3077/7659 6328/3078/7660 6323/3073/7655 +f 6324/3075/7656 6329/3080/7661 6330/3079/7662 6325/3074/7657 +f 6325/3074/7657 6330/3079/7662 6331/3081/7663 6326/3076/7658 +f 6326/3076/7658 6331/3081/7663 6332/3082/7664 6327/3077/7659 +f 6327/3077/7659 6332/3082/7664 6333/3083/7665 6328/3078/7660 +f 6294/3044/7626 6293/3045/7625 6309/3061/7641 6334/3084/7666 +f 6335/3087/7667 6336/3086/7668 6337/3085/7669 6318/3068/7650 +f 6338/3089/7670 6339/3088/7671 6333/3083/7665 6340/3090/7672 +f 6297/3046/7629 6296/3047/7628 6341/3091/7673 6329/3080/7661 +f 6334/3084/7666 6309/3061/7641 6312/3062/7644 6342/3092/7674 +f 6343/3093/7675 6335/3087/7667 6318/3068/7650 6317/3067/7649 +f 6340/3090/7672 6333/3083/7665 6332/3082/7664 6344/3094/7676 +f 6307/3057/7639 6297/3046/7629 6329/3080/7661 6324/3075/7656 +f 6342/3092/7674 6312/3062/7644 6314/3064/7646 6345/3095/7677 +f 6346/3096/7678 6343/3093/7675 6317/3067/7649 6323/3073/7655 +f 6344/3094/7676 6332/3082/7664 6331/3081/7663 6347/3097/7679 +f 6304/3054/7636 6307/3057/7639 6324/3075/7656 6319/3070/7651 +f 6345/3095/7677 6314/3064/7646 6316/3066/7648 6348/3098/7680 +f 6349/3099/7681 6346/3096/7678 6323/3073/7655 6328/3078/7660 +f 6347/3097/7679 6331/3081/7663 6330/3079/7662 6350/3100/7682 +f 6301/3051/7633 6304/3054/7636 6319/3070/7651 6310/3060/7642 +f 6348/3098/7680 6316/3066/7648 6318/3068/7650 6337/3085/7669 +f 6339/3088/7671 6349/3099/7681 6328/3078/7660 6333/3083/7665 +f 6350/3100/7682 6330/3079/7662 6329/3080/7661 6341/3091/7673 +f 6293/3045/7625 6301/3051/7633 6310/3060/7642 6309/3061/7641 +f 6351/3103/7683 6352/3102/7684 6353/3101/7685 6354/3104/7686 +f 6354/3104/7686 6353/3101/7685 6355/3105/7687 6356/3106/7688 +f 6356/3106/7688 6355/3105/7687 6357/3107/7689 6358/3108/7690 +f 6358/3108/7690 6357/3107/7689 6359/3109/7691 6360/3110/7692 +f 6352/3102/7684 6361/3112/7693 6362/3111/7694 6353/3101/7685 +f 6353/3101/7685 6362/3111/7694 6363/3113/7695 6355/3105/7687 +f 6355/3105/7687 6363/3113/7695 6364/3114/7696 6357/3107/7689 +f 6357/3107/7689 6364/3114/7696 6365/3115/7697 6359/3109/7691 +f 6361/3112/7693 6366/3117/7698 6367/3116/7699 6362/3111/7694 +f 6362/3111/7694 6367/3116/7699 6368/3118/7700 6363/3113/7695 +f 6363/3113/7695 6368/3118/7700 6369/3119/7701 6364/3114/7696 +f 6364/3114/7696 6369/3119/7701 6370/3120/7702 6365/3115/7697 +f 6366/3117/7698 6371/3122/7703 6372/3121/7704 6367/3116/7699 +f 6367/3116/7699 6372/3121/7704 6373/3123/7705 6368/3118/7700 +f 6368/3118/7700 6373/3123/7705 6374/3124/7706 6369/3119/7701 +f 6369/3119/7701 6374/3124/7706 6375/3125/7707 6370/3120/7702 +f 6376/3127/7708 6377/3126/7709 6351/3103/7683 6378/3128/7710 +f 6379/3131/7711 6380/3130/7712 6381/3129/7713 6360/3110/7692 +f 6205/2955/7537 6382/3132/7714 6375/3125/7707 6206/2954/7538 +f 6383/3133/7715 6201/2952/7533 6203/2953/7535 6371/3122/7703 +f 6378/3128/7710 6351/3103/7683 6354/3104/7686 6384/3134/7716 +f 6385/3135/7717 6379/3131/7711 6360/3110/7692 6359/3109/7691 +f 6206/2954/7538 6375/3125/7707 6374/3124/7706 6221/2971/7553 +f 6386/3136/7718 6383/3133/7715 6371/3122/7703 6366/3117/7698 +f 6384/3134/7716 6354/3104/7686 6356/3106/7688 6387/3137/7719 +f 6388/3138/7720 6385/3135/7717 6359/3109/7691 6365/3115/7697 +f 6221/2971/7553 6374/3124/7706 6373/3123/7705 6217/2967/7549 +f 6389/3139/7721 6386/3136/7718 6366/3117/7698 6361/3112/7693 +f 6387/3137/7719 6356/3106/7688 6358/3108/7690 6390/3140/7722 +f 6391/3141/7723 6388/3138/7720 6365/3115/7697 6370/3120/7702 +f 6217/2967/7549 6373/3123/7705 6372/3121/7704 6213/2963/7545 +f 6392/3142/7724 6389/3139/7721 6361/3112/7693 6352/3102/7684 +f 6390/3140/7722 6358/3108/7690 6360/3110/7692 6381/3129/7713 +f 6382/3132/7714 6391/3141/7723 6370/3120/7702 6375/3125/7707 +f 6213/2963/7545 6372/3121/7704 6371/3122/7703 6203/2953/7535 +f 6377/3126/7709 6392/3142/7724 6352/3102/7684 6351/3103/7683 +f 6393/3145/7725 6394/3144/7726 6395/3143/7727 6396/3146/7728 +f 6396/3146/7728 6395/3143/7727 6397/3147/7729 6398/3148/7730 +f 6398/3148/7730 6397/3147/7729 6399/3149/7731 6400/3150/7732 +f 6400/3150/7732 6399/3149/7731 6401/3151/7733 6402/3152/7734 +f 6394/3144/7726 6403/3154/7735 6404/3153/7736 6395/3143/7727 +f 6395/3143/7727 6404/3153/7736 6405/3155/7737 6397/3147/7729 +f 6397/3147/7729 6405/3155/7737 6406/3156/7738 6399/3149/7731 +f 6399/3149/7731 6406/3156/7738 6407/3157/7739 6401/3151/7733 +f 6403/3154/7735 6408/3159/7740 6409/3158/7741 6404/3153/7736 +f 6404/3153/7736 6409/3158/7741 6410/3160/7742 6405/3155/7737 +f 6405/3155/7737 6410/3160/7742 6411/3161/7743 6406/3156/7738 +f 6406/3156/7738 6411/3161/7743 6412/3162/7744 6407/3157/7739 +f 6408/3159/7740 6413/3164/7745 6414/3163/7746 6409/3158/7741 +f 6409/3158/7741 6414/3163/7746 6415/3165/7747 6410/3160/7742 +f 6410/3160/7742 6415/3165/7747 6416/3166/7748 6411/3161/7743 +f 6411/3161/7743 6416/3166/7748 6417/3167/7749 6412/3162/7744 +f 6380/3130/7712 6379/3131/7711 6393/3145/7725 6418/3168/7750 +f 6419/3171/7751 6420/3170/7752 6421/3169/7753 6402/3152/7734 +f 6252/3002/7584 6422/3172/7754 6417/3167/7749 6253/3001/7585 +f 6382/3132/7714 6205/2955/7537 6250/3000/7582 6413/3164/7745 +f 6418/3168/7750 6393/3145/7725 6396/3146/7728 6423/3173/7755 +f 6424/3174/7756 6419/3171/7751 6402/3152/7734 6401/3151/7733 +f 6253/3001/7585 6417/3167/7749 6416/3166/7748 6264/3014/7596 +f 6391/3141/7723 6382/3132/7714 6413/3164/7745 6408/3159/7740 +f 6423/3173/7755 6396/3146/7728 6398/3148/7730 6425/3175/7757 +f 6426/3176/7758 6424/3174/7756 6401/3151/7733 6407/3157/7739 +f 6264/3014/7596 6416/3166/7748 6415/3165/7747 6261/3011/7593 +f 6388/3138/7720 6391/3141/7723 6408/3159/7740 6403/3154/7735 +f 6425/3175/7757 6398/3148/7730 6400/3150/7732 6427/3177/7759 +f 6428/3178/7760 6426/3176/7758 6407/3157/7739 6412/3162/7744 +f 6261/3011/7593 6415/3165/7747 6414/3163/7746 6258/3008/7590 +f 6385/3135/7717 6388/3138/7720 6403/3154/7735 6394/3144/7726 +f 6427/3177/7759 6400/3150/7732 6402/3152/7734 6421/3169/7753 +f 6422/3172/7754 6428/3178/7760 6412/3162/7744 6417/3167/7749 +f 6258/3008/7590 6414/3163/7746 6413/3164/7745 6250/3000/7582 +f 6379/3131/7711 6385/3135/7717 6394/3144/7726 6393/3145/7725 +f 6429/3181/7761 6430/3180/7762 6431/3179/7763 6432/3182/7764 +f 6432/3182/7764 6431/3179/7763 6433/3183/7765 6434/3184/7766 +f 6434/3184/7766 6433/3183/7765 6435/3185/7767 6436/3186/7768 +f 6436/3186/7768 6435/3185/7767 6437/3187/7769 6438/3188/7770 +f 6430/3180/7762 6439/3190/7771 6440/3189/7772 6431/3179/7763 +f 6431/3179/7763 6440/3189/7772 6441/3191/7773 6433/3183/7765 +f 6433/3183/7765 6441/3191/7773 6442/3192/7774 6435/3185/7767 +f 6435/3185/7767 6442/3192/7774 6443/3193/7775 6437/3187/7769 +f 6439/3190/7771 6444/3195/7776 6445/3194/7777 6440/3189/7772 +f 6440/3189/7772 6445/3194/7777 6446/3196/7778 6441/3191/7773 +f 6441/3191/7773 6446/3196/7778 6447/3197/7779 6442/3192/7774 +f 6442/3192/7774 6447/3197/7779 6448/3198/7780 6443/3193/7775 +f 6444/3195/7776 6449/3200/7781 6450/3199/7782 6445/3194/7777 +f 6445/3194/7777 6450/3199/7782 6451/3201/7783 6446/3196/7778 +f 6446/3196/7778 6451/3201/7783 6452/3202/7784 6447/3197/7779 +f 6447/3197/7779 6452/3202/7784 6453/3203/7785 6448/3198/7780 +f 6420/3170/7752 6419/3171/7751 6429/3181/7761 6454/3204/7786 +f 6455/3207/7787 6456/3206/7788 6457/3205/7789 6438/3188/7770 +f 6294/3044/7626 6458/3208/7790 6453/3203/7785 6295/3043/7627 +f 6422/3172/7754 6252/3002/7584 6292/3042/7624 6449/3200/7781 +f 6454/3204/7786 6429/3181/7761 6432/3182/7764 6459/3209/7791 +f 6460/3210/7792 6455/3207/7787 6438/3188/7770 6437/3187/7769 +f 6295/3043/7627 6453/3203/7785 6452/3202/7784 6306/3056/7638 +f 6428/3178/7760 6422/3172/7754 6449/3200/7781 6444/3195/7776 +f 6459/3209/7791 6432/3182/7764 6434/3184/7766 6461/3211/7793 +f 6462/3212/7794 6460/3210/7792 6437/3187/7769 6443/3193/7775 +f 6306/3056/7638 6452/3202/7784 6451/3201/7783 6303/3053/7635 +f 6426/3176/7758 6428/3178/7760 6444/3195/7776 6439/3190/7771 +f 6461/3211/7793 6434/3184/7766 6436/3186/7768 6463/3213/7795 +f 6464/3214/7796 6462/3212/7794 6443/3193/7775 6448/3198/7780 +f 6303/3053/7635 6451/3201/7783 6450/3199/7782 6300/3050/7632 +f 6424/3174/7756 6426/3176/7758 6439/3190/7771 6430/3180/7762 +f 6463/3213/7795 6436/3186/7768 6438/3188/7770 6457/3205/7789 +f 6458/3208/7790 6464/3214/7796 6448/3198/7780 6453/3203/7785 +f 6300/3050/7632 6450/3199/7782 6449/3200/7781 6292/3042/7624 +f 6419/3171/7751 6424/3174/7756 6430/3180/7762 6429/3181/7761 +f 6465/3217/7797 6466/3216/7798 6467/3215/7799 6468/3218/7800 +f 6468/3218/7800 6467/3215/7799 6469/3219/7801 6470/3220/7802 +f 6470/3220/7802 6469/3219/7801 6471/3221/7803 6472/3222/7804 +f 6472/3222/7804 6471/3221/7803 6473/3223/7805 6474/3224/7806 +f 6466/3216/7798 6475/3226/7807 6476/3225/7808 6467/3215/7799 +f 6467/3215/7799 6476/3225/7808 6477/3227/7809 6469/3219/7801 +f 6469/3219/7801 6477/3227/7809 6478/3228/7810 6471/3221/7803 +f 6471/3221/7803 6478/3228/7810 6479/3229/7811 6473/3223/7805 +f 6475/3226/7807 6480/3231/7812 6481/3230/7813 6476/3225/7808 +f 6476/3225/7808 6481/3230/7813 6482/3232/7814 6477/3227/7809 +f 6477/3227/7809 6482/3232/7814 6483/3233/7815 6478/3228/7810 +f 6478/3228/7810 6483/3233/7815 6484/3234/7816 6479/3229/7811 +f 6480/3231/7812 6485/3236/7817 6486/3235/7818 6481/3230/7813 +f 6481/3230/7813 6486/3235/7818 6487/3237/7819 6482/3232/7814 +f 6482/3232/7814 6487/3237/7819 6488/3238/7820 6483/3233/7815 +f 6483/3233/7815 6488/3238/7820 6489/3239/7821 6484/3234/7816 +f 6456/3206/7788 6455/3207/7787 6465/3217/7797 6490/3240/7822 +f 6491/3243/7823 6492/3242/7824 6493/3241/7825 6474/3224/7806 +f 6336/3086/7668 6494/3244/7826 6489/3239/7821 6337/3085/7669 +f 6458/3208/7790 6294/3044/7626 6334/3084/7666 6485/3236/7817 +f 6490/3240/7822 6465/3217/7797 6468/3218/7800 6495/3245/7827 +f 6496/3246/7828 6491/3243/7823 6474/3224/7806 6473/3223/7805 +f 6337/3085/7669 6489/3239/7821 6488/3238/7820 6348/3098/7680 +f 6464/3214/7796 6458/3208/7790 6485/3236/7817 6480/3231/7812 +f 6495/3245/7827 6468/3218/7800 6470/3220/7802 6497/3247/7829 +f 6498/3248/7830 6496/3246/7828 6473/3223/7805 6479/3229/7811 +f 6348/3098/7680 6488/3238/7820 6487/3237/7819 6345/3095/7677 +f 6462/3212/7794 6464/3214/7796 6480/3231/7812 6475/3226/7807 +f 6497/3247/7829 6470/3220/7802 6472/3222/7804 6499/3249/7831 +f 6500/3250/7832 6498/3248/7830 6479/3229/7811 6484/3234/7816 +f 6345/3095/7677 6487/3237/7819 6486/3235/7818 6342/3092/7674 +f 6460/3210/7792 6462/3212/7794 6475/3226/7807 6466/3216/7798 +f 6499/3249/7831 6472/3222/7804 6474/3224/7806 6493/3241/7825 +f 6494/3244/7826 6500/3250/7832 6484/3234/7816 6489/3239/7821 +f 6342/3092/7674 6486/3235/7818 6485/3236/7817 6334/3084/7666 +f 6455/3207/7787 6460/3210/7792 6466/3216/7798 6465/3217/7797 +s 2 +f 6202/2951/7833 6201/2952/7834 5877/2952/7835 5876/2951/7836 +s 4 +f 6207/2958/7837 6209/2959/7838 5884/2959/7839 5883/2958/7840 +f 6212/2960/7841 6211/2961/7842 5886/2961/7843 5885/2960/7844 +s 2 +f 6211/2961/7845 6210/2962/7846 5887/2962/7847 5886/2961/7848 +s 4 +f 6209/2959/7838 6215/2965/7849 5890/2965/7850 5884/2959/7839 +s 2 +f 6210/2962/7846 6216/2966/7851 5891/2966/7852 5887/2962/7847 +s 4 +f 6215/2965/7849 6219/2969/7853 5894/2969/7854 5890/2965/7850 +s 2 +f 6216/2966/7851 6220/2970/7855 5895/2970/7856 5891/2966/7852 +s 4 +f 6219/2969/7853 6223/2973/7857 5898/2973/7858 5894/2969/7854 +s 2 +f 6220/2970/7855 6224/2974/7859 5899/2974/7860 5895/2970/7856 +s 4 +f 6223/2973/7857 6212/2960/7841 5885/2960/7844 5898/2973/7858 +s 2 +f 6224/2974/7859 6202/2951/7833 5876/2951/7836 5899/2974/7860 +s 4 +f 6254/3005/7861 6256/3006/7862 5931/3006/7863 5930/3005/7864 +f 6257/3007/7865 6207/2958/7837 5883/2958/7840 5932/3007/7866 +f 6256/3006/7862 6260/3010/7867 5935/3010/7868 5931/3006/7863 +f 6260/3010/7867 6263/3013/7869 5938/3013/7870 5935/3010/7868 +f 6263/3013/7869 6266/3016/7871 5941/3016/7872 5938/3013/7870 +f 6266/3016/7871 6257/3007/7865 5932/3007/7866 5941/3016/7872 +f 6296/3047/7873 6298/3048/7874 5973/3048/7875 5972/3047/7876 +f 6299/3049/7877 6254/3005/7861 5930/3005/7864 5974/3049/7878 +f 6298/3048/7874 6302/3052/7879 5977/3052/7880 5973/3048/7875 +f 6302/3052/7879 6305/3055/7881 5980/3055/7882 5977/3052/7880 +f 6305/3055/7881 6308/3058/7883 5983/3058/7884 5980/3055/7882 +f 6308/3058/7883 6299/3049/7877 5974/3049/7878 5983/3058/7884 +f 6336/3086/7885 6335/3087/7886 6012/3087/7887 6011/3086/7888 +f 6338/3089/7889 6340/3090/7890 6015/3090/7891 6014/3089/7892 +f 6339/3088/7893 6338/3089/7889 6014/3089/7892 6013/3088/7894 +f 6341/3091/7895 6296/3047/7873 5972/3047/7876 6016/3091/7896 +f 6335/3087/7886 6343/3093/7897 6018/3093/7898 6012/3087/7887 +f 6340/3090/7890 6344/3094/7899 6019/3094/7900 6015/3090/7891 +f 6343/3093/7897 6346/3096/7901 6021/3096/7902 6018/3093/7898 +f 6344/3094/7899 6347/3097/7903 6022/3097/7904 6019/3094/7900 +f 6346/3096/7901 6349/3099/7905 6024/3099/7906 6021/3096/7902 +f 6347/3097/7903 6350/3100/7907 6025/3100/7908 6022/3097/7904 +f 6349/3099/7905 6339/3088/7893 6013/3088/7894 6024/3099/7906 +f 6350/3100/7907 6341/3091/7895 6016/3091/7896 6025/3100/7908 +f 6376/3127/7909 6378/3128/7910 6053/3128/7911 6052/3127/7912 +s 2 +f 6377/3126/7913 6376/3127/7914 6052/3127/7915 6051/3126/7916 +s 4 +f 6381/3129/7917 6380/3130/7918 6055/3130/7919 6054/3129/7920 +s 2 +f 6201/2952/7834 6383/3133/7921 6058/3133/7922 5877/2952/7835 +s 4 +f 6378/3128/7910 6384/3134/7923 6059/3134/7924 6053/3128/7911 +s 2 +f 6383/3133/7921 6386/3136/7925 6061/3136/7926 6058/3133/7922 +s 4 +f 6384/3134/7923 6387/3137/7927 6062/3137/7928 6059/3134/7924 +s 2 +f 6386/3136/7925 6389/3139/7929 6064/3139/7930 6061/3136/7926 +s 4 +f 6387/3137/7927 6390/3140/7931 6065/3140/7932 6062/3137/7928 +s 2 +f 6389/3139/7929 6392/3142/7933 6067/3142/7934 6064/3139/7930 +s 4 +f 6390/3140/7931 6381/3129/7917 6054/3129/7920 6065/3140/7932 +s 2 +f 6392/3142/7933 6377/3126/7913 6051/3126/7916 6067/3142/7934 +s 4 +f 6380/3130/7918 6418/3168/7935 6093/3168/7936 6055/3130/7919 +f 6421/3169/7937 6420/3170/7938 6095/3170/7939 6094/3169/7940 +f 6418/3168/7935 6423/3173/7941 6098/3173/7942 6093/3168/7936 +f 6423/3173/7941 6425/3175/7943 6100/3175/7944 6098/3173/7942 +f 6425/3175/7943 6427/3177/7945 6102/3177/7946 6100/3175/7944 +f 6427/3177/7945 6421/3169/7937 6094/3169/7940 6102/3177/7946 +f 6420/3170/7938 6454/3204/7947 6129/3204/7948 6095/3170/7939 +f 6457/3205/7949 6456/3206/7950 6131/3206/7951 6130/3205/7952 +f 6454/3204/7947 6459/3209/7953 6134/3209/7954 6129/3204/7948 +f 6459/3209/7953 6461/3211/7955 6136/3211/7956 6134/3209/7954 +f 6461/3211/7955 6463/3213/7957 6138/3213/7958 6136/3211/7956 +f 6463/3213/7957 6457/3205/7949 6130/3205/7952 6138/3213/7958 +f 6456/3206/7950 6490/3240/7959 6165/3240/7960 6131/3206/7951 +f 6493/3241/7961 6492/3242/7962 6167/3242/7963 6166/3241/7964 +f 6492/3242/7962 6491/3243/7965 6168/3243/7966 6167/3242/7963 +f 6494/3244/7967 6336/3086/7885 6011/3086/7888 6169/3244/7968 +f 6490/3240/7959 6495/3245/7969 6170/3245/7970 6165/3240/7960 +f 6491/3243/7965 6496/3246/7971 6171/3246/7972 6168/3243/7966 +f 6495/3245/7969 6497/3247/7973 6172/3247/7974 6170/3245/7970 +f 6496/3246/7971 6498/3248/7975 6173/3248/7976 6171/3246/7972 +f 6497/3247/7973 6499/3249/7977 6174/3249/7978 6172/3247/7974 +f 6498/3248/7975 6500/3250/7979 6175/3250/7980 6173/3248/7976 +f 6499/3249/7977 6493/3241/7961 6166/3241/7964 6174/3249/7978 +f 6500/3250/7979 6494/3244/7967 6169/3244/7968 6175/3250/7980 +# 648 polygons + +# +# object lotu_petal_10 +# + +v -0.2508 0.0656 -0.0301 +v -0.2045 0.0470 -0.0050 +v -0.1565 0.0322 -0.0463 +v -0.1937 0.0494 -0.0737 +v -0.2961 0.0849 -0.0647 +v -0.2327 0.0669 -0.1103 +v -0.3459 0.1023 -0.1020 +v -0.2783 0.0865 -0.1573 +v -0.3955 0.1325 -0.1534 +v -0.3307 0.1144 -0.2024 +v -0.3051 0.0881 0.0127 +v -0.2541 0.0742 0.0343 +v -0.3602 0.1011 -0.0151 +v -0.4133 0.1221 -0.0564 +v -0.4673 0.1523 -0.0972 +v -0.3661 0.1176 0.0571 +v -0.3064 0.1041 0.0702 +v -0.4251 0.1263 0.0271 +v -0.4810 0.1481 -0.0016 +v -0.5391 0.1658 -0.0407 +v -0.4226 0.1431 0.0948 +v -0.3572 0.1366 0.1105 +v -0.4882 0.1561 0.0782 +v -0.5504 0.1696 0.0502 +v -0.6081 0.1921 0.0262 +v -0.1237 0.0253 -0.0167 +v -0.0845 0.0204 -0.0427 +v -0.1112 0.0249 -0.0779 +v -0.2541 0.1056 -0.2612 +v -0.3000 0.1435 -0.3161 +v -0.3725 0.1522 -0.2635 +v -0.6681 0.2134 -0.0048 +v -0.7392 0.2424 0.0676 +v -0.6753 0.2246 0.0968 +v -0.4013 0.1692 0.1436 +v -0.3299 0.1616 0.1468 +v -0.2884 0.1232 0.1073 +v -0.1397 0.0365 -0.1180 +v -0.4496 0.1708 -0.2081 +v -0.6061 0.2042 0.1141 +v -0.2448 0.0894 0.0778 +v -0.1748 0.0487 -0.1578 +v -0.5205 0.1837 -0.1467 +v -0.5399 0.1897 0.1239 +v -0.2023 0.0599 0.0470 +v -0.2164 0.0720 -0.2055 +v -0.5897 0.1975 -0.0768 +v -0.4716 0.1767 0.1378 +v -0.1622 0.0391 0.0122 +v -0.5509 0.2480 -0.3279 +v -0.4971 0.2108 -0.2649 +v -0.4229 0.1987 -0.3287 +v -0.4714 0.2347 -0.3949 +v -0.6080 0.2884 -0.3810 +v -0.5299 0.2671 -0.4662 +v -0.6715 0.3319 -0.4406 +v -0.5911 0.3169 -0.5241 +v -0.7302 0.3959 -0.5200 +v -0.6419 0.3832 -0.5954 +v -0.6318 0.2533 -0.2422 +v -0.5751 0.2188 -0.1946 +v -0.6846 0.2934 -0.2966 +v -0.7439 0.3424 -0.3708 +v -0.8077 0.4022 -0.4575 +v -0.7059 0.2624 -0.1638 +v -0.6451 0.2277 -0.1175 +v -0.7634 0.3117 -0.2266 +v -0.8156 0.3623 -0.3093 +v -0.8739 0.4216 -0.3988 +v -0.7749 0.2744 -0.0974 +v -0.7212 0.2372 -0.0421 +v -0.8303 0.3249 -0.1662 +v -0.8911 0.3798 -0.2456 +v -0.9469 0.4468 -0.3295 +v -0.3485 0.1860 -0.3792 +v -0.5512 0.3696 -0.6770 +v -0.6014 0.4417 -0.7571 +v -0.6860 0.4566 -0.6783 +v -1.0072 0.5299 -0.4277 +v -1.0711 0.5564 -0.3447 +v -1.0245 0.4679 -0.2675 +v -0.7975 0.2709 0.0202 +v -0.3941 0.2268 -0.4525 +v -0.7697 0.4734 -0.6200 +v -0.9649 0.4038 -0.1819 +v -0.4505 0.2552 -0.5273 +v -0.8572 0.4876 -0.5553 +v -0.9047 0.3517 -0.1066 +v -0.5029 0.3039 -0.6037 +v -0.9395 0.4961 -0.4882 +v -0.8478 0.3043 -0.0364 +v -0.8694 0.7085 -0.8305 +v -0.8257 0.5767 -0.7267 +v -0.7474 0.5711 -0.7870 +v -0.7885 0.7049 -0.9100 +v -0.9226 0.8693 -0.9172 +v -0.8436 0.8605 -0.9945 +v -0.9502 1.0361 -1.0038 +v -0.8754 1.0315 -1.0725 +v -0.9698 1.2016 -1.0667 +v -0.9030 1.2007 -1.1263 +v -0.9558 0.7148 -0.7601 +v -0.9067 0.5808 -0.6626 +v -1.0034 0.8689 -0.8380 +v -1.0276 1.0392 -0.9308 +v -1.0379 1.2039 -1.0091 +v -1.0378 0.7283 -0.6817 +v -0.9843 0.6033 -0.5928 +v -1.0815 0.8807 -0.7613 +v -1.1003 1.0521 -0.8556 +v -1.1033 1.2106 -0.9431 +v -1.1069 0.7574 -0.6016 +v -1.0596 0.6377 -0.5099 +v -1.1542 0.8984 -0.6839 +v -1.1594 1.0555 -0.7850 +v -1.1656 1.2195 -0.8700 +v -0.6616 0.5500 -0.8541 +v -0.8426 1.2046 -1.1726 +v -0.8660 1.3473 -1.2221 +v -0.9304 1.3484 -1.1753 +v -1.1595 1.3580 -0.9271 +v -1.2061 1.3647 -0.8485 +v -1.2223 1.2287 -0.7928 +v -1.1298 0.6709 -0.4366 +v -0.7089 0.6968 -0.9714 +v -0.9873 1.3533 -1.1165 +v -1.2204 1.0768 -0.7118 +v -0.7685 0.8601 -1.0602 +v -1.0401 1.3524 -1.0583 +v -1.2086 0.9259 -0.6111 +v -0.8079 1.0386 -1.1232 +v -1.0942 1.3526 -0.9988 +v -1.1707 0.7934 -0.5232 +v -0.9626 1.6055 -1.1778 +v -0.9843 1.4848 -1.1489 +v -0.9354 1.4784 -1.1973 +v -0.9215 1.6009 -1.2214 +v -0.9421 1.7159 -1.1969 +v -0.9089 1.7143 -1.2351 +v -0.9077 1.8164 -1.1977 +v -0.8794 1.8167 -1.2300 +v -0.8690 1.9080 -1.2084 +v -0.8494 1.9104 -1.2295 +v -1.0012 1.6071 -1.1273 +v -1.0296 1.4833 -1.0967 +v -0.9742 1.7184 -1.1564 +v -0.9356 1.8154 -1.1637 +v -0.8893 1.9002 -1.1815 +v -1.0406 1.6041 -1.0766 +v -1.0728 1.4828 -1.0411 +v -1.0050 1.7138 -1.1178 +v -0.9593 1.8124 -1.1333 +v -0.9115 1.8940 -1.1525 +v -1.0753 1.5989 -1.0228 +v -1.1160 1.4808 -0.9775 +v -1.0356 1.7060 -1.0735 +v -0.9875 1.8024 -1.1021 +v -0.9297 1.8840 -1.1308 +v -0.8790 1.4764 -1.2462 +v -0.8326 1.9090 -1.2451 +v -0.8187 1.9868 -1.2191 +v -0.8300 1.9886 -1.2093 +v -0.8756 1.9587 -1.1703 +v -0.8847 1.9423 -1.1662 +v -0.9478 1.8718 -1.1148 +v -1.1655 1.4866 -0.9045 +v -0.8697 1.5980 -1.2633 +v -0.8414 1.9874 -1.1978 +v -1.0093 1.7921 -1.0751 +v -0.8727 1.7116 -1.2706 +v -0.8531 1.9808 -1.1869 +v -1.0679 1.6978 -1.0279 +v -0.8540 1.8157 -1.2531 +v -0.8647 1.9709 -1.1782 +v -1.1119 1.5954 -0.9647 +v 0.0872 0.0720 -0.2749 +v 0.0850 0.0633 -0.2147 +v 0.1342 0.0891 -0.2435 +v 0.1500 0.1029 -0.3065 +v 0.0833 0.0892 -0.3389 +v 0.1455 0.1218 -0.3726 +v 0.0597 0.1131 -0.4050 +v 0.1359 0.1409 -0.4430 +v 0.0427 0.1364 -0.4705 +v 0.1243 0.1594 -0.5171 +v 0.0268 0.0458 -0.2366 +v 0.0351 0.0392 -0.1817 +v 0.0161 0.0606 -0.2943 +v -0.0063 0.0891 -0.3548 +v -0.0401 0.1192 -0.4183 +v -0.0321 0.0342 -0.1927 +v -0.0136 0.0249 -0.1432 +v -0.0524 0.0479 -0.2462 +v -0.0747 0.0767 -0.3072 +v -0.1115 0.1087 -0.3676 +v -0.0866 0.0300 -0.1528 +v -0.0629 0.0222 -0.1077 +v -0.1159 0.0389 -0.2035 +v -0.1477 0.0655 -0.2572 +v -0.1797 0.0988 -0.3129 +v 0.1199 0.0878 -0.1801 +v 0.1590 0.1166 -0.2039 +v 0.1887 0.1274 -0.2751 +v 0.2121 0.1919 -0.5653 +v 0.1974 0.2060 -0.6409 +v 0.1113 0.1754 -0.5939 +v -0.2287 0.1379 -0.3713 +v -0.0442 0.0212 -0.0705 +v 0.2077 0.1488 -0.3456 +v 0.0207 0.1539 -0.5418 +v -0.0020 0.0243 -0.0999 +v 0.2132 0.1662 -0.4171 +v -0.0640 0.1416 -0.4847 +v 0.0377 0.0382 -0.1289 +v 0.2163 0.1797 -0.4914 +v -0.1489 0.1369 -0.4270 +v 0.0797 0.0602 -0.1559 +v -0.0340 0.2278 -0.6873 +v -0.0056 0.1840 -0.6166 +v 0.0849 0.1995 -0.6733 +v 0.0643 0.2429 -0.7523 +v -0.0679 0.2626 -0.7612 +v 0.0274 0.2830 -0.8316 +v -0.1140 0.3099 -0.8396 +v -0.0168 0.3328 -0.9061 +v -0.1677 0.3851 -0.9204 +v -0.0693 0.4046 -0.9772 +v -0.1332 0.2189 -0.6228 +v -0.0944 0.1714 -0.5514 +v -0.1660 0.2587 -0.7040 +v -0.2113 0.3000 -0.7880 +v -0.2693 0.3761 -0.8624 +v -0.2224 0.2140 -0.5650 +v -0.1856 0.1743 -0.4936 +v -0.2690 0.2472 -0.6464 +v -0.3078 0.2945 -0.7250 +v -0.3600 0.3622 -0.8044 +v -0.3144 0.2144 -0.5072 +v -0.2688 0.1802 -0.4383 +v -0.3634 0.2530 -0.5873 +v -0.4076 0.2994 -0.6614 +v -0.4538 0.3537 -0.7434 +v 0.1853 0.2309 -0.7187 +v 0.0309 0.4253 -1.0328 +v -0.0245 0.5049 -1.1002 +v -0.1293 0.4964 -1.0453 +v -0.5146 0.4377 -0.8278 +v 0.1581 0.2717 -0.7987 +v -0.2291 0.4759 -0.9974 +v 0.1256 0.3106 -0.8817 +v -0.3251 0.4582 -0.9437 +v 0.0847 0.3555 -0.9591 +v -0.4273 0.4432 -0.8903 +v -0.3676 0.7069 -1.1719 +v -0.2915 0.5870 -1.0889 +v -0.1940 0.5951 -1.1309 +v -0.2691 0.7184 -1.2142 +v -0.4272 0.8569 -1.2322 +v -0.3296 0.8658 -1.2731 +v -0.4822 1.0174 -1.3021 +v -0.3923 1.0265 -1.3334 +v -0.5397 1.1674 -1.3593 +v -0.4527 1.1802 -1.3897 +v -0.4615 0.7063 -1.1299 +v -0.3840 0.5741 -1.0344 +v -0.5202 0.8535 -1.2079 +v -0.5729 1.0035 -1.2692 +v -0.6224 1.1614 -1.3239 +v -0.5466 0.6983 -1.0823 +v -0.4734 0.5571 -0.9782 +v -0.6041 0.8479 -1.1675 +v -0.6576 1.0124 -1.2281 +v -0.7031 1.1760 -1.2775 +v -0.6339 0.6979 -1.0278 +v -0.5692 0.5571 -0.9249 +v -0.6888 0.8566 -1.1171 +v -0.7359 1.0240 -1.1755 +v -0.7769 1.1896 -1.2203 +v -0.0933 0.6114 -1.1681 +v -0.3619 1.1868 -1.4212 +v -0.4211 1.3233 -1.4316 +v -0.5019 1.3178 -1.4134 +v -0.8032 1.3386 -1.2653 +v -0.1648 0.7268 -1.2561 +v -0.5788 1.3085 -1.3853 +v -0.2313 0.8680 -1.3054 +v -0.6557 1.3151 -1.3498 +v -0.3010 1.0246 -1.3683 +v -0.7321 1.3256 -1.3070 +v -0.6496 1.5626 -1.3938 +v -0.6252 1.4392 -1.4015 +v -0.5559 1.4371 -1.4246 +v -0.5886 1.5540 -1.4197 +v -0.6857 1.6785 -1.3715 +v -0.6355 1.6631 -1.3942 +v -0.7122 1.7813 -1.3391 +v -0.6734 1.7662 -1.3580 +v -0.7325 1.8701 -1.3017 +v -0.7068 1.8571 -1.3130 +v -0.7080 1.5752 -1.3675 +v -0.6916 1.4501 -1.3651 +v -0.7364 1.6882 -1.3465 +v -0.7535 1.7915 -1.3165 +v -0.7605 1.8862 -1.2861 +v -0.7633 1.5799 -1.3393 +v -0.7546 1.4554 -1.3259 +v -0.7866 1.6982 -1.3228 +v -0.7921 1.8044 -1.2949 +v -0.7890 1.8969 -1.2715 +v -0.8157 1.5909 -1.3024 +v -0.8186 1.4688 -1.2840 +v -0.8333 1.7058 -1.2966 +v -0.8262 1.8123 -1.2728 +v -0.8140 1.9048 -1.2581 +v -0.4791 1.4443 -1.4435 +v -0.6864 1.8437 -1.3249 +v -0.7369 1.9305 -1.2871 +v -0.7540 1.9438 -1.2712 +v -0.8070 1.9825 -1.2289 +v -0.5240 1.5553 -1.4415 +v -0.7690 1.9564 -1.2583 +v -0.5846 1.6524 -1.4151 +v -0.7823 1.9669 -1.2482 +v -0.6393 1.7484 -1.3758 +v -0.7947 1.9753 -1.2388 +v -0.1593 0.0125 -0.0472 +v -0.2087 0.0279 -0.0058 +v -0.2543 0.0462 -0.0316 +v -0.1964 0.0298 -0.0775 +v -0.3019 0.0649 -0.0643 +v -0.2375 0.0474 -0.1139 +v -0.3496 0.0831 -0.1066 +v -0.2849 0.0676 -0.1590 +v -0.4015 0.1139 -0.1564 +v -0.3358 0.0965 -0.2073 +v -0.2574 0.0566 0.0377 +v -0.3112 0.0687 0.0156 +v -0.3656 0.0829 -0.0163 +v -0.4202 0.1035 -0.0563 +v -0.4731 0.1336 -0.0957 +v -0.3087 0.0867 0.0784 +v -0.3694 0.0978 0.0613 +v -0.4272 0.1068 0.0309 +v -0.4863 0.1281 0.0027 +v -0.5458 0.1466 -0.0397 +v -0.3600 0.1195 0.1205 +v -0.4265 0.1239 0.1022 +v -0.4920 0.1370 0.0847 +v -0.5592 0.1509 0.0559 +v -0.6158 0.1734 0.0296 +v -0.0856 0.0001 -0.0447 +v -0.1276 0.0051 -0.0159 +v -0.1116 0.0049 -0.0802 +v -0.3787 0.1343 -0.2701 +v -0.3041 0.1249 -0.3237 +v -0.2584 0.0871 -0.2668 +v -0.7500 0.2225 0.0693 +v -0.6773 0.1940 -0.0018 +v -0.6843 0.2053 0.1003 +v -0.2898 0.1092 0.1176 +v -0.3316 0.1446 0.1609 +v -0.4054 0.1508 0.1562 +v -0.1407 0.0163 -0.1221 +v -0.4591 0.1533 -0.2105 +v -0.6164 0.1855 0.1207 +v -0.2461 0.0723 0.0870 +v -0.1766 0.0291 -0.1618 +v -0.5289 0.1642 -0.1481 +v -0.5479 0.1713 0.1325 +v -0.2048 0.0425 0.0511 +v -0.2170 0.0522 -0.2112 +v -0.6002 0.1783 -0.0766 +v -0.4776 0.1590 0.1473 +v -0.1665 0.0198 0.0147 +v -0.4294 0.1798 -0.3362 +v -0.5026 0.1926 -0.2689 +v -0.5605 0.2289 -0.3309 +v -0.4795 0.2161 -0.4004 +v -0.6172 0.2695 -0.3864 +v -0.5363 0.2476 -0.4719 +v -0.6794 0.3129 -0.4452 +v -0.5972 0.2999 -0.5331 +v -0.7394 0.3805 -0.5278 +v -0.6484 0.3656 -0.6004 +v -0.5832 0.2007 -0.1966 +v -0.6396 0.2341 -0.2478 +v -0.6950 0.2739 -0.3026 +v -0.7574 0.3240 -0.3757 +v -0.8204 0.3853 -0.4650 +v -0.6555 0.2075 -0.1177 +v -0.7174 0.2443 -0.1666 +v -0.7753 0.2937 -0.2324 +v -0.8270 0.3452 -0.3143 +v -0.8846 0.4050 -0.4052 +v -0.7318 0.2185 -0.0425 +v -0.7868 0.2554 -0.1017 +v -0.8425 0.3087 -0.1670 +v -0.9014 0.3627 -0.2504 +v -0.9588 0.4321 -0.3371 +v -0.3564 0.1686 -0.3891 +v -0.6968 0.4423 -0.6862 +v -0.6102 0.4268 -0.7648 +v -0.5551 0.3526 -0.6843 +v -1.0837 0.5432 -0.3530 +v -1.0206 0.5174 -0.4357 +v -1.0356 0.4531 -0.2732 +v -0.8088 0.2515 0.0180 +v -0.4001 0.2072 -0.4604 +v -0.7812 0.4577 -0.6291 +v -0.9753 0.3852 -0.1884 +v -0.4548 0.2349 -0.5345 +v -0.8697 0.4722 -0.5631 +v -0.9137 0.3338 -0.1092 +v -0.5094 0.2869 -0.6119 +v -0.9517 0.4814 -0.4969 +v -0.8584 0.2887 -0.0365 +v -0.7581 0.5582 -0.7978 +v -0.8355 0.5603 -0.7361 +v -0.8809 0.6978 -0.8410 +v -0.8000 0.6929 -0.9209 +v -0.9324 0.8609 -0.9269 +v -0.8545 0.8523 -1.0065 +v -0.9626 1.0288 -1.0146 +v -0.8882 1.0236 -1.0857 +v -0.9829 1.1974 -1.0799 +v -0.9170 1.1937 -1.1409 +v -0.9155 0.5673 -0.6712 +v -0.9685 0.7037 -0.7708 +v -1.0128 0.8616 -0.8483 +v -1.0399 1.0336 -0.9408 +v -1.0514 1.1996 -1.0226 +v -0.9978 0.5890 -0.6010 +v -1.0501 0.7163 -0.6936 +v -1.0951 0.8725 -0.7715 +v -1.1160 1.0462 -0.8668 +v -1.1183 1.2054 -0.9557 +v -1.0734 0.6275 -0.5180 +v -1.1220 0.7450 -0.6147 +v -1.1701 0.8902 -0.6946 +v -1.1758 1.0524 -0.7963 +v -1.1810 1.2150 -0.8804 +v -0.6704 0.5395 -0.8619 +v -0.9410 1.3432 -1.1896 +v -0.8780 1.3401 -1.2399 +v -0.8567 1.1974 -1.1885 +v -1.2236 1.3620 -0.8583 +v -1.1746 1.3544 -0.9382 +v -1.2401 1.2267 -0.8027 +v -1.1435 0.6566 -0.4460 +v -0.7211 0.6865 -0.9833 +v -1.0039 1.3502 -1.1308 +v -1.2354 1.0714 -0.7209 +v -0.7806 0.8520 -1.0745 +v -1.0560 1.3516 -1.0723 +v -1.2250 0.9170 -0.6211 +v -0.8201 1.0328 -1.1392 +v -1.1081 1.3489 -1.0110 +v -1.1863 0.7794 -0.5367 +v -0.9505 1.4747 -1.2120 +v -0.9993 1.4830 -1.1640 +v -0.9790 1.6070 -1.1901 +v -0.9336 1.5983 -1.2353 +v -0.9579 1.7175 -1.2104 +v -0.9235 1.7142 -1.2493 +v -0.9226 1.8197 -1.2112 +v -0.8933 1.8188 -1.2434 +v -0.8841 1.9120 -1.2203 +v -0.8629 1.9142 -1.2438 +v -1.0452 1.4827 -1.1100 +v -1.0167 1.6085 -1.1396 +v -0.9911 1.7216 -1.1711 +v -0.9518 1.8208 -1.1793 +v -0.9053 1.9072 -1.1919 +v -1.0890 1.4831 -1.0536 +v -1.0564 1.6064 -1.0897 +v -1.0218 1.7172 -1.1312 +v -0.9762 1.8192 -1.1468 +v -0.9270 1.9020 -1.1636 +v -1.1332 1.4793 -0.9865 +v -1.0931 1.6000 -1.0347 +v -1.0525 1.7128 -1.0858 +v -1.0026 1.8095 -1.1157 +v -0.9466 1.8940 -1.1427 +v -0.8909 1.4696 -1.2619 +v -0.8437 1.9969 -1.2230 +v -0.8311 1.9964 -1.2345 +v -0.8445 1.9129 -1.2596 +v -0.9014 1.9488 -1.1753 +v -0.8901 1.9629 -1.1817 +v -0.9626 1.8821 -1.1283 +v -1.1813 1.4857 -0.9167 +v -0.8792 1.5933 -1.2793 +v -0.8559 1.9947 -1.2114 +v -1.0268 1.7976 -1.0887 +v -0.8853 1.7098 -1.2859 +v -0.8673 1.9875 -1.2007 +v -1.0839 1.7019 -1.0380 +v -0.8660 1.8167 -1.2692 +v -0.8786 1.9763 -1.1902 +v -1.1278 1.5948 -0.9733 +v 0.1460 0.0721 -0.2443 +v 0.0953 0.0447 -0.2168 +v 0.0949 0.0528 -0.2778 +v 0.1591 0.0845 -0.3107 +v 0.0866 0.0707 -0.3430 +v 0.1501 0.1037 -0.3779 +v 0.0603 0.0944 -0.4122 +v 0.1390 0.1218 -0.4475 +v 0.0434 0.1165 -0.4798 +v 0.1291 0.1404 -0.5219 +v 0.0419 0.0203 -0.1860 +v 0.0337 0.0263 -0.2419 +v 0.0196 0.0418 -0.3008 +v -0.0074 0.0698 -0.3633 +v -0.0414 0.0990 -0.4253 +v -0.0109 0.0045 -0.1492 +v -0.0291 0.0137 -0.1990 +v -0.0486 0.0289 -0.2532 +v -0.0748 0.0574 -0.3133 +v -0.1137 0.0891 -0.3761 +v -0.0607 0.0013 -0.1130 +v -0.0864 0.0097 -0.1586 +v -0.1148 0.0184 -0.2112 +v -0.1468 0.0468 -0.2667 +v -0.1827 0.0793 -0.3215 +v 0.1741 0.1009 -0.2039 +v 0.1305 0.0701 -0.1786 +v 0.1996 0.1115 -0.2755 +v 0.1109 0.1542 -0.6007 +v 0.1985 0.1869 -0.6496 +v 0.2161 0.1722 -0.5739 +v -0.2332 0.1195 -0.3807 +v -0.0421 0.0005 -0.0762 +v 0.2155 0.1298 -0.3454 +v 0.0209 0.1351 -0.5498 +v 0.0029 0.0035 -0.1069 +v 0.2169 0.1470 -0.4182 +v -0.0643 0.1218 -0.4950 +v 0.0445 0.0180 -0.1339 +v 0.2210 0.1597 -0.4951 +v -0.1518 0.1181 -0.4373 +v 0.0882 0.0425 -0.1579 +v 0.0875 0.1810 -0.6808 +v -0.0081 0.1659 -0.6236 +v -0.0363 0.2091 -0.6962 +v 0.0633 0.2248 -0.7635 +v -0.0727 0.2428 -0.7704 +v 0.0243 0.2644 -0.8394 +v -0.1189 0.2920 -0.8502 +v -0.0194 0.3169 -0.9168 +v -0.1723 0.3725 -0.9328 +v -0.0744 0.3904 -0.9910 +v -0.0963 0.1520 -0.5604 +v -0.1367 0.1997 -0.6316 +v -0.1686 0.2383 -0.7141 +v -0.2178 0.2858 -0.7977 +v -0.2712 0.3595 -0.8734 +v -0.1872 0.1550 -0.5012 +v -0.2249 0.1958 -0.5735 +v -0.2715 0.2265 -0.6527 +v -0.3106 0.2767 -0.7362 +v -0.3655 0.3453 -0.8158 +v -0.2737 0.1616 -0.4469 +v -0.3169 0.1961 -0.5138 +v -0.3661 0.2335 -0.5944 +v -0.4115 0.2811 -0.6710 +v -0.4588 0.3368 -0.7550 +v 0.1856 0.2129 -0.7279 +v -0.1367 0.4818 -1.0582 +v -0.0320 0.4897 -1.1137 +v 0.0269 0.4111 -1.0456 +v -0.5224 0.4231 -0.8380 +v 0.1579 0.2529 -0.8073 +v -0.2359 0.4610 -1.0108 +v 0.1246 0.2911 -0.8920 +v -0.3305 0.4459 -0.9558 +v 0.0811 0.3393 -0.9709 +v -0.4321 0.4285 -0.9028 +v -0.2011 0.5799 -1.1461 +v -0.2978 0.5727 -1.1006 +v -0.3741 0.6932 -1.1879 +v -0.2740 0.7056 -1.2313 +v -0.4353 0.8478 -1.2502 +v -0.3363 0.8547 -1.2909 +v -0.4891 1.0079 -1.3208 +v -0.3987 1.0213 -1.3501 +v -0.5476 1.1625 -1.3776 +v -0.4570 1.1744 -1.4089 +v -0.3927 0.5626 -1.0481 +v -0.4703 0.6948 -1.1442 +v -0.5290 0.8417 -1.2251 +v -0.5803 0.9935 -1.2862 +v -0.6330 1.1578 -1.3420 +v -0.4840 0.5457 -0.9909 +v -0.5565 0.6865 -1.0959 +v -0.6165 0.8377 -1.1844 +v -0.6667 1.0034 -1.2452 +v -0.7126 1.1707 -1.2929 +v -0.5789 0.5431 -0.9353 +v -0.6421 0.6863 -1.0392 +v -0.6982 0.8471 -1.1311 +v -0.7479 1.0164 -1.1927 +v -0.7883 1.1849 -1.2365 +v -0.1009 0.5977 -1.1841 +v -0.5101 1.3168 -1.4329 +v -0.4256 1.3204 -1.4515 +v -0.3636 1.1809 -1.4407 +v -0.8118 1.3328 -1.2811 +v -0.1696 0.7119 -1.2720 +v -0.5868 1.3072 -1.4037 +v -0.2343 0.8566 -1.3233 +v -0.6616 1.3119 -1.3677 +v -0.3038 1.0175 -1.3846 +v -0.7384 1.3199 -1.3239 +v -0.5620 1.4385 -1.4444 +v -0.6336 1.4392 -1.4201 +v -0.6576 1.5623 -1.4121 +v -0.5965 1.5569 -1.4396 +v -0.6948 1.6797 -1.3907 +v -0.6428 1.6679 -1.4131 +v -0.7195 1.7873 -1.3576 +v -0.6815 1.7718 -1.3764 +v -0.7421 1.8779 -1.3205 +v -0.7161 1.8653 -1.3322 +v -0.6996 1.4464 -1.3828 +v -0.7159 1.5740 -1.3871 +v -0.7448 1.6885 -1.3647 +v -0.7605 1.7945 -1.3340 +v -0.7714 1.8926 -1.3046 +v -0.7637 1.4522 -1.3427 +v -0.7729 1.5798 -1.3566 +v -0.7944 1.6985 -1.3406 +v -0.8014 1.8084 -1.3122 +v -0.7996 1.9033 -1.2891 +v -0.8282 1.4630 -1.3012 +v -0.8265 1.5883 -1.3185 +v -0.8430 1.7045 -1.3150 +v -0.8368 1.8116 -1.2898 +v -0.8249 1.9100 -1.2748 +v -0.4834 1.4424 -1.4637 +v -0.7667 1.9486 -1.2867 +v -0.7526 1.9298 -1.3009 +v -0.6963 1.8490 -1.3433 +v -0.8187 1.9918 -1.2448 +v -0.5310 1.5572 -1.4615 +v -0.7793 1.9630 -1.2754 +v -0.5918 1.6574 -1.4343 +v -0.7924 1.9750 -1.2656 +v -0.6472 1.7550 -1.3947 +v -0.8058 1.9842 -1.2552 +# 650 vertices + +vn 0.2154 0.9746 0.0617 +vn 0.2728 0.9589 -0.0778 +vn 0.1306 0.9907 0.0373 +vn 0.1571 0.9816 0.1081 +vn 0.1701 0.9829 0.0701 +vn 0.1786 0.9808 0.0782 +vn 0.1683 0.9789 0.1160 +vn 0.1561 0.9784 0.1353 +vn 0.1641 0.9633 0.2125 +vn 0.1250 0.9641 0.2343 +vn 0.2968 0.9483 -0.1126 +vn 0.3603 0.9152 -0.1807 +vn 0.2212 0.9752 -0.0075 +vn 0.1949 0.9750 0.1067 +vn 0.1481 0.9680 0.2027 +vn 0.3156 0.9246 -0.2133 +vn 0.3837 0.8720 -0.3040 +vn 0.2738 0.9579 -0.0867 +vn 0.2273 0.9735 0.0255 +vn 0.1820 0.9755 0.1238 +vn 0.3508 0.8795 -0.3214 +vn 0.3996 0.7767 -0.4868 +vn 0.3386 0.9129 -0.2281 +vn 0.2754 0.9600 -0.0497 +vn 0.2643 0.9644 0.0048 +vn 0.1178 0.9908 -0.0666 +vn 0.0004 0.9977 -0.0684 +vn 0.0395 0.9992 -0.0080 +vn 0.0422 0.9549 0.2940 +vn 0.0453 0.9516 0.3039 +vn 0.0918 0.9479 0.3050 +vn 0.2187 0.9726 0.0789 +vn 0.2747 0.9606 0.0415 +vn 0.3032 0.9488 -0.0883 +vn 0.4134 0.7214 -0.5556 +vn 0.4138 0.6973 -0.5853 +vn 0.4344 0.6687 -0.6035 +vn 0.0967 0.9944 0.0429 +vn 0.1278 0.9526 0.2761 +vn 0.3492 0.9190 -0.1832 +vn 0.4306 0.8110 -0.3961 +vn 0.1348 0.9876 0.0798 +vn 0.1406 0.9652 0.2203 +vn 0.3789 0.8687 -0.3191 +vn 0.3463 0.9181 -0.1930 +vn 0.0885 0.9721 0.2171 +vn 0.1389 0.9668 0.2146 +vn 0.3945 0.8368 -0.3796 +vn 0.2664 0.9492 -0.1675 +vn 0.1000 0.9616 0.2556 +vn 0.0996 0.9581 0.2687 +vn 0.0929 0.9576 0.2727 +vn 0.0936 0.9739 0.2068 +vn 0.1442 0.9577 0.2492 +vn 0.1316 0.9647 0.2280 +vn 0.1431 0.9390 0.3127 +vn 0.1342 0.9175 0.3744 +vn 0.0909 0.8964 0.4339 +vn 0.1149 0.8801 0.4607 +vn 0.1095 0.9586 0.2630 +vn 0.1066 0.9640 0.2435 +vn 0.1337 0.9497 0.2831 +vn 0.1536 0.9430 0.2952 +vn 0.1246 0.9114 0.3921 +vn 0.1325 0.9544 0.2676 +vn 0.1215 0.9689 0.2157 +vn 0.1511 0.9401 0.3056 +vn 0.1783 0.9315 0.3171 +vn 0.2281 0.9060 0.3565 +vn 0.1968 0.9442 0.2640 +vn 0.2045 0.9647 0.1661 +vn 0.1858 0.9332 0.3077 +vn 0.1806 0.9223 0.3417 +vn 0.2149 0.8823 0.4188 +vn 0.0481 0.9578 0.2832 +vn 0.0848 0.8912 0.4456 +vn 0.0975 0.8566 0.5067 +vn 0.1133 0.8574 0.5019 +vn 0.3146 0.8079 0.4983 +vn 0.3084 0.7996 0.5152 +vn 0.1755 0.8626 0.4745 +vn 0.2823 0.9477 0.1487 +vn 0.0570 0.9805 0.1880 +vn 0.0830 0.8687 0.4883 +vn 0.2197 0.9201 0.3244 +vn 0.0448 0.9732 0.2255 +vn 0.0881 0.8638 0.4960 +vn 0.2370 0.9279 0.2879 +vn 0.0405 0.9234 0.3817 +vn 0.2123 0.8455 0.4900 +vn 0.2714 0.9326 0.2379 +vn 0.0942 0.7173 0.6903 +vn 0.0462 0.8050 0.5914 +vn 0.0965 0.8023 0.5890 +vn 0.0987 0.7232 0.6835 +vn 0.1371 0.6307 0.7638 +vn 0.1136 0.6325 0.7662 +vn 0.1247 0.5469 0.8279 +vn 0.0592 0.5300 0.8460 +vn 0.1028 0.4752 0.8739 +vn 0.0598 0.4959 0.8663 +vn 0.1140 0.6988 0.7062 +vn 0.1196 0.8072 0.5780 +vn 0.1469 0.6197 0.7710 +vn 0.1639 0.5536 0.8165 +vn 0.1365 0.4601 0.8773 +vn 0.2404 0.6908 0.6819 +vn 0.2484 0.7711 0.5862 +vn 0.2058 0.6006 0.7726 +vn 0.2212 0.5367 0.8142 +vn 0.2152 0.4507 0.8663 +vn 0.3531 0.6786 0.6440 +vn 0.3240 0.7309 0.6007 +vn 0.3167 0.5930 0.7403 +vn 0.2719 0.5166 0.8119 +vn 0.2973 0.4232 0.8559 +vn 0.0551 0.7975 0.6008 +vn 0.0356 0.5068 0.8613 +vn 0.0219 0.4301 0.9025 +vn 0.0989 0.4207 0.9018 +vn 0.3218 0.2609 0.9102 +vn 0.3953 0.2562 0.8821 +vn 0.3202 0.4107 0.8537 +vn 0.3210 0.7198 0.6155 +vn 0.0226 0.7276 0.6856 +vn 0.1919 0.3993 0.8965 +vn 0.3161 0.5040 0.8038 +vn 0.0327 0.6208 0.7833 +vn 0.2044 0.3624 0.9093 +vn 0.3827 0.5877 0.7128 +vn 0.0208 0.5217 0.8529 +vn 0.2256 0.3139 0.9223 +vn 0.3689 0.6653 0.6491 +vn 0.2501 0.1814 0.9511 +vn 0.2148 0.2557 0.9426 +vn 0.1341 0.2894 0.9478 +vn 0.1428 0.2105 0.9671 +vn 0.2608 0.0461 0.9643 +vn 0.1968 0.0739 0.9776 +vn 0.2694 -0.0762 0.9600 +vn 0.1909 -0.0534 0.9802 +vn 0.3022 -0.1139 0.9464 +vn 0.1792 -0.1041 0.9783 +vn 0.2961 0.1595 0.9417 +vn 0.2659 0.2338 0.9352 +vn 0.2966 0.0283 0.9546 +vn 0.3016 -0.1029 0.9479 +vn 0.3556 -0.1224 0.9266 +vn 0.3421 0.1352 0.9299 +vn 0.3221 0.1950 0.9264 +vn 0.3326 0.0309 0.9425 +vn 0.3103 -0.1189 0.9432 +vn 0.3548 -0.1316 0.9256 +vn 0.3837 0.1212 0.9155 +vn 0.3447 0.1403 0.9282 +vn 0.3691 0.0325 0.9288 +vn 0.3399 -0.1254 0.9321 +vn 0.2771 -0.0577 0.9591 +vn 0.0334 0.3055 0.9516 +vn 0.0418 -0.1067 0.9934 +vn 0.0384 -0.1776 0.9833 +vn 0.1463 -0.1691 0.9747 +vn 0.2115 -0.0301 0.9769 +vn -0.3943 0.1496 -0.9067 +vn 0.2817 -0.1255 0.9513 +vn 0.3686 0.1113 0.9229 +vn 0.0466 0.2404 0.9696 +vn 0.2419 -0.1602 0.9570 +vn 0.3599 -0.0822 0.9294 +vn 0.0687 0.0876 0.9938 +vn 0.2893 -0.1462 0.9460 +vn 0.3618 0.0956 0.9273 +vn 0.0620 -0.0417 0.9972 +vn 0.2511 -0.0992 0.9629 +vn 0.3853 0.1050 0.9168 +vn -0.4153 0.8917 -0.1802 +vn -0.4253 0.8318 -0.3567 +vn -0.4605 0.7633 -0.4532 +vn -0.5134 0.8158 -0.2664 +vn -0.4131 0.9107 -0.0024 +vn -0.4950 0.8607 -0.1191 +vn -0.3382 0.9380 0.0765 +vn -0.4066 0.9102 -0.0793 +vn -0.2644 0.9635 0.0422 +vn -0.3339 0.9398 -0.0723 +vn -0.3001 0.9492 -0.0952 +vn -0.3343 0.9109 -0.2418 +vn -0.2888 0.9537 0.0834 +vn -0.2486 0.9501 0.1884 +vn -0.1869 0.9697 0.1575 +vn -0.1728 0.9848 -0.0153 +vn -0.1947 0.9717 -0.1334 +vn -0.1756 0.9762 0.1269 +vn -0.1644 0.9576 0.2367 +vn -0.1257 0.9648 0.2309 +vn -0.0204 0.9997 -0.0124 +vn -0.0426 0.9957 -0.0817 +vn -0.0353 0.9940 0.1036 +vn -0.0620 0.9635 0.2603 +vn -0.0541 0.9548 0.2924 +vn -0.4634 0.7180 -0.5194 +vn -0.4760 0.6487 -0.5938 +vn -0.5300 0.7174 -0.4522 +vn -0.3546 0.9263 -0.1276 +vn -0.3523 0.9354 -0.0288 +vn -0.3011 0.9536 -0.0059 +vn -0.0091 0.9554 0.2951 +vn -0.0644 0.9889 -0.1340 +vn -0.5522 0.7879 -0.2727 +vn -0.2155 0.9731 0.0818 +vn -0.1845 0.9621 -0.2009 +vn -0.4773 0.8525 -0.2132 +vn -0.1306 0.9787 0.1583 +vn -0.3407 0.8888 -0.3064 +vn -0.3958 0.9025 -0.1701 +vn -0.0662 0.9688 0.2388 +vn -0.4421 0.7983 -0.4090 +vn -0.1477 0.9507 0.2726 +vn -0.1754 0.9556 0.2367 +vn -0.2719 0.9486 0.1617 +vn -0.2676 0.9356 0.2302 +vn -0.1534 0.9568 0.2471 +vn -0.2616 0.9284 0.2640 +vn -0.1843 0.9062 0.3805 +vn -0.2470 0.8843 0.3963 +vn -0.1896 0.8468 0.4970 +vn -0.2356 0.8186 0.5239 +vn -0.1230 0.9518 0.2808 +vn -0.0994 0.9599 0.2620 +vn -0.1313 0.9621 0.2390 +vn -0.1393 0.9217 0.3621 +vn -0.1668 0.8614 0.4798 +vn -0.0648 0.9691 0.2380 +vn -0.0353 0.9629 0.2677 +vn -0.0843 0.9655 0.2463 +vn -0.0858 0.9327 0.3504 +vn -0.1277 0.8830 0.4516 +vn 0.0021 0.9775 0.2110 +vn 0.0134 0.9630 0.2692 +vn -0.0293 0.9654 0.2593 +vn -0.0176 0.9389 0.3438 +vn -0.0193 0.9060 0.4229 +vn -0.3520 0.9268 0.1306 +vn -0.2208 0.8312 0.5102 +vn -0.2004 0.8065 0.5562 +vn -0.2253 0.7985 0.5582 +vn -0.0251 0.8471 0.5309 +vn -0.3342 0.9223 0.1941 +vn -0.2322 0.7943 0.5613 +vn -0.3036 0.9223 0.2392 +vn -0.2033 0.8093 0.5511 +vn -0.2625 0.8902 0.3724 +vn -0.1358 0.8307 0.5398 +vn -0.2257 0.6941 0.6836 +vn -0.2055 0.7859 0.5832 +vn -0.2606 0.7677 0.5855 +vn -0.2582 0.6742 0.6919 +vn -0.2950 0.5786 0.7604 +vn -0.2686 0.5766 0.7716 +vn -0.2975 0.5621 0.7717 +vn -0.2716 0.5676 0.7772 +vn -0.2654 0.4842 0.8337 +vn -0.2978 0.4734 0.8290 +vn -0.1716 0.7277 0.6641 +vn -0.1752 0.7836 0.5961 +vn -0.2518 0.6036 0.7565 +vn -0.2137 0.5651 0.7969 +vn -0.1445 0.4912 0.8590 +vn -0.1130 0.7387 0.6645 +vn -0.1435 0.7752 0.6152 +vn -0.1105 0.6330 0.7662 +vn -0.0546 0.5566 0.8290 +vn 0.0023 0.4952 0.8688 +vn -0.0417 0.7329 0.6790 +vn -0.0666 0.7795 0.6229 +vn -0.0188 0.6228 0.7821 +vn 0.0330 0.5381 0.8422 +vn 0.0644 0.5053 0.8605 +vn -0.3049 0.7300 0.6117 +vn -0.3081 0.4616 0.8319 +vn -0.3890 0.3101 0.8675 +vn -0.3327 0.3608 0.8712 +vn -0.0138 0.4127 0.9107 +vn -0.2583 0.6958 0.6701 +vn -0.2222 0.4014 0.8885 +vn -0.2805 0.5660 0.7752 +vn -0.1242 0.3937 0.9108 +vn -0.2366 0.5847 0.7760 +vn -0.0593 0.3936 0.9174 +vn -0.2004 0.1497 0.9682 +vn -0.1891 0.3062 0.9330 +vn -0.3216 0.2707 0.9074 +vn -0.2488 0.1614 0.9550 +vn -0.1862 0.0437 0.9815 +vn -0.2212 0.0409 0.9744 +vn -0.1871 -0.0737 0.9796 +vn -0.2341 -0.1043 0.9666 +vn -0.2765 -0.1888 0.9423 +vn -0.2610 -0.1537 0.9530 +vn -0.1604 0.1636 0.9734 +vn -0.0800 0.3321 0.9399 +vn -0.1737 0.0344 0.9842 +vn -0.1470 -0.0492 0.9879 +vn -0.2190 -0.1487 0.9643 +vn -0.0644 0.2222 0.9729 +vn -0.0271 0.3399 0.9401 +vn -0.1402 0.0379 0.9894 +vn -0.1116 -0.0442 0.9928 +vn -0.1925 -0.1386 0.9715 +vn 0.0135 0.2561 0.9666 +vn -0.0246 0.3132 0.9494 +vn -0.0597 0.0701 0.9958 +vn -0.0364 -0.0333 0.9988 +vn -0.1042 -0.1221 0.9870 +vn -0.3631 0.2816 0.8882 +vn -0.2261 -0.1486 0.9627 +vn 0.2058 0.3072 0.9291 +vn 0.0970 0.1703 0.9806 +vn -0.0306 -0.1675 0.9854 +vn -0.2780 0.2036 0.9388 +vn -0.0901 -0.0527 0.9945 +vn -0.2240 0.0986 0.9696 +vn -0.1111 -0.1107 0.9876 +vn -0.1982 -0.0183 0.9800 +vn -0.0767 -0.1377 0.9875 +vn -0.1303 -0.9906 -0.0419 +vn -0.2748 -0.9590 0.0695 +vn -0.2128 -0.9755 -0.0561 +vn -0.1567 -0.9826 -0.0993 +vn -0.1747 -0.9824 -0.0658 +vn -0.1733 -0.9818 -0.0779 +vn -0.1685 -0.9777 -0.1254 +vn -0.1521 -0.9782 -0.1416 +vn -0.1634 -0.9640 -0.2096 +vn -0.1225 -0.9640 -0.2358 +vn -0.3589 -0.9109 0.2037 +vn -0.2919 -0.9491 0.1187 +vn -0.2222 -0.9750 0.0009 +vn -0.1931 -0.9753 -0.1075 +vn -0.1464 -0.9701 -0.1936 +vn -0.3720 -0.8760 0.3069 +vn -0.3125 -0.9237 0.2217 +vn -0.2709 -0.9582 0.0925 +vn -0.2238 -0.9745 -0.0186 +vn -0.1777 -0.9771 -0.1172 +vn -0.3794 -0.7841 0.4912 +vn -0.3464 -0.8805 0.3236 +vn -0.3295 -0.9172 0.2239 +vn -0.2724 -0.9607 0.0527 +vn -0.2592 -0.9658 -0.0032 +vn -0.0062 -0.9983 0.0582 +vn -0.1216 -0.9912 0.0527 +vn -0.0456 -0.9989 0.0101 +vn -0.0960 -0.9504 -0.2957 +vn -0.0501 -0.9540 -0.2954 +vn -0.0501 -0.9569 -0.2862 +vn -0.2646 -0.9635 -0.0401 +vn -0.2161 -0.9739 -0.0701 +vn -0.2952 -0.9513 0.0893 +vn -0.4239 -0.6387 0.6422 +vn -0.3702 -0.7520 0.5454 +vn -0.3870 -0.7735 0.5019 +vn -0.0970 -0.9944 -0.0418 +vn -0.1226 -0.9524 -0.2790 +vn -0.3436 -0.9226 0.1754 +vn -0.4153 -0.8223 0.3891 +vn -0.1328 -0.9877 -0.0830 +vn -0.1332 -0.9671 -0.2166 +vn -0.3686 -0.8758 0.3115 +vn -0.3627 -0.9068 0.2147 +vn -0.0862 -0.9718 -0.2194 +vn -0.1400 -0.9707 -0.1952 +vn -0.3890 -0.8381 0.3824 +vn -0.2831 -0.9451 0.1631 +vn -0.0978 -0.9593 -0.2650 +vn -0.1051 -0.9602 -0.2586 +vn -0.0973 -0.9646 -0.2453 +vn -0.0956 -0.9742 -0.2046 +vn -0.1365 -0.9581 -0.2519 +vn -0.1312 -0.9637 -0.2325 +vn -0.1307 -0.9376 -0.3222 +vn -0.1303 -0.9134 -0.3858 +vn -0.0785 -0.8967 -0.4356 +vn -0.1080 -0.8803 -0.4620 +vn -0.0974 -0.9648 -0.2444 +vn -0.1073 -0.9632 -0.2463 +vn -0.1344 -0.9513 -0.2774 +vn -0.1576 -0.9414 -0.2983 +vn -0.1208 -0.9091 -0.3988 +vn -0.1169 -0.9695 -0.2156 +vn -0.1291 -0.9535 -0.2725 +vn -0.1655 -0.9390 -0.3014 +vn -0.1901 -0.9277 -0.3213 +vn -0.2402 -0.9023 -0.3579 +vn -0.2093 -0.9644 -0.1616 +vn -0.2086 -0.9411 -0.2659 +vn -0.1924 -0.9303 -0.3123 +vn -0.1801 -0.9214 -0.3442 +vn -0.2217 -0.8798 -0.4204 +vn -0.0485 -0.9600 -0.2758 +vn -0.1010 -0.8607 -0.4989 +vn -0.0972 -0.8545 -0.5102 +vn -0.0889 -0.8901 -0.4469 +vn -0.3110 -0.8024 -0.5094 +vn -0.3157 -0.8060 -0.5008 +vn -0.1806 -0.8611 -0.4753 +vn -0.2711 -0.9457 -0.1791 +vn -0.0511 -0.9813 -0.1856 +vn -0.0786 -0.8703 -0.4863 +vn -0.2054 -0.9204 -0.3327 +vn -0.0389 -0.9720 -0.2315 +vn -0.0851 -0.8607 -0.5019 +vn -0.2445 -0.9281 -0.2808 +vn -0.0419 -0.9185 -0.3931 +vn -0.2204 -0.8429 -0.4908 +vn -0.2972 -0.9258 -0.2335 +vn -0.0774 -0.8015 -0.5930 +vn -0.0503 -0.8043 -0.5921 +vn -0.0949 -0.7088 -0.6990 +vn -0.1009 -0.7226 -0.6839 +vn -0.1477 -0.6281 -0.7639 +vn -0.1311 -0.6324 -0.7635 +vn -0.1386 -0.5529 -0.8216 +vn -0.0762 -0.5350 -0.8414 +vn -0.1141 -0.4829 -0.8682 +vn -0.0758 -0.4968 -0.8645 +vn -0.1184 -0.8051 -0.5811 +vn -0.1074 -0.6936 -0.7123 +vn -0.1333 -0.6156 -0.7767 +vn -0.1559 -0.5622 -0.8122 +vn -0.1336 -0.4656 -0.8749 +vn -0.2429 -0.7726 -0.5866 +vn -0.2223 -0.6903 -0.6886 +vn -0.1877 -0.5986 -0.7787 +vn -0.2105 -0.5414 -0.8140 +vn -0.2145 -0.4513 -0.8662 +vn -0.3207 -0.7373 -0.5946 +vn -0.3395 -0.6819 -0.6478 +vn -0.3075 -0.5862 -0.7495 +vn -0.2776 -0.5139 -0.8117 +vn -0.2972 -0.4224 -0.8563 +vn -0.0528 -0.7974 -0.6011 +vn -0.1027 -0.4218 -0.9008 +vn -0.0177 -0.4275 -0.9038 +vn -0.0356 -0.5049 -0.8625 +vn -0.3819 -0.2620 -0.8863 +vn -0.3155 -0.2634 -0.9116 +vn -0.3139 -0.4106 -0.8561 +vn -0.3012 -0.7321 -0.6110 +vn -0.0207 -0.7295 -0.6837 +vn -0.1845 -0.3992 -0.8981 +vn -0.3271 -0.4992 -0.8024 +vn -0.0368 -0.6230 -0.7813 +vn -0.2216 -0.3632 -0.9050 +vn -0.3765 -0.5771 -0.7247 +vn -0.0332 -0.5284 -0.8484 +vn -0.2363 -0.3147 -0.9193 +vn -0.3552 -0.6706 -0.6513 +vn -0.1318 -0.2877 -0.9486 +vn -0.2155 -0.2538 -0.9429 +vn -0.2410 -0.1828 -0.9532 +vn -0.1282 -0.2105 -0.9692 +vn -0.2347 -0.0577 -0.9704 +vn -0.1846 -0.0805 -0.9795 +vn -0.2270 0.0737 -0.9711 +vn -0.1852 0.0508 -0.9814 +vn -0.2946 0.1037 -0.9500 +vn -0.1693 0.0947 -0.9810 +vn -0.2708 -0.2285 -0.9351 +vn -0.2969 -0.1654 -0.9405 +vn -0.2900 -0.0396 -0.9562 +vn -0.2758 0.1067 -0.9553 +vn -0.3402 0.1303 -0.9313 +vn -0.3296 -0.1982 -0.9231 +vn -0.3314 -0.1412 -0.9329 +vn -0.3388 -0.0388 -0.9401 +vn -0.3247 0.1235 -0.9377 +vn -0.3164 0.1351 -0.9389 +vn -0.3503 -0.1429 -0.9257 +vn -0.4027 -0.1141 -0.9082 +vn -0.3844 -0.0287 -0.9227 +vn -0.3292 0.1129 -0.9375 +vn -0.2809 0.1025 -0.9543 +vn -0.0246 -0.2980 -0.9542 +vn -0.1625 0.1443 -0.9761 +vn -0.0778 0.1469 -0.9861 +vn -0.0600 0.0898 -0.9942 +vn 0.6153 -0.4551 0.6437 +vn -0.3109 0.1123 -0.9438 +vn -0.2993 0.1317 -0.9450 +vn -0.3593 -0.1135 -0.9263 +vn -0.0503 -0.2425 -0.9688 +vn -0.2401 0.1440 -0.9600 +vn -0.3250 0.0597 -0.9438 +vn -0.0745 -0.0981 -0.9924 +vn -0.3181 0.1418 -0.9374 +vn -0.4014 -0.0777 -0.9126 +vn -0.0644 0.0411 -0.9971 +vn -0.3657 0.1423 -0.9198 +vn -0.4199 -0.0906 -0.9030 +vn 0.4685 -0.7594 0.4515 +vn 0.4221 -0.8298 0.3651 +vn 0.4226 -0.8896 0.1732 +vn 0.5208 -0.8132 0.2596 +vn 0.4173 -0.9088 -0.0007 +vn 0.4966 -0.8611 0.1094 +vn 0.3396 -0.9387 -0.0598 +vn 0.4056 -0.9097 0.0891 +vn 0.2714 -0.9618 -0.0358 +vn 0.3313 -0.9401 0.0801 +vn 0.3402 -0.9074 0.2466 +vn 0.3072 -0.9469 0.0950 +vn 0.2947 -0.9520 -0.0823 +vn 0.2504 -0.9521 -0.1752 +vn 0.1864 -0.9708 -0.1511 +vn 0.2002 -0.9721 0.1223 +vn 0.1829 -0.9830 0.0133 +vn 0.1882 -0.9731 -0.1331 +vn 0.1644 -0.9609 -0.2229 +vn 0.1248 -0.9666 -0.2239 +vn 0.0403 -0.9960 0.0802 +vn 0.0184 -0.9998 0.0114 +vn 0.0422 -0.9930 -0.1105 +vn 0.0695 -0.9635 -0.2586 +vn 0.0482 -0.9580 -0.2828 +vn 0.4819 -0.6605 0.5759 +vn 0.4527 -0.7225 0.5224 +vn 0.5390 -0.7055 0.4601 +vn 0.2941 -0.9558 -0.0009 +vn 0.3601 -0.9328 0.0162 +vn 0.3524 -0.9272 0.1266 +vn 0.0062 -0.9554 -0.2951 +vn 0.0547 -0.9893 0.1352 +vn 0.5625 -0.7833 0.2647 +vn 0.2210 -0.9711 -0.0903 +vn 0.1948 -0.9624 0.1895 +vn 0.4770 -0.8522 0.2150 +vn 0.1339 -0.9778 -0.1611 +vn 0.3567 -0.8883 0.2892 +vn 0.3860 -0.9056 0.1758 +vn 0.0643 -0.9680 -0.2424 +vn 0.4364 -0.7957 0.4201 +vn 0.2741 -0.9480 -0.1619 +vn 0.1782 -0.9548 -0.2379 +vn 0.1505 -0.9549 -0.2559 +vn 0.2713 -0.9356 -0.2258 +vn 0.1561 -0.9555 -0.2503 +vn 0.2622 -0.9267 -0.2693 +vn 0.1823 -0.9020 -0.3913 +vn 0.2444 -0.8830 -0.4007 +vn 0.1871 -0.8460 -0.4993 +vn 0.2308 -0.8225 -0.5198 +vn 0.1046 -0.9583 -0.2659 +vn 0.1218 -0.9549 -0.2709 +vn 0.1338 -0.9590 -0.2497 +vn 0.1402 -0.9160 -0.3758 +vn 0.1755 -0.8575 -0.4837 +vn 0.0341 -0.9604 -0.2766 +vn 0.0567 -0.9710 -0.2321 +vn 0.0752 -0.9681 -0.2390 +vn 0.0937 -0.9297 -0.3562 +vn 0.1342 -0.8808 -0.4541 +vn -0.0070 -0.9612 -0.2759 +vn 0.0082 -0.9768 -0.2138 +vn 0.0287 -0.9669 -0.2537 +vn 0.0120 -0.9385 -0.3450 +vn 0.0128 -0.9042 -0.4270 +vn 0.3540 -0.9260 -0.1313 +vn 0.2225 -0.8021 -0.5542 +vn 0.1948 -0.8158 -0.5445 +vn 0.2245 -0.8311 -0.5088 +vn 0.0171 -0.8430 -0.5376 +vn 0.3324 -0.9235 -0.1915 +vn 0.2212 -0.8003 -0.5573 +vn 0.2903 -0.9255 -0.2433 +vn 0.2013 -0.8099 -0.5510 +vn 0.2586 -0.8873 -0.3819 +vn 0.1421 -0.8268 -0.5443 +vn 0.2488 -0.7748 -0.5812 +vn 0.1924 -0.7917 -0.5798 +vn 0.2160 -0.7019 -0.6787 +vn 0.2581 -0.6732 -0.6930 +vn 0.2958 -0.5783 -0.7603 +vn 0.2729 -0.5707 -0.7745 +vn 0.3080 -0.5531 -0.7741 +vn 0.2902 -0.5562 -0.7787 +vn 0.2682 -0.4781 -0.8364 +vn 0.2985 -0.4776 -0.8263 +vn 0.1726 -0.7856 -0.5941 +vn 0.1649 -0.7353 -0.6574 +vn 0.2549 -0.6035 -0.7555 +vn 0.2108 -0.5611 -0.8004 +vn 0.1349 -0.4851 -0.8640 +vn 0.1413 -0.7762 -0.6144 +vn 0.1007 -0.7444 -0.6601 +vn 0.0951 -0.6386 -0.7636 +vn 0.0647 -0.5453 -0.8357 +vn -0.0044 -0.4899 -0.8717 +vn 0.0515 -0.7810 -0.6224 +vn 0.0391 -0.7338 -0.6782 +vn 0.0016 -0.6324 -0.7747 +vn -0.0360 -0.5390 -0.8416 +vn -0.0401 -0.4968 -0.8669 +vn 0.3054 -0.7320 -0.6090 +vn 0.3277 -0.3620 -0.8727 +vn 0.3879 -0.3115 -0.8675 +vn 0.3119 -0.4667 -0.8276 +vn 0.0377 -0.4106 -0.9110 +vn 0.2570 -0.6968 -0.6696 +vn 0.2132 -0.4030 -0.8900 +vn 0.2876 -0.5568 -0.7793 +vn 0.1208 -0.3916 -0.9122 +vn 0.2436 -0.5774 -0.7793 +vn 0.0598 -0.3941 -0.9171 +vn 0.3186 -0.2689 -0.9090 +vn 0.1870 -0.3057 -0.9336 +vn 0.1970 -0.1554 -0.9680 +vn 0.2422 -0.1632 -0.9564 +vn 0.1755 -0.0502 -0.9832 +vn 0.2252 -0.0324 -0.9738 +vn 0.1691 0.0582 -0.9839 +vn 0.2163 0.0819 -0.9729 +vn 0.2658 0.1832 -0.9465 +vn 0.3162 0.2158 -0.9238 +vn 0.0732 -0.3412 -0.9371 +vn 0.1586 -0.1633 -0.9737 +vn 0.1602 -0.0370 -0.9864 +vn 0.1384 0.0347 -0.9898 +vn 0.1957 0.1295 -0.9721 +vn 0.0315 -0.3425 -0.9390 +vn 0.0568 -0.2258 -0.9725 +vn 0.1443 -0.0359 -0.9889 +vn 0.1117 0.0354 -0.9931 +vn 0.1603 0.1212 -0.9796 +vn 0.0300 -0.3155 -0.9485 +vn -0.0181 -0.2605 -0.9653 +vn 0.0597 -0.0725 -0.9956 +vn 0.0360 0.0320 -0.9988 +vn 0.0565 0.1019 -0.9932 +vn 0.3587 -0.2877 -0.8880 +vn -0.1379 -0.1952 -0.9710 +vn -0.5545 -0.6165 -0.5590 +vn 0.3442 0.2565 -0.9032 +vn 0.0295 0.1567 -0.9872 +vn 0.2784 -0.2030 -0.9388 +vn 0.1640 0.1266 -0.9783 +vn 0.2181 -0.0980 -0.9710 +vn 0.1088 0.1236 -0.9863 +vn 0.1806 0.0001 -0.9836 +vn 0.0788 0.1406 -0.9869 +vn 0.0060 0.0920 0.9957 +vn -0.0016 0.0560 0.9984 +vn -0.0071 0.0674 0.9977 +vn 0.0038 0.1031 0.9947 +vn -0.8536 0.3453 0.3902 +vn -0.7490 0.3663 0.5521 +vn -0.7459 0.3461 0.5691 +vn -0.8533 0.3284 0.4051 +vn -0.5030 0.6581 0.5603 +vn -0.4671 0.7156 0.5193 +vn -0.4700 0.7042 0.5322 +vn -0.5042 0.6451 0.5741 +vn 0.3455 0.4960 0.7966 +vn 0.2732 0.5008 0.8213 +vn 0.2808 0.5083 0.8141 +vn 0.3462 0.5005 0.7935 +vn -0.6331 0.4736 0.6122 +vn -0.6303 0.4512 0.6317 +vn 0.1771 0.4427 0.8790 +vn 0.1837 0.4690 0.8639 +vn -0.5918 0.5385 0.5999 +vn -0.5959 0.5282 0.6049 +vn 0.1352 0.2361 0.9623 +vn 0.1397 0.2723 0.9520 +vn -0.5689 0.5807 0.5823 +vn -0.5680 0.5690 0.5947 +vn 0.0765 0.1276 0.9889 +vn 0.0816 0.1457 0.9860 +vn -0.9680 0.2070 0.1419 +vn -0.9659 0.2260 0.1265 +vn -0.9647 0.2305 0.1277 +vn -0.9684 0.2058 0.1411 +vn -0.9284 0.2644 0.2610 +vn -0.9281 0.2604 0.2661 +vn -0.9824 0.1475 0.1147 +vn -0.9825 0.1461 0.1155 +vn -0.9606 0.2348 0.1487 +vn -0.9646 0.2192 0.1465 +vn -0.9068 0.3761 0.1904 +vn -0.9073 0.3759 0.1885 +vn -0.8529 0.4506 0.2639 +vn -0.8622 0.4107 0.2966 +vn -0.8602 0.4136 0.2984 +vn -0.8518 0.4572 0.2557 +vn -0.9722 0.1994 0.1229 +vn -0.9729 0.1976 0.1201 +vn -0.9010 0.3898 0.1906 +vn -0.8981 0.3944 0.1944 +vn -0.9284 0.3354 0.1598 +vn -0.9246 0.3423 0.1674 +vn -0.9820 0.1706 0.0809 +vn -0.9811 0.1745 0.0841 +vn 0.1503 0.9593 0.2390 +vn -0.0253 0.9766 0.2136 +vn 0.0193 0.9715 0.2362 +vn 0.1798 0.9509 0.2520 +vn -0.6200 0.6652 0.4160 +vn -0.6394 0.6826 0.3539 +vn -0.6467 0.6718 0.3612 +vn -0.6729 0.6317 0.3849 +vn -0.7192 0.6240 0.3055 +vn -0.7559 0.5987 0.2648 +vn -0.8369 0.5289 0.1406 +vn -0.8347 0.5323 0.1413 +vn -0.2389 0.9475 0.2124 +vn -0.2158 0.9492 0.2292 +vn -0.7346 0.6207 0.2741 +vn -0.7337 0.6206 0.2766 +vn -0.4651 0.8568 0.2228 +vn -0.4627 0.8558 0.2314 +vn -0.7148 0.6208 0.3220 +vn -0.7139 0.6216 0.3224 +vn -0.6061 0.7593 0.2369 +vn -0.6044 0.7596 0.2402 +vn -0.7604 0.6031 0.2410 +vn -0.7553 0.6056 0.2505 +vn 0.3172 0.7538 0.5754 +vn 0.4167 0.6495 0.6360 +vn 0.3960 0.6704 0.6275 +vn 0.3008 0.7682 0.5651 +vn -0.2813 0.4134 0.8660 +vn -0.2746 0.4440 0.8529 +vn -0.2693 0.4408 0.8562 +vn -0.2582 0.4020 0.8785 +vn 0.8374 0.3472 0.4221 +vn 0.8854 0.2412 0.3973 +vn 0.8837 0.2557 0.3919 +vn 0.8259 0.3546 0.4384 +vn 0.0199 0.0152 0.9997 +vn 0.0198 0.0184 0.9996 +vn 0.5915 0.5054 0.6282 +vn 0.5828 0.5312 0.6150 +vn 0.0237 0.0619 0.9978 +vn 0.0302 0.0428 0.9986 +vn 0.7557 0.3250 0.5686 +vn 0.7474 0.3393 0.5712 +vn -0.0403 0.1628 0.9858 +vn -0.0135 0.1373 0.9904 +vn 0.7698 0.3535 0.5315 +vn 0.7697 0.3527 0.5321 +vn -0.1712 0.2881 0.9422 +vn -0.1354 0.2611 0.9558 +vn 0.9057 0.2237 0.3601 +vn 0.9020 0.2261 0.3679 +vn 0.9693 0.2385 0.0602 +vn 0.9852 0.1645 -0.0481 +vn 0.9849 0.1670 -0.0463 +vn 0.9679 0.2429 0.0651 +vn 0.9377 0.2190 0.2697 +vn 0.9367 0.2220 0.2707 +vn 0.9541 0.2209 0.2020 +vn 0.9525 0.2250 0.2054 +vn 0.9745 0.2023 0.0966 +vn 0.9739 0.2034 0.1006 +vn 0.9782 0.2072 0.0138 +vn 0.9791 0.2035 0.0065 +vn 0.8475 0.4324 0.3078 +vn 0.8543 0.4729 0.2158 +vn 0.8541 0.4725 0.2171 +vn 0.8471 0.4345 0.3060 +vn 0.9583 0.2748 0.0786 +vn 0.9601 0.2719 0.0653 +vn 0.9126 0.3626 0.1889 +vn 0.9154 0.3582 0.1834 +vn 0.9005 0.3635 0.2388 +vn 0.9026 0.3612 0.2343 +vn 0.8455 0.4742 0.2454 +vn 0.8449 0.4747 0.2465 +vn 0.7664 0.6350 0.0974 +vn 0.6239 0.7403 -0.2503 +vn 0.5935 0.7522 -0.2863 +vn 0.7660 0.6295 0.1305 +vn 0.6075 0.7938 0.0284 +vn 0.5457 0.8350 -0.0702 +vn 0.3006 0.9238 0.2373 +vn 0.3080 0.9219 0.2351 +vn 0.8108 0.5552 0.1852 +vn 0.8189 0.5427 0.1869 +vn 0.5554 0.8154 0.1630 +vn 0.5223 0.8454 0.1113 +vn 0.7442 0.6269 0.2308 +vn 0.7449 0.6277 0.2263 +vn 0.4691 0.8569 0.2138 +vn 0.4616 0.8651 0.1963 +vn 0.7562 0.6109 0.2343 +vn 0.7548 0.6102 0.2406 +vn 0.3904 0.8935 0.2219 +vn 0.3921 0.8934 0.2194 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_10 +s 1 +f 6501/3251/7981 6502/3252/7982 6503/3253/7983 6504/3254/7984 +f 6505/3255/7985 6501/3251/7981 6504/3254/7984 6506/3256/7986 +f 6507/3257/7987 6505/3255/7985 6506/3256/7986 6508/3258/7988 +f 6509/3259/7989 6507/3257/7987 6508/3258/7988 6510/3260/7990 +f 6511/3261/7991 6512/3262/7992 6502/3252/7982 6501/3251/7981 +f 6513/3263/7993 6511/3261/7991 6501/3251/7981 6505/3255/7985 +f 6514/3264/7994 6513/3263/7993 6505/3255/7985 6507/3257/7987 +f 6515/3265/7995 6514/3264/7994 6507/3257/7987 6509/3259/7989 +f 6516/3266/7996 6517/3267/7997 6512/3262/7992 6511/3261/7991 +f 6518/3268/7998 6516/3266/7996 6511/3261/7991 6513/3263/7993 +f 6519/3269/7999 6518/3268/7998 6513/3263/7993 6514/3264/7994 +f 6520/3270/8000 6519/3269/7999 6514/3264/7994 6515/3265/7995 +f 6521/3271/8001 6522/3272/8002 6517/3267/7997 6516/3266/7996 +f 6523/3273/8003 6521/3271/8001 6516/3266/7996 6518/3268/7998 +f 6524/3274/8004 6523/3273/8003 6518/3268/7998 6519/3269/7999 +f 6525/3275/8005 6524/3274/8004 6519/3269/7999 6520/3270/8000 +f 6503/3253/7983 6526/3276/8006 6527/3277/8007 6528/3278/8008 +f 6529/3279/8009 6530/3280/8010 6531/3281/8011 6510/3260/7990 +f 6525/3275/8005 6532/3282/8012 6533/3283/8013 6534/3284/8014 +f 6535/3285/8015 6536/3286/8016 6537/3287/8017 6522/3272/8002 +f 6504/3254/7984 6503/3253/7983 6528/3278/8008 6538/3288/8018 +f 6510/3260/7990 6531/3281/8011 6539/3289/8019 6509/3259/7989 +f 6524/3274/8004 6525/3275/8005 6534/3284/8014 6540/3290/8020 +f 6522/3272/8002 6537/3287/8017 6541/3291/8021 6517/3267/7997 +f 6506/3256/7986 6504/3254/7984 6538/3288/8018 6542/3292/8022 +f 6509/3259/7989 6539/3289/8019 6543/3293/8023 6515/3265/7995 +f 6523/3273/8003 6524/3274/8004 6540/3290/8020 6544/3294/8024 +f 6517/3267/7997 6541/3291/8021 6545/3295/8025 6512/3262/7992 +f 6508/3258/7988 6506/3256/7986 6542/3292/8022 6546/3296/8026 +f 6515/3265/7995 6543/3293/8023 6547/3297/8027 6520/3270/8000 +f 6521/3271/8001 6523/3273/8003 6544/3294/8024 6548/3298/8028 +f 6512/3262/7992 6545/3295/8025 6549/3299/8029 6502/3252/7982 +f 6510/3260/7990 6508/3258/7988 6546/3296/8026 6529/3279/8009 +f 6520/3270/8000 6547/3297/8027 6532/3282/8012 6525/3275/8005 +f 6522/3272/8002 6521/3271/8001 6548/3298/8028 6535/3285/8015 +f 6502/3252/7982 6549/3299/8029 6526/3276/8006 6503/3253/7983 +f 6550/3300/8030 6551/3301/8031 6552/3302/8032 6553/3303/8033 +f 6554/3304/8034 6550/3300/8030 6553/3303/8033 6555/3305/8035 +f 6556/3306/8036 6554/3304/8034 6555/3305/8035 6557/3307/8037 +f 6558/3308/8038 6556/3306/8036 6557/3307/8037 6559/3309/8039 +f 6560/3310/8040 6561/3311/8041 6551/3301/8031 6550/3300/8030 +f 6562/3312/8042 6560/3310/8040 6550/3300/8030 6554/3304/8034 +f 6563/3313/8043 6562/3312/8042 6554/3304/8034 6556/3306/8036 +f 6564/3314/8044 6563/3313/8043 6556/3306/8036 6558/3308/8038 +f 6565/3315/8045 6566/3316/8046 6561/3311/8041 6560/3310/8040 +f 6567/3317/8047 6565/3315/8045 6560/3310/8040 6562/3312/8042 +f 6568/3318/8048 6567/3317/8047 6562/3312/8042 6563/3313/8043 +f 6569/3319/8049 6568/3318/8048 6563/3313/8043 6564/3314/8044 +f 6570/3320/8050 6571/3321/8051 6566/3316/8046 6565/3315/8045 +f 6572/3322/8052 6570/3320/8050 6565/3315/8045 6567/3317/8047 +f 6573/3323/8053 6572/3322/8052 6567/3317/8047 6568/3318/8048 +f 6574/3324/8054 6573/3323/8053 6568/3318/8048 6569/3319/8049 +f 6552/3302/8032 6531/3281/8011 6530/3280/8010 6575/3325/8055 +f 6576/3326/8056 6577/3327/8057 6578/3328/8058 6559/3309/8039 +f 6574/3324/8054 6579/3329/8059 6580/3330/8060 6581/3331/8061 +f 6582/3332/8062 6533/3283/8013 6532/3282/8012 6571/3321/8051 +f 6553/3303/8033 6552/3302/8032 6575/3325/8055 6583/3333/8063 +f 6559/3309/8039 6578/3328/8058 6584/3334/8064 6558/3308/8038 +f 6573/3323/8053 6574/3324/8054 6581/3331/8061 6585/3335/8065 +f 6571/3321/8051 6532/3282/8012 6547/3297/8027 6566/3316/8046 +f 6555/3305/8035 6553/3303/8033 6583/3333/8063 6586/3336/8066 +f 6558/3308/8038 6584/3334/8064 6587/3337/8067 6564/3314/8044 +f 6572/3322/8052 6573/3323/8053 6585/3335/8065 6588/3338/8068 +f 6566/3316/8046 6547/3297/8027 6543/3293/8023 6561/3311/8041 +f 6557/3307/8037 6555/3305/8035 6586/3336/8066 6589/3339/8069 +f 6564/3314/8044 6587/3337/8067 6590/3340/8070 6569/3319/8049 +f 6570/3320/8050 6572/3322/8052 6588/3338/8068 6591/3341/8071 +f 6561/3311/8041 6543/3293/8023 6539/3289/8019 6551/3301/8031 +f 6559/3309/8039 6557/3307/8037 6589/3339/8069 6576/3326/8056 +f 6569/3319/8049 6590/3340/8070 6579/3329/8059 6574/3324/8054 +f 6571/3321/8051 6570/3320/8050 6591/3341/8071 6582/3332/8062 +f 6551/3301/8031 6539/3289/8019 6531/3281/8011 6552/3302/8032 +f 6592/3342/8072 6593/3343/8073 6594/3344/8074 6595/3345/8075 +f 6596/3346/8076 6592/3342/8072 6595/3345/8075 6597/3347/8077 +f 6598/3348/8078 6596/3346/8076 6597/3347/8077 6599/3349/8079 +f 6600/3350/8080 6598/3348/8078 6599/3349/8079 6601/3351/8081 +f 6602/3352/8082 6603/3353/8083 6593/3343/8073 6592/3342/8072 +f 6604/3354/8084 6602/3352/8082 6592/3342/8072 6596/3346/8076 +f 6605/3355/8085 6604/3354/8084 6596/3346/8076 6598/3348/8078 +f 6606/3356/8086 6605/3355/8085 6598/3348/8078 6600/3350/8080 +f 6607/3357/8087 6608/3358/8088 6603/3353/8083 6602/3352/8082 +f 6609/3359/8089 6607/3357/8087 6602/3352/8082 6604/3354/8084 +f 6610/3360/8090 6609/3359/8089 6604/3354/8084 6605/3355/8085 +f 6611/3361/8091 6610/3360/8090 6605/3355/8085 6606/3356/8086 +f 6612/3362/8092 6613/3363/8093 6608/3358/8088 6607/3357/8087 +f 6614/3364/8094 6612/3362/8092 6607/3357/8087 6609/3359/8089 +f 6615/3365/8095 6614/3364/8094 6609/3359/8089 6610/3360/8090 +f 6616/3366/8096 6615/3365/8095 6610/3360/8090 6611/3361/8091 +f 6594/3344/8074 6578/3328/8058 6577/3327/8057 6617/3367/8097 +f 6618/3368/8098 6619/3369/8099 6620/3370/8100 6601/3351/8081 +f 6616/3366/8096 6621/3371/8101 6622/3372/8102 6623/3373/8103 +f 6624/3374/8104 6580/3330/8060 6579/3329/8059 6613/3363/8093 +f 6595/3345/8075 6594/3344/8074 6617/3367/8097 6625/3375/8105 +f 6601/3351/8081 6620/3370/8100 6626/3376/8106 6600/3350/8080 +f 6615/3365/8095 6616/3366/8096 6623/3373/8103 6627/3377/8107 +f 6613/3363/8093 6579/3329/8059 6590/3340/8070 6608/3358/8088 +f 6597/3347/8077 6595/3345/8075 6625/3375/8105 6628/3378/8108 +f 6600/3350/8080 6626/3376/8106 6629/3379/8109 6606/3356/8086 +f 6614/3364/8094 6615/3365/8095 6627/3377/8107 6630/3380/8110 +f 6608/3358/8088 6590/3340/8070 6587/3337/8067 6603/3353/8083 +f 6599/3349/8079 6597/3347/8077 6628/3378/8108 6631/3381/8111 +f 6606/3356/8086 6629/3379/8109 6632/3382/8112 6611/3361/8091 +f 6612/3362/8092 6614/3364/8094 6630/3380/8110 6633/3383/8113 +f 6603/3353/8083 6587/3337/8067 6584/3334/8064 6593/3343/8073 +f 6601/3351/8081 6599/3349/8079 6631/3381/8111 6618/3368/8098 +f 6611/3361/8091 6632/3382/8112 6621/3371/8101 6616/3366/8096 +f 6613/3363/8093 6612/3362/8092 6633/3383/8113 6624/3374/8104 +f 6593/3343/8073 6584/3334/8064 6578/3328/8058 6594/3344/8074 +f 6634/3384/8114 6635/3385/8115 6636/3386/8116 6637/3387/8117 +f 6638/3388/8118 6634/3384/8114 6637/3387/8117 6639/3389/8119 +f 6640/3390/8120 6638/3388/8118 6639/3389/8119 6641/3391/8121 +f 6642/3392/8122 6640/3390/8120 6641/3391/8121 6643/3393/8123 +f 6644/3394/8124 6645/3395/8125 6635/3385/8115 6634/3384/8114 +f 6646/3396/8126 6644/3394/8124 6634/3384/8114 6638/3388/8118 +f 6647/3397/8127 6646/3396/8126 6638/3388/8118 6640/3390/8120 +f 6648/3398/8128 6647/3397/8127 6640/3390/8120 6642/3392/8122 +f 6649/3399/8129 6650/3400/8130 6645/3395/8125 6644/3394/8124 +f 6651/3401/8131 6649/3399/8129 6644/3394/8124 6646/3396/8126 +f 6652/3402/8132 6651/3401/8131 6646/3396/8126 6647/3397/8127 +f 6653/3403/8133 6652/3402/8132 6647/3397/8127 6648/3398/8128 +f 6654/3404/8134 6655/3405/8135 6650/3400/8130 6649/3399/8129 +f 6656/3406/8136 6654/3404/8134 6649/3399/8129 6651/3401/8131 +f 6657/3407/8137 6656/3406/8136 6651/3401/8131 6652/3402/8132 +f 6658/3408/8138 6657/3407/8137 6652/3402/8132 6653/3403/8133 +f 6636/3386/8116 6620/3370/8100 6619/3369/8099 6659/3409/8139 +f 6660/3410/8140 6661/3411/8141 6662/3412/8142 6643/3393/8123 +f 6658/3408/8138 6663/3413/8143 6664/3414/8144 6665/3415/8145 +f 6666/3416/8146 6622/3372/8102 6621/3371/8101 6655/3405/8135 +f 6637/3387/8117 6636/3386/8116 6659/3409/8139 6667/3417/8147 +f 6643/3393/8123 6662/3412/8142 6668/3418/8148 6642/3392/8122 +f 6657/3407/8137 6658/3408/8138 6665/3415/8145 6669/3419/8149 +f 6655/3405/8135 6621/3371/8101 6632/3382/8112 6650/3400/8130 +f 6639/3389/8119 6637/3387/8117 6667/3417/8147 6670/3420/8150 +f 6642/3392/8122 6668/3418/8148 6671/3421/8151 6648/3398/8128 +f 6656/3406/8136 6657/3407/8137 6669/3419/8149 6672/3422/8152 +f 6650/3400/8130 6632/3382/8112 6629/3379/8109 6645/3395/8125 +f 6641/3391/8121 6639/3389/8119 6670/3420/8150 6673/3423/8153 +f 6648/3398/8128 6671/3421/8151 6674/3424/8154 6653/3403/8133 +f 6654/3404/8134 6656/3406/8136 6672/3422/8152 6675/3425/8155 +f 6645/3395/8125 6629/3379/8109 6626/3376/8106 6635/3385/8115 +f 6643/3393/8123 6641/3391/8121 6673/3423/8153 6660/3410/8140 +f 6653/3403/8133 6674/3424/8154 6663/3413/8143 6658/3408/8138 +f 6655/3405/8135 6654/3404/8134 6675/3425/8155 6666/3416/8146 +f 6635/3385/8115 6626/3376/8106 6620/3370/8100 6636/3386/8116 +f 6676/3426/8156 6677/3427/8157 6678/3428/8158 6679/3429/8159 +f 6680/3430/8160 6676/3426/8156 6679/3429/8159 6681/3431/8161 +f 6682/3432/8162 6680/3430/8160 6681/3431/8161 6683/3433/8163 +f 6684/3434/8164 6682/3432/8162 6683/3433/8163 6685/3435/8165 +f 6686/3436/8166 6687/3437/8167 6677/3427/8157 6676/3426/8156 +f 6688/3438/8168 6686/3436/8166 6676/3426/8156 6680/3430/8160 +f 6689/3439/8169 6688/3438/8168 6680/3430/8160 6682/3432/8162 +f 6690/3440/8170 6689/3439/8169 6682/3432/8162 6684/3434/8164 +f 6691/3441/8171 6692/3442/8172 6687/3437/8167 6686/3436/8166 +f 6693/3443/8173 6691/3441/8171 6686/3436/8166 6688/3438/8168 +f 6694/3444/8174 6693/3443/8173 6688/3438/8168 6689/3439/8169 +f 6695/3445/8175 6694/3444/8174 6689/3439/8169 6690/3440/8170 +f 6696/3446/8176 6697/3447/8177 6692/3442/8172 6691/3441/8171 +f 6698/3448/8178 6696/3446/8176 6691/3441/8171 6693/3443/8173 +f 6699/3449/8179 6698/3448/8178 6693/3443/8173 6694/3444/8174 +f 6700/3450/8180 6699/3449/8179 6694/3444/8174 6695/3445/8175 +f 6678/3428/8158 6701/3451/8181 6702/3452/8182 6703/3453/8183 +f 6704/3454/8184 6705/3455/8185 6706/3456/8186 6685/3435/8165 +f 6700/3450/8180 6707/3457/8187 6530/3280/8010 6529/3279/8009 +f 6528/3278/8008 6527/3277/8007 6708/3458/8188 6697/3447/8177 +f 6679/3429/8159 6678/3428/8158 6703/3453/8183 6709/3459/8189 +f 6685/3435/8165 6706/3456/8186 6710/3460/8190 6684/3434/8164 +f 6699/3449/8179 6700/3450/8180 6529/3279/8009 6546/3296/8026 +f 6697/3447/8177 6708/3458/8188 6711/3461/8191 6692/3442/8172 +f 6681/3431/8161 6679/3429/8159 6709/3459/8189 6712/3462/8192 +f 6684/3434/8164 6710/3460/8190 6713/3463/8193 6690/3440/8170 +f 6698/3448/8178 6699/3449/8179 6546/3296/8026 6542/3292/8022 +f 6692/3442/8172 6711/3461/8191 6714/3464/8194 6687/3437/8167 +f 6683/3433/8163 6681/3431/8161 6712/3462/8192 6715/3465/8195 +f 6690/3440/8170 6713/3463/8193 6716/3466/8196 6695/3445/8175 +f 6696/3446/8176 6698/3448/8178 6542/3292/8022 6538/3288/8018 +f 6687/3437/8167 6714/3464/8194 6717/3467/8197 6677/3427/8157 +f 6685/3435/8165 6683/3433/8163 6715/3465/8195 6704/3454/8184 +f 6695/3445/8175 6716/3466/8196 6707/3457/8187 6700/3450/8180 +f 6697/3447/8177 6696/3446/8176 6538/3288/8018 6528/3278/8008 +f 6677/3427/8157 6717/3467/8197 6701/3451/8181 6678/3428/8158 +f 6718/3468/8198 6719/3469/8199 6720/3470/8200 6721/3471/8201 +f 6722/3472/8202 6718/3468/8198 6721/3471/8201 6723/3473/8203 +f 6724/3474/8204 6722/3472/8202 6723/3473/8203 6725/3475/8205 +f 6726/3476/8206 6724/3474/8204 6725/3475/8205 6727/3477/8207 +f 6728/3478/8208 6729/3479/8209 6719/3469/8199 6718/3468/8198 +f 6730/3480/8210 6728/3478/8208 6718/3468/8198 6722/3472/8202 +f 6731/3481/8211 6730/3480/8210 6722/3472/8202 6724/3474/8204 +f 6732/3482/8212 6731/3481/8211 6724/3474/8204 6726/3476/8206 +f 6733/3483/8213 6734/3484/8214 6729/3479/8209 6728/3478/8208 +f 6735/3485/8215 6733/3483/8213 6728/3478/8208 6730/3480/8210 +f 6736/3486/8216 6735/3485/8215 6730/3480/8210 6731/3481/8211 +f 6737/3487/8217 6736/3486/8216 6731/3481/8211 6732/3482/8212 +f 6738/3488/8218 6739/3489/8219 6734/3484/8214 6733/3483/8213 +f 6740/3490/8220 6738/3488/8218 6733/3483/8213 6735/3485/8215 +f 6741/3491/8221 6740/3490/8220 6735/3485/8215 6736/3486/8216 +f 6742/3492/8222 6741/3491/8221 6736/3486/8216 6737/3487/8217 +f 6720/3470/8200 6706/3456/8186 6705/3455/8185 6743/3493/8223 +f 6744/3494/8224 6745/3495/8225 6746/3496/8226 6727/3477/8207 +f 6742/3492/8222 6747/3497/8227 6577/3327/8057 6576/3326/8056 +f 6575/3325/8055 6530/3280/8010 6707/3457/8187 6739/3489/8219 +f 6721/3471/8201 6720/3470/8200 6743/3493/8223 6748/3498/8228 +f 6727/3477/8207 6746/3496/8226 6749/3499/8229 6726/3476/8206 +f 6741/3491/8221 6742/3492/8222 6576/3326/8056 6589/3339/8069 +f 6739/3489/8219 6707/3457/8187 6716/3466/8196 6734/3484/8214 +f 6723/3473/8203 6721/3471/8201 6748/3498/8228 6750/3500/8230 +f 6726/3476/8206 6749/3499/8229 6751/3501/8231 6732/3482/8212 +f 6740/3490/8220 6741/3491/8221 6589/3339/8069 6586/3336/8066 +f 6734/3484/8214 6716/3466/8196 6713/3463/8193 6729/3479/8209 +f 6725/3475/8205 6723/3473/8203 6750/3500/8230 6752/3502/8232 +f 6732/3482/8212 6751/3501/8231 6753/3503/8233 6737/3487/8217 +f 6738/3488/8218 6740/3490/8220 6586/3336/8066 6583/3333/8063 +f 6729/3479/8209 6713/3463/8193 6710/3460/8190 6719/3469/8199 +f 6727/3477/8207 6725/3475/8205 6752/3502/8232 6744/3494/8224 +f 6737/3487/8217 6753/3503/8233 6747/3497/8227 6742/3492/8222 +f 6739/3489/8219 6738/3488/8218 6583/3333/8063 6575/3325/8055 +f 6719/3469/8199 6710/3460/8190 6706/3456/8186 6720/3470/8200 +f 6754/3504/8234 6755/3505/8235 6756/3506/8236 6757/3507/8237 +f 6758/3508/8238 6754/3504/8234 6757/3507/8237 6759/3509/8239 +f 6760/3510/8240 6758/3508/8238 6759/3509/8239 6761/3511/8241 +f 6762/3512/8242 6760/3510/8240 6761/3511/8241 6763/3513/8243 +f 6764/3514/8244 6765/3515/8245 6755/3505/8235 6754/3504/8234 +f 6766/3516/8246 6764/3514/8244 6754/3504/8234 6758/3508/8238 +f 6767/3517/8247 6766/3516/8246 6758/3508/8238 6760/3510/8240 +f 6768/3518/8248 6767/3517/8247 6760/3510/8240 6762/3512/8242 +f 6769/3519/8249 6770/3520/8250 6765/3515/8245 6764/3514/8244 +f 6771/3521/8251 6769/3519/8249 6764/3514/8244 6766/3516/8246 +f 6772/3522/8252 6771/3521/8251 6766/3516/8246 6767/3517/8247 +f 6773/3523/8253 6772/3522/8252 6767/3517/8247 6768/3518/8248 +f 6774/3524/8254 6775/3525/8255 6770/3520/8250 6769/3519/8249 +f 6776/3526/8256 6774/3524/8254 6769/3519/8249 6771/3521/8251 +f 6777/3527/8257 6776/3526/8256 6771/3521/8251 6772/3522/8252 +f 6778/3528/8258 6777/3527/8257 6772/3522/8252 6773/3523/8253 +f 6756/3506/8236 6746/3496/8226 6745/3495/8225 6779/3529/8259 +f 6780/3530/8260 6781/3531/8261 6782/3532/8262 6763/3513/8243 +f 6778/3528/8258 6783/3533/8263 6619/3369/8099 6618/3368/8098 +f 6617/3367/8097 6577/3327/8057 6747/3497/8227 6775/3525/8255 +f 6757/3507/8237 6756/3506/8236 6779/3529/8259 6784/3534/8264 +f 6763/3513/8243 6782/3532/8262 6785/3535/8265 6762/3512/8242 +f 6777/3527/8257 6778/3528/8258 6618/3368/8098 6631/3381/8111 +f 6775/3525/8255 6747/3497/8227 6753/3503/8233 6770/3520/8250 +f 6759/3509/8239 6757/3507/8237 6784/3534/8264 6786/3536/8266 +f 6762/3512/8242 6785/3535/8265 6787/3537/8267 6768/3518/8248 +f 6776/3526/8256 6777/3527/8257 6631/3381/8111 6628/3378/8108 +f 6770/3520/8250 6753/3503/8233 6751/3501/8231 6765/3515/8245 +f 6761/3511/8241 6759/3509/8239 6786/3536/8266 6788/3538/8268 +f 6768/3518/8248 6787/3537/8267 6789/3539/8269 6773/3523/8253 +f 6774/3524/8254 6776/3526/8256 6628/3378/8108 6625/3375/8105 +f 6765/3515/8245 6751/3501/8231 6749/3499/8229 6755/3505/8235 +f 6763/3513/8243 6761/3511/8241 6788/3538/8268 6780/3530/8260 +f 6773/3523/8253 6789/3539/8269 6783/3533/8263 6778/3528/8258 +f 6775/3525/8255 6774/3524/8254 6625/3375/8105 6617/3367/8097 +f 6755/3505/8235 6749/3499/8229 6746/3496/8226 6756/3506/8236 +f 6790/3540/8270 6791/3541/8271 6792/3542/8272 6793/3543/8273 +f 6794/3544/8274 6790/3540/8270 6793/3543/8273 6795/3545/8275 +f 6796/3546/8276 6794/3544/8274 6795/3545/8275 6797/3547/8277 +f 6798/3548/8278 6796/3546/8276 6797/3547/8277 6799/3549/8279 +f 6800/3550/8280 6801/3551/8281 6791/3541/8271 6790/3540/8270 +f 6802/3552/8282 6800/3550/8280 6790/3540/8270 6794/3544/8274 +f 6803/3553/8283 6802/3552/8282 6794/3544/8274 6796/3546/8276 +f 6804/3554/8284 6803/3553/8283 6796/3546/8276 6798/3548/8278 +f 6805/3555/8285 6806/3556/8286 6801/3551/8281 6800/3550/8280 +f 6807/3557/8287 6805/3555/8285 6800/3550/8280 6802/3552/8282 +f 6808/3558/8288 6807/3557/8287 6802/3552/8282 6803/3553/8283 +f 6809/3559/8289 6808/3558/8288 6803/3553/8283 6804/3554/8284 +f 6810/3560/8290 6811/3561/8291 6806/3556/8286 6805/3555/8285 +f 6812/3562/8292 6810/3560/8290 6805/3555/8285 6807/3557/8287 +f 6813/3563/8293 6812/3562/8292 6807/3557/8287 6808/3558/8288 +f 6814/3564/8294 6813/3563/8293 6808/3558/8288 6809/3559/8289 +f 6792/3542/8272 6782/3532/8262 6781/3531/8261 6815/3565/8295 +f 6816/3566/8296 6817/3567/8297 6818/3568/8298 6799/3549/8279 +f 6814/3564/8294 6819/3569/8299 6661/3411/8141 6660/3410/8140 +f 6659/3409/8139 6619/3369/8099 6783/3533/8263 6811/3561/8291 +f 6793/3543/8273 6792/3542/8272 6815/3565/8295 6820/3570/8300 +f 6799/3549/8279 6818/3568/8298 6821/3571/8301 6798/3548/8278 +f 6813/3563/8293 6814/3564/8294 6660/3410/8140 6673/3423/8153 +f 6811/3561/8291 6783/3533/8263 6789/3539/8269 6806/3556/8286 +f 6795/3545/8275 6793/3543/8273 6820/3570/8300 6822/3572/8302 +f 6798/3548/8278 6821/3571/8301 6823/3573/8303 6804/3554/8284 +f 6812/3562/8292 6813/3563/8293 6673/3423/8153 6670/3420/8150 +f 6806/3556/8286 6789/3539/8269 6787/3537/8267 6801/3551/8281 +f 6797/3547/8277 6795/3545/8275 6822/3572/8302 6824/3574/8304 +f 6804/3554/8284 6823/3573/8303 6825/3575/8305 6809/3559/8289 +f 6810/3560/8290 6812/3562/8292 6670/3420/8150 6667/3417/8147 +f 6801/3551/8281 6787/3537/8267 6785/3535/8265 6791/3541/8271 +f 6799/3549/8279 6797/3547/8277 6824/3574/8304 6816/3566/8296 +f 6809/3559/8289 6825/3575/8305 6819/3569/8299 6814/3564/8294 +f 6811/3561/8291 6810/3560/8290 6667/3417/8147 6659/3409/8139 +f 6791/3541/8271 6785/3535/8265 6782/3532/8262 6792/3542/8272 +f 6826/3253/8306 6827/3252/8307 6828/3251/8308 6829/3254/8309 +f 6829/3254/8309 6828/3251/8308 6830/3255/8310 6831/3256/8311 +f 6831/3256/8311 6830/3255/8310 6832/3257/8312 6833/3258/8313 +f 6833/3258/8313 6832/3257/8312 6834/3259/8314 6835/3260/8315 +f 6827/3252/8307 6836/3262/8316 6837/3261/8317 6828/3251/8308 +f 6828/3251/8308 6837/3261/8317 6838/3263/8318 6830/3255/8310 +f 6830/3255/8310 6838/3263/8318 6839/3264/8319 6832/3257/8312 +f 6832/3257/8312 6839/3264/8319 6840/3265/8320 6834/3259/8314 +f 6836/3262/8316 6841/3267/8321 6842/3266/8322 6837/3261/8317 +f 6837/3261/8317 6842/3266/8322 6843/3268/8323 6838/3263/8318 +f 6838/3263/8318 6843/3268/8323 6844/3269/8324 6839/3264/8319 +f 6839/3264/8319 6844/3269/8324 6845/3270/8325 6840/3265/8320 +f 6841/3267/8321 6846/3272/8326 6847/3271/8327 6842/3266/8322 +f 6842/3266/8322 6847/3271/8327 6848/3273/8328 6843/3268/8323 +f 6843/3268/8323 6848/3273/8328 6849/3274/8329 6844/3269/8324 +f 6844/3269/8324 6849/3274/8329 6850/3275/8330 6845/3270/8325 +f 6851/3277/8331 6852/3276/8332 6826/3253/8306 6853/3278/8333 +f 6854/3281/8334 6855/3280/8335 6856/3279/8336 6835/3260/8315 +f 6857/3283/8337 6858/3282/8338 6850/3275/8330 6859/3284/8339 +f 6860/3287/8340 6861/3286/8341 6862/3285/8342 6846/3272/8326 +f 6853/3278/8333 6826/3253/8306 6829/3254/8309 6863/3288/8343 +f 6864/3289/8344 6854/3281/8334 6835/3260/8315 6834/3259/8314 +f 6859/3284/8339 6850/3275/8330 6849/3274/8329 6865/3290/8345 +f 6866/3291/8346 6860/3287/8340 6846/3272/8326 6841/3267/8321 +f 6863/3288/8343 6829/3254/8309 6831/3256/8311 6867/3292/8347 +f 6868/3293/8348 6864/3289/8344 6834/3259/8314 6840/3265/8320 +f 6865/3290/8345 6849/3274/8329 6848/3273/8328 6869/3294/8349 +f 6870/3295/8350 6866/3291/8346 6841/3267/8321 6836/3262/8316 +f 6867/3292/8347 6831/3256/8311 6833/3258/8313 6871/3296/8351 +f 6872/3297/8352 6868/3293/8348 6840/3265/8320 6845/3270/8325 +f 6869/3294/8349 6848/3273/8328 6847/3271/8327 6873/3298/8353 +f 6874/3299/8354 6870/3295/8350 6836/3262/8316 6827/3252/8307 +f 6871/3296/8351 6833/3258/8313 6835/3260/8315 6856/3279/8336 +f 6858/3282/8338 6872/3297/8352 6845/3270/8325 6850/3275/8330 +f 6873/3298/8353 6847/3271/8327 6846/3272/8326 6862/3285/8342 +f 6852/3276/8332 6874/3299/8354 6827/3252/8307 6826/3253/8306 +f 6875/3302/8355 6876/3301/8356 6877/3300/8357 6878/3303/8358 +f 6878/3303/8358 6877/3300/8357 6879/3304/8359 6880/3305/8360 +f 6880/3305/8360 6879/3304/8359 6881/3306/8361 6882/3307/8362 +f 6882/3307/8362 6881/3306/8361 6883/3308/8363 6884/3309/8364 +f 6876/3301/8356 6885/3311/8365 6886/3310/8366 6877/3300/8357 +f 6877/3300/8357 6886/3310/8366 6887/3312/8367 6879/3304/8359 +f 6879/3304/8359 6887/3312/8367 6888/3313/8368 6881/3306/8361 +f 6881/3306/8361 6888/3313/8368 6889/3314/8369 6883/3308/8363 +f 6885/3311/8365 6890/3316/8370 6891/3315/8371 6886/3310/8366 +f 6886/3310/8366 6891/3315/8371 6892/3317/8372 6887/3312/8367 +f 6887/3312/8367 6892/3317/8372 6893/3318/8373 6888/3313/8368 +f 6888/3313/8368 6893/3318/8373 6894/3319/8374 6889/3314/8369 +f 6890/3316/8370 6895/3321/8375 6896/3320/8376 6891/3315/8371 +f 6891/3315/8371 6896/3320/8376 6897/3322/8377 6892/3317/8372 +f 6892/3317/8372 6897/3322/8377 6898/3323/8378 6893/3318/8373 +f 6893/3318/8373 6898/3323/8378 6899/3324/8379 6894/3319/8374 +f 6855/3280/8335 6854/3281/8334 6875/3302/8355 6900/3325/8380 +f 6901/3328/8381 6902/3327/8382 6903/3326/8383 6884/3309/8364 +f 6904/3330/8384 6905/3329/8385 6899/3324/8379 6906/3331/8386 +f 6858/3282/8338 6857/3283/8337 6907/3332/8387 6895/3321/8375 +f 6900/3325/8380 6875/3302/8355 6878/3303/8358 6908/3333/8388 +f 6909/3334/8389 6901/3328/8381 6884/3309/8364 6883/3308/8363 +f 6906/3331/8386 6899/3324/8379 6898/3323/8378 6910/3335/8390 +f 6872/3297/8352 6858/3282/8338 6895/3321/8375 6890/3316/8370 +f 6908/3333/8388 6878/3303/8358 6880/3305/8360 6911/3336/8391 +f 6912/3337/8392 6909/3334/8389 6883/3308/8363 6889/3314/8369 +f 6910/3335/8390 6898/3323/8378 6897/3322/8377 6913/3338/8393 +f 6868/3293/8348 6872/3297/8352 6890/3316/8370 6885/3311/8365 +f 6911/3336/8391 6880/3305/8360 6882/3307/8362 6914/3339/8394 +f 6915/3340/8395 6912/3337/8392 6889/3314/8369 6894/3319/8374 +f 6913/3338/8393 6897/3322/8377 6896/3320/8376 6916/3341/8396 +f 6864/3289/8344 6868/3293/8348 6885/3311/8365 6876/3301/8356 +f 6914/3339/8394 6882/3307/8362 6884/3309/8364 6903/3326/8383 +f 6905/3329/8385 6915/3340/8395 6894/3319/8374 6899/3324/8379 +f 6916/3341/8396 6896/3320/8376 6895/3321/8375 6907/3332/8387 +f 6854/3281/8334 6864/3289/8344 6876/3301/8356 6875/3302/8355 +f 6917/3344/8397 6918/3343/8398 6919/3342/8399 6920/3345/8400 +f 6920/3345/8400 6919/3342/8399 6921/3346/8401 6922/3347/8402 +f 6922/3347/8402 6921/3346/8401 6923/3348/8403 6924/3349/8404 +f 6924/3349/8404 6923/3348/8403 6925/3350/8405 6926/3351/8406 +f 6918/3343/8398 6927/3353/8407 6928/3352/8408 6919/3342/8399 +f 6919/3342/8399 6928/3352/8408 6929/3354/8409 6921/3346/8401 +f 6921/3346/8401 6929/3354/8409 6930/3355/8410 6923/3348/8403 +f 6923/3348/8403 6930/3355/8410 6931/3356/8411 6925/3350/8405 +f 6927/3353/8407 6932/3358/8412 6933/3357/8413 6928/3352/8408 +f 6928/3352/8408 6933/3357/8413 6934/3359/8414 6929/3354/8409 +f 6929/3354/8409 6934/3359/8414 6935/3360/8415 6930/3355/8410 +f 6930/3355/8410 6935/3360/8415 6936/3361/8416 6931/3356/8411 +f 6932/3358/8412 6937/3363/8417 6938/3362/8418 6933/3357/8413 +f 6933/3357/8413 6938/3362/8418 6939/3364/8419 6934/3359/8414 +f 6934/3359/8414 6939/3364/8419 6940/3365/8420 6935/3360/8415 +f 6935/3360/8415 6940/3365/8420 6941/3366/8421 6936/3361/8416 +f 6902/3327/8382 6901/3328/8381 6917/3344/8397 6942/3367/8422 +f 6943/3370/8423 6944/3369/8424 6945/3368/8425 6926/3351/8406 +f 6946/3372/8426 6947/3371/8427 6941/3366/8421 6948/3373/8428 +f 6905/3329/8385 6904/3330/8384 6949/3374/8429 6937/3363/8417 +f 6942/3367/8422 6917/3344/8397 6920/3345/8400 6950/3375/8430 +f 6951/3376/8431 6943/3370/8423 6926/3351/8406 6925/3350/8405 +f 6948/3373/8428 6941/3366/8421 6940/3365/8420 6952/3377/8432 +f 6915/3340/8395 6905/3329/8385 6937/3363/8417 6932/3358/8412 +f 6950/3375/8430 6920/3345/8400 6922/3347/8402 6953/3378/8433 +f 6954/3379/8434 6951/3376/8431 6925/3350/8405 6931/3356/8411 +f 6952/3377/8432 6940/3365/8420 6939/3364/8419 6955/3380/8435 +f 6912/3337/8392 6915/3340/8395 6932/3358/8412 6927/3353/8407 +f 6953/3378/8433 6922/3347/8402 6924/3349/8404 6956/3381/8436 +f 6957/3382/8437 6954/3379/8434 6931/3356/8411 6936/3361/8416 +f 6955/3380/8435 6939/3364/8419 6938/3362/8418 6958/3383/8438 +f 6909/3334/8389 6912/3337/8392 6927/3353/8407 6918/3343/8398 +f 6956/3381/8436 6924/3349/8404 6926/3351/8406 6945/3368/8425 +f 6947/3371/8427 6957/3382/8437 6936/3361/8416 6941/3366/8421 +f 6958/3383/8438 6938/3362/8418 6937/3363/8417 6949/3374/8429 +f 6901/3328/8381 6909/3334/8389 6918/3343/8398 6917/3344/8397 +f 6959/3386/8439 6960/3385/8440 6961/3384/8441 6962/3387/8442 +f 6962/3387/8442 6961/3384/8441 6963/3388/8443 6964/3389/8444 +f 6964/3389/8444 6963/3388/8443 6965/3390/8445 6966/3391/8446 +f 6966/3391/8446 6965/3390/8445 6967/3392/8447 6968/3393/8448 +f 6960/3385/8440 6969/3395/8449 6970/3394/8450 6961/3384/8441 +f 6961/3384/8441 6970/3394/8450 6971/3396/8451 6963/3388/8443 +f 6963/3388/8443 6971/3396/8451 6972/3397/8452 6965/3390/8445 +f 6965/3390/8445 6972/3397/8452 6973/3398/8453 6967/3392/8447 +f 6969/3395/8449 6974/3400/8454 6975/3399/8455 6970/3394/8450 +f 6970/3394/8450 6975/3399/8455 6976/3401/8456 6971/3396/8451 +f 6971/3396/8451 6976/3401/8456 6977/3402/8457 6972/3397/8452 +f 6972/3397/8452 6977/3402/8457 6978/3403/8458 6973/3398/8453 +f 6974/3400/8454 6979/3405/8459 6980/3404/8460 6975/3399/8455 +f 6975/3399/8455 6980/3404/8460 6981/3406/8461 6976/3401/8456 +f 6976/3401/8456 6981/3406/8461 6982/3407/8462 6977/3402/8457 +f 6977/3402/8457 6982/3407/8462 6983/3408/8463 6978/3403/8458 +f 6944/3369/8424 6943/3370/8423 6959/3386/8439 6984/3409/8464 +f 6985/3412/8465 6986/3411/8466 6987/3410/8467 6968/3393/8448 +f 6988/3414/8468 6989/3413/8469 6983/3408/8463 6990/3415/8470 +f 6947/3371/8427 6946/3372/8426 6991/3416/8471 6979/3405/8459 +f 6984/3409/8464 6959/3386/8439 6962/3387/8442 6992/3417/8472 +f 6993/3418/8473 6985/3412/8465 6968/3393/8448 6967/3392/8447 +f 6990/3415/8470 6983/3408/8463 6982/3407/8462 6994/3419/8474 +f 6957/3382/8437 6947/3371/8427 6979/3405/8459 6974/3400/8454 +f 6992/3417/8472 6962/3387/8442 6964/3389/8444 6995/3420/8475 +f 6996/3421/8476 6993/3418/8473 6967/3392/8447 6973/3398/8453 +f 6994/3419/8474 6982/3407/8462 6981/3406/8461 6997/3422/8477 +f 6954/3379/8434 6957/3382/8437 6974/3400/8454 6969/3395/8449 +f 6995/3420/8475 6964/3389/8444 6966/3391/8446 6998/3423/8478 +f 6999/3424/8479 6996/3421/8476 6973/3398/8453 6978/3403/8458 +f 6997/3422/8477 6981/3406/8461 6980/3404/8460 7000/3425/8480 +f 6951/3376/8431 6954/3379/8434 6969/3395/8449 6960/3385/8440 +f 6998/3423/8478 6966/3391/8446 6968/3393/8448 6987/3410/8467 +f 6989/3413/8469 6999/3424/8479 6978/3403/8458 6983/3408/8463 +f 7000/3425/8480 6980/3404/8460 6979/3405/8459 6991/3416/8471 +f 6943/3370/8423 6951/3376/8431 6960/3385/8440 6959/3386/8439 +f 7001/3428/8481 7002/3427/8482 7003/3426/8483 7004/3429/8484 +f 7004/3429/8484 7003/3426/8483 7005/3430/8485 7006/3431/8486 +f 7006/3431/8486 7005/3430/8485 7007/3432/8487 7008/3433/8488 +f 7008/3433/8488 7007/3432/8487 7009/3434/8489 7010/3435/8490 +f 7002/3427/8482 7011/3437/8491 7012/3436/8492 7003/3426/8483 +f 7003/3426/8483 7012/3436/8492 7013/3438/8493 7005/3430/8485 +f 7005/3430/8485 7013/3438/8493 7014/3439/8494 7007/3432/8487 +f 7007/3432/8487 7014/3439/8494 7015/3440/8495 7009/3434/8489 +f 7011/3437/8491 7016/3442/8496 7017/3441/8497 7012/3436/8492 +f 7012/3436/8492 7017/3441/8497 7018/3443/8498 7013/3438/8493 +f 7013/3438/8493 7018/3443/8498 7019/3444/8499 7014/3439/8494 +f 7014/3439/8494 7019/3444/8499 7020/3445/8500 7015/3440/8495 +f 7016/3442/8496 7021/3447/8501 7022/3446/8502 7017/3441/8497 +f 7017/3441/8497 7022/3446/8502 7023/3448/8503 7018/3443/8498 +f 7018/3443/8498 7023/3448/8503 7024/3449/8504 7019/3444/8499 +f 7019/3444/8499 7024/3449/8504 7025/3450/8505 7020/3445/8500 +f 7026/3452/8506 7027/3451/8507 7001/3428/8481 7028/3453/8508 +f 7029/3456/8509 7030/3455/8510 7031/3454/8511 7010/3435/8490 +f 6855/3280/8335 7032/3457/8512 7025/3450/8505 6856/3279/8336 +f 7033/3458/8513 6851/3277/8331 6853/3278/8333 7021/3447/8501 +f 7028/3453/8508 7001/3428/8481 7004/3429/8484 7034/3459/8514 +f 7035/3460/8515 7029/3456/8509 7010/3435/8490 7009/3434/8489 +f 6856/3279/8336 7025/3450/8505 7024/3449/8504 6871/3296/8351 +f 7036/3461/8516 7033/3458/8513 7021/3447/8501 7016/3442/8496 +f 7034/3459/8514 7004/3429/8484 7006/3431/8486 7037/3462/8517 +f 7038/3463/8518 7035/3460/8515 7009/3434/8489 7015/3440/8495 +f 6871/3296/8351 7024/3449/8504 7023/3448/8503 6867/3292/8347 +f 7039/3464/8519 7036/3461/8516 7016/3442/8496 7011/3437/8491 +f 7037/3462/8517 7006/3431/8486 7008/3433/8488 7040/3465/8520 +f 7041/3466/8521 7038/3463/8518 7015/3440/8495 7020/3445/8500 +f 6867/3292/8347 7023/3448/8503 7022/3446/8502 6863/3288/8343 +f 7042/3467/8522 7039/3464/8519 7011/3437/8491 7002/3427/8482 +f 7040/3465/8520 7008/3433/8488 7010/3435/8490 7031/3454/8511 +f 7032/3457/8512 7041/3466/8521 7020/3445/8500 7025/3450/8505 +f 6863/3288/8343 7022/3446/8502 7021/3447/8501 6853/3278/8333 +f 7027/3451/8507 7042/3467/8522 7002/3427/8482 7001/3428/8481 +f 7043/3470/8523 7044/3469/8524 7045/3468/8525 7046/3471/8526 +f 7046/3471/8526 7045/3468/8525 7047/3472/8527 7048/3473/8528 +f 7048/3473/8528 7047/3472/8527 7049/3474/8529 7050/3475/8530 +f 7050/3475/8530 7049/3474/8529 7051/3476/8531 7052/3477/8532 +f 7044/3469/8524 7053/3479/8533 7054/3478/8534 7045/3468/8525 +f 7045/3468/8525 7054/3478/8534 7055/3480/8535 7047/3472/8527 +f 7047/3472/8527 7055/3480/8535 7056/3481/8536 7049/3474/8529 +f 7049/3474/8529 7056/3481/8536 7057/3482/8537 7051/3476/8531 +f 7053/3479/8533 7058/3484/8538 7059/3483/8539 7054/3478/8534 +f 7054/3478/8534 7059/3483/8539 7060/3485/8540 7055/3480/8535 +f 7055/3480/8535 7060/3485/8540 7061/3486/8541 7056/3481/8536 +f 7056/3481/8536 7061/3486/8541 7062/3487/8542 7057/3482/8537 +f 7058/3484/8538 7063/3489/8543 7064/3488/8544 7059/3483/8539 +f 7059/3483/8539 7064/3488/8544 7065/3490/8545 7060/3485/8540 +f 7060/3485/8540 7065/3490/8545 7066/3491/8546 7061/3486/8541 +f 7061/3486/8541 7066/3491/8546 7067/3492/8547 7062/3487/8542 +f 7030/3455/8510 7029/3456/8509 7043/3470/8523 7068/3493/8548 +f 7069/3496/8549 7070/3495/8550 7071/3494/8551 7052/3477/8532 +f 6902/3327/8382 7072/3497/8552 7067/3492/8547 6903/3326/8383 +f 7032/3457/8512 6855/3280/8335 6900/3325/8380 7063/3489/8543 +f 7068/3493/8548 7043/3470/8523 7046/3471/8526 7073/3498/8553 +f 7074/3499/8554 7069/3496/8549 7052/3477/8532 7051/3476/8531 +f 6903/3326/8383 7067/3492/8547 7066/3491/8546 6914/3339/8394 +f 7041/3466/8521 7032/3457/8512 7063/3489/8543 7058/3484/8538 +f 7073/3498/8553 7046/3471/8526 7048/3473/8528 7075/3500/8555 +f 7076/3501/8556 7074/3499/8554 7051/3476/8531 7057/3482/8537 +f 6914/3339/8394 7066/3491/8546 7065/3490/8545 6911/3336/8391 +f 7038/3463/8518 7041/3466/8521 7058/3484/8538 7053/3479/8533 +f 7075/3500/8555 7048/3473/8528 7050/3475/8530 7077/3502/8557 +f 7078/3503/8558 7076/3501/8556 7057/3482/8537 7062/3487/8542 +f 6911/3336/8391 7065/3490/8545 7064/3488/8544 6908/3333/8388 +f 7035/3460/8515 7038/3463/8518 7053/3479/8533 7044/3469/8524 +f 7077/3502/8557 7050/3475/8530 7052/3477/8532 7071/3494/8551 +f 7072/3497/8552 7078/3503/8558 7062/3487/8542 7067/3492/8547 +f 6908/3333/8388 7064/3488/8544 7063/3489/8543 6900/3325/8380 +f 7029/3456/8509 7035/3460/8515 7044/3469/8524 7043/3470/8523 +f 7079/3506/8559 7080/3505/8560 7081/3504/8561 7082/3507/8562 +f 7082/3507/8562 7081/3504/8561 7083/3508/8563 7084/3509/8564 +f 7084/3509/8564 7083/3508/8563 7085/3510/8565 7086/3511/8566 +f 7086/3511/8566 7085/3510/8565 7087/3512/8567 7088/3513/8568 +f 7080/3505/8560 7089/3515/8569 7090/3514/8570 7081/3504/8561 +f 7081/3504/8561 7090/3514/8570 7091/3516/8571 7083/3508/8563 +f 7083/3508/8563 7091/3516/8571 7092/3517/8572 7085/3510/8565 +f 7085/3510/8565 7092/3517/8572 7093/3518/8573 7087/3512/8567 +f 7089/3515/8569 7094/3520/8574 7095/3519/8575 7090/3514/8570 +f 7090/3514/8570 7095/3519/8575 7096/3521/8576 7091/3516/8571 +f 7091/3516/8571 7096/3521/8576 7097/3522/8577 7092/3517/8572 +f 7092/3517/8572 7097/3522/8577 7098/3523/8578 7093/3518/8573 +f 7094/3520/8574 7099/3525/8579 7100/3524/8580 7095/3519/8575 +f 7095/3519/8575 7100/3524/8580 7101/3526/8581 7096/3521/8576 +f 7096/3521/8576 7101/3526/8581 7102/3527/8582 7097/3522/8577 +f 7097/3522/8577 7102/3527/8582 7103/3528/8583 7098/3523/8578 +f 7070/3495/8550 7069/3496/8549 7079/3506/8559 7104/3529/8584 +f 7105/3532/8585 7106/3531/8586 7107/3530/8587 7088/3513/8568 +f 6944/3369/8424 7108/3533/8588 7103/3528/8583 6945/3368/8425 +f 7072/3497/8552 6902/3327/8382 6942/3367/8422 7099/3525/8579 +f 7104/3529/8584 7079/3506/8559 7082/3507/8562 7109/3534/8589 +f 7110/3535/8590 7105/3532/8585 7088/3513/8568 7087/3512/8567 +f 6945/3368/8425 7103/3528/8583 7102/3527/8582 6956/3381/8436 +f 7078/3503/8558 7072/3497/8552 7099/3525/8579 7094/3520/8574 +f 7109/3534/8589 7082/3507/8562 7084/3509/8564 7111/3536/8591 +f 7112/3537/8592 7110/3535/8590 7087/3512/8567 7093/3518/8573 +f 6956/3381/8436 7102/3527/8582 7101/3526/8581 6953/3378/8433 +f 7076/3501/8556 7078/3503/8558 7094/3520/8574 7089/3515/8569 +f 7111/3536/8591 7084/3509/8564 7086/3511/8566 7113/3538/8593 +f 7114/3539/8594 7112/3537/8592 7093/3518/8573 7098/3523/8578 +f 6953/3378/8433 7101/3526/8581 7100/3524/8580 6950/3375/8430 +f 7074/3499/8554 7076/3501/8556 7089/3515/8569 7080/3505/8560 +f 7113/3538/8593 7086/3511/8566 7088/3513/8568 7107/3530/8587 +f 7108/3533/8588 7114/3539/8594 7098/3523/8578 7103/3528/8583 +f 6950/3375/8430 7100/3524/8580 7099/3525/8579 6942/3367/8422 +f 7069/3496/8549 7074/3499/8554 7080/3505/8560 7079/3506/8559 +f 7115/3542/8595 7116/3541/8596 7117/3540/8597 7118/3543/8598 +f 7118/3543/8598 7117/3540/8597 7119/3544/8599 7120/3545/8600 +f 7120/3545/8600 7119/3544/8599 7121/3546/8601 7122/3547/8602 +f 7122/3547/8602 7121/3546/8601 7123/3548/8603 7124/3549/8604 +f 7116/3541/8596 7125/3551/8605 7126/3550/8606 7117/3540/8597 +f 7117/3540/8597 7126/3550/8606 7127/3552/8607 7119/3544/8599 +f 7119/3544/8599 7127/3552/8607 7128/3553/8608 7121/3546/8601 +f 7121/3546/8601 7128/3553/8608 7129/3554/8609 7123/3548/8603 +f 7125/3551/8605 7130/3556/8610 7131/3555/8611 7126/3550/8606 +f 7126/3550/8606 7131/3555/8611 7132/3557/8612 7127/3552/8607 +f 7127/3552/8607 7132/3557/8612 7133/3558/8613 7128/3553/8608 +f 7128/3553/8608 7133/3558/8613 7134/3559/8614 7129/3554/8609 +f 7130/3556/8610 7135/3561/8615 7136/3560/8616 7131/3555/8611 +f 7131/3555/8611 7136/3560/8616 7137/3562/8617 7132/3557/8612 +f 7132/3557/8612 7137/3562/8617 7138/3563/8618 7133/3558/8613 +f 7133/3558/8613 7138/3563/8618 7139/3564/8619 7134/3559/8614 +f 7106/3531/8586 7105/3532/8585 7115/3542/8595 7140/3565/8620 +f 7141/3568/8621 7142/3567/8622 7143/3566/8623 7124/3549/8604 +f 6986/3411/8466 7144/3569/8624 7139/3564/8619 6987/3410/8467 +f 7108/3533/8588 6944/3369/8424 6984/3409/8464 7135/3561/8615 +f 7140/3565/8620 7115/3542/8595 7118/3543/8598 7145/3570/8625 +f 7146/3571/8626 7141/3568/8621 7124/3549/8604 7123/3548/8603 +f 6987/3410/8467 7139/3564/8619 7138/3563/8618 6998/3423/8478 +f 7114/3539/8594 7108/3533/8588 7135/3561/8615 7130/3556/8610 +f 7145/3570/8625 7118/3543/8598 7120/3545/8600 7147/3572/8627 +f 7148/3573/8628 7146/3571/8626 7123/3548/8603 7129/3554/8609 +f 6998/3423/8478 7138/3563/8618 7137/3562/8617 6995/3420/8475 +f 7112/3537/8592 7114/3539/8594 7130/3556/8610 7125/3551/8605 +f 7147/3572/8627 7120/3545/8600 7122/3547/8602 7149/3574/8629 +f 7150/3575/8630 7148/3573/8628 7129/3554/8609 7134/3559/8614 +f 6995/3420/8475 7137/3562/8617 7136/3560/8616 6992/3417/8472 +f 7110/3535/8590 7112/3537/8592 7125/3551/8605 7116/3541/8596 +f 7149/3574/8629 7122/3547/8602 7124/3549/8604 7143/3566/8623 +f 7144/3569/8624 7150/3575/8630 7134/3559/8614 7139/3564/8619 +f 6992/3417/8472 7136/3560/8616 7135/3561/8615 6984/3409/8464 +f 7105/3532/8585 7110/3535/8590 7116/3541/8596 7115/3542/8595 +s 2 +f 6852/3276/8631 6851/3277/8632 6527/3277/8633 6526/3276/8634 +s 4 +f 6857/3283/8635 6859/3284/8636 6534/3284/8637 6533/3283/8638 +f 6862/3285/8639 6861/3286/8640 6536/3286/8641 6535/3285/8642 +s 2 +f 6861/3286/8643 6860/3287/8644 6537/3287/8645 6536/3286/8646 +s 4 +f 6859/3284/8636 6865/3290/8647 6540/3290/8648 6534/3284/8637 +s 2 +f 6860/3287/8644 6866/3291/8649 6541/3291/8650 6537/3287/8645 +s 4 +f 6865/3290/8647 6869/3294/8651 6544/3294/8652 6540/3290/8648 +s 2 +f 6866/3291/8649 6870/3295/8653 6545/3295/8654 6541/3291/8650 +s 4 +f 6869/3294/8651 6873/3298/8655 6548/3298/8656 6544/3294/8652 +s 2 +f 6870/3295/8653 6874/3299/8657 6549/3299/8658 6545/3295/8654 +s 4 +f 6873/3298/8655 6862/3285/8639 6535/3285/8642 6548/3298/8656 +s 2 +f 6874/3299/8657 6852/3276/8631 6526/3276/8634 6549/3299/8658 +s 4 +f 6904/3330/8659 6906/3331/8660 6581/3331/8661 6580/3330/8662 +f 6907/3332/8663 6857/3283/8635 6533/3283/8638 6582/3332/8664 +f 6906/3331/8660 6910/3335/8665 6585/3335/8666 6581/3331/8661 +f 6910/3335/8665 6913/3338/8667 6588/3338/8668 6585/3335/8666 +f 6913/3338/8667 6916/3341/8669 6591/3341/8670 6588/3338/8668 +f 6916/3341/8669 6907/3332/8663 6582/3332/8664 6591/3341/8670 +f 6946/3372/8671 6948/3373/8672 6623/3373/8673 6622/3372/8674 +f 6949/3374/8675 6904/3330/8659 6580/3330/8662 6624/3374/8676 +f 6948/3373/8672 6952/3377/8677 6627/3377/8678 6623/3373/8673 +f 6952/3377/8677 6955/3380/8679 6630/3380/8680 6627/3377/8678 +f 6955/3380/8679 6958/3383/8681 6633/3383/8682 6630/3380/8680 +f 6958/3383/8681 6949/3374/8675 6624/3374/8676 6633/3383/8682 +f 6986/3411/8683 6985/3412/8684 6662/3412/8685 6661/3411/8686 +f 6988/3414/8687 6990/3415/8688 6665/3415/8689 6664/3414/8690 +f 6989/3413/8691 6988/3414/8687 6664/3414/8690 6663/3413/8692 +f 6991/3416/8693 6946/3372/8671 6622/3372/8674 6666/3416/8694 +f 6985/3412/8684 6993/3418/8695 6668/3418/8696 6662/3412/8685 +f 6990/3415/8688 6994/3419/8697 6669/3419/8698 6665/3415/8689 +f 6993/3418/8695 6996/3421/8699 6671/3421/8700 6668/3418/8696 +f 6994/3419/8697 6997/3422/8701 6672/3422/8702 6669/3419/8698 +f 6996/3421/8699 6999/3424/8703 6674/3424/8704 6671/3421/8700 +f 6997/3422/8701 7000/3425/8705 6675/3425/8706 6672/3422/8702 +f 6999/3424/8703 6989/3413/8691 6663/3413/8692 6674/3424/8704 +f 7000/3425/8705 6991/3416/8693 6666/3416/8694 6675/3425/8706 +f 7026/3452/8707 7028/3453/8708 6703/3453/8709 6702/3452/8710 +s 2 +f 7027/3451/8711 7026/3452/8712 6702/3452/8713 6701/3451/8714 +s 4 +f 7031/3454/8715 7030/3455/8716 6705/3455/8717 6704/3454/8718 +s 2 +f 6851/3277/8632 7033/3458/8719 6708/3458/8720 6527/3277/8633 +s 4 +f 7028/3453/8708 7034/3459/8721 6709/3459/8722 6703/3453/8709 +s 2 +f 7033/3458/8719 7036/3461/8723 6711/3461/8724 6708/3458/8720 +s 4 +f 7034/3459/8721 7037/3462/8725 6712/3462/8726 6709/3459/8722 +s 2 +f 7036/3461/8723 7039/3464/8727 6714/3464/8728 6711/3461/8724 +s 4 +f 7037/3462/8725 7040/3465/8729 6715/3465/8730 6712/3462/8726 +s 2 +f 7039/3464/8727 7042/3467/8731 6717/3467/8732 6714/3464/8728 +s 4 +f 7040/3465/8729 7031/3454/8715 6704/3454/8718 6715/3465/8730 +s 2 +f 7042/3467/8731 7027/3451/8711 6701/3451/8714 6717/3467/8732 +s 4 +f 7030/3455/8716 7068/3493/8733 6743/3493/8734 6705/3455/8717 +f 7071/3494/8735 7070/3495/8736 6745/3495/8737 6744/3494/8738 +f 7068/3493/8733 7073/3498/8739 6748/3498/8740 6743/3493/8734 +f 7073/3498/8739 7075/3500/8741 6750/3500/8742 6748/3498/8740 +f 7075/3500/8741 7077/3502/8743 6752/3502/8744 6750/3500/8742 +f 7077/3502/8743 7071/3494/8735 6744/3494/8738 6752/3502/8744 +f 7070/3495/8736 7104/3529/8745 6779/3529/8746 6745/3495/8737 +f 7107/3530/8747 7106/3531/8748 6781/3531/8749 6780/3530/8750 +f 7104/3529/8745 7109/3534/8751 6784/3534/8752 6779/3529/8746 +f 7109/3534/8751 7111/3536/8753 6786/3536/8754 6784/3534/8752 +f 7111/3536/8753 7113/3538/8755 6788/3538/8756 6786/3536/8754 +f 7113/3538/8755 7107/3530/8747 6780/3530/8750 6788/3538/8756 +f 7106/3531/8748 7140/3565/8757 6815/3565/8758 6781/3531/8749 +f 7143/3566/8759 7142/3567/8760 6817/3567/8761 6816/3566/8762 +f 7142/3567/8760 7141/3568/8763 6818/3568/8764 6817/3567/8761 +f 7144/3569/8765 6986/3411/8683 6661/3411/8686 6819/3569/8766 +f 7140/3565/8757 7145/3570/8767 6820/3570/8768 6815/3565/8758 +f 7141/3568/8763 7146/3571/8769 6821/3571/8770 6818/3568/8764 +f 7145/3570/8767 7147/3572/8771 6822/3572/8772 6820/3570/8768 +f 7146/3571/8769 7148/3573/8773 6823/3573/8774 6821/3571/8770 +f 7147/3572/8771 7149/3574/8775 6824/3574/8776 6822/3572/8772 +f 7148/3573/8773 7150/3575/8777 6825/3575/8778 6823/3573/8774 +f 7149/3574/8775 7143/3566/8759 6816/3566/8762 6824/3574/8776 +f 7150/3575/8777 7144/3569/8765 6819/3569/8766 6825/3575/8778 +# 648 polygons + +# +# object lotu_petal_11 +# + +v -0.0524 0.0445 -0.2248 +v -0.0539 0.0346 -0.1710 +v -0.0005 0.0230 -0.1533 +v 0.0083 0.0330 -0.2058 +v -0.0438 0.0675 -0.2847 +v 0.0214 0.0478 -0.2636 +v -0.0356 0.0961 -0.3486 +v 0.0401 0.0734 -0.3269 +v -0.0288 0.1237 -0.4199 +v 0.0532 0.1069 -0.3949 +v -0.1159 0.0667 -0.2470 +v -0.1090 0.0521 -0.1910 +v -0.1118 0.0945 -0.3076 +v -0.1141 0.1216 -0.3707 +v -0.1033 0.1454 -0.4385 +v -0.1740 0.1023 -0.2628 +v -0.1634 0.0817 -0.2066 +v -0.1828 0.1231 -0.3236 +v -0.1884 0.1507 -0.3888 +v -0.1806 0.1799 -0.4610 +v -0.2322 0.1467 -0.2789 +v -0.2173 0.1207 -0.2183 +v -0.2512 0.1686 -0.3443 +v -0.2578 0.1945 -0.4135 +v -0.2607 0.2145 -0.4873 +v -0.0116 0.0185 -0.1081 +v 0.0272 0.0185 -0.0944 +v 0.0457 0.0233 -0.1358 +v 0.1406 0.0992 -0.3542 +v 0.1641 0.1348 -0.4255 +v 0.0824 0.1379 -0.4627 +v -0.2574 0.2358 -0.5639 +v -0.3479 0.2708 -0.5905 +v -0.3465 0.2535 -0.5109 +v -0.2610 0.1660 -0.2330 +v -0.2279 0.1469 -0.1707 +v -0.1814 0.1047 -0.1627 +v 0.0650 0.0337 -0.1840 +v -0.0015 0.1478 -0.4915 +v -0.3314 0.2406 -0.4336 +v -0.1363 0.0705 -0.1532 +v 0.0867 0.0464 -0.2350 +v -0.0857 0.1648 -0.5142 +v -0.3169 0.2156 -0.3609 +v -0.0944 0.0469 -0.1400 +v 0.1140 0.0684 -0.2925 +v -0.1690 0.2009 -0.5367 +v -0.2888 0.1898 -0.2939 +v -0.0545 0.0267 -0.1230 +v 0.0539 0.2133 -0.6540 +v 0.0285 0.1773 -0.5722 +v 0.1162 0.1695 -0.5354 +v 0.1504 0.2016 -0.6122 +v 0.0947 0.2605 -0.7306 +v 0.1864 0.2466 -0.6902 +v 0.1310 0.3205 -0.8195 +v 0.2321 0.3091 -0.7737 +v 0.1637 0.3820 -0.9015 +v 0.2635 0.3729 -0.8625 +v -0.0391 0.2418 -0.6730 +v -0.0627 0.2000 -0.5925 +v -0.0026 0.2786 -0.7638 +v 0.0279 0.3322 -0.8549 +v 0.0622 0.3965 -0.9369 +v -0.1309 0.2679 -0.6952 +v -0.1580 0.2342 -0.6169 +v -0.1042 0.2992 -0.7814 +v -0.0795 0.3517 -0.8710 +v -0.0425 0.4242 -0.9562 +v -0.2244 0.2852 -0.7291 +v -0.2490 0.2591 -0.6485 +v -0.2019 0.3346 -0.8111 +v -0.1810 0.3884 -0.8927 +v -0.1434 0.4649 -0.9712 +v 0.2027 0.1730 -0.5022 +v 0.3681 0.3795 -0.8092 +v 0.4030 0.4584 -0.8921 +v 0.3083 0.4427 -0.9457 +v -0.0974 0.5436 -1.0640 +v -0.2032 0.5786 -1.0802 +v -0.2473 0.4993 -0.9934 +v -0.3359 0.2905 -0.6689 +v 0.2420 0.2077 -0.5729 +v 0.2096 0.4512 -0.9851 +v -0.2858 0.4298 -0.9094 +v 0.2742 0.2529 -0.6482 +v 0.1080 0.4749 -1.0189 +v -0.3062 0.3718 -0.8264 +v 0.3229 0.3123 -0.7268 +v 0.0058 0.5088 -1.0458 +v -0.3154 0.3234 -0.7493 +v 0.3182 0.6755 -1.1615 +v 0.2668 0.5475 -1.0775 +v 0.3685 0.5460 -1.0293 +v 0.4174 0.6781 -1.1248 +v 0.3884 0.8240 -1.2452 +v 0.4824 0.8270 -1.2125 +v 0.4528 0.9928 -1.3110 +v 0.5413 0.9971 -1.2765 +v 0.5005 1.1601 -1.3794 +v 0.5827 1.1656 -1.3500 +v 0.2174 0.6992 -1.1951 +v 0.1616 0.5715 -1.1053 +v 0.2933 0.8424 -1.2737 +v 0.3569 0.9948 -1.3435 +v 0.4150 1.1556 -1.4045 +v 0.1169 0.7223 -1.2230 +v 0.0566 0.6034 -1.1280 +v 0.1944 0.8590 -1.3023 +v 0.2601 1.0111 -1.3645 +v 0.3288 1.1619 -1.4125 +v 0.0169 0.7430 -1.2331 +v -0.0480 0.6373 -1.1471 +v 0.0966 0.8801 -1.3212 +v 0.1635 1.0307 -1.3843 +v 0.2402 1.1829 -1.4262 +v 0.4698 0.5629 -0.9897 +v 0.6619 1.1651 -1.3133 +v 0.6900 1.3115 -1.3470 +v 0.6191 1.3186 -1.3860 +v 0.2911 1.3159 -1.4529 +v 0.2042 1.3318 -1.4533 +v 0.1504 1.2048 -1.4339 +v -0.1537 0.6743 -1.1692 +v 0.5173 0.6936 -1.0843 +v 0.5410 1.3151 -1.4146 +v 0.0700 1.0578 -1.3942 +v 0.5750 0.8344 -1.1718 +v 0.4598 1.3063 -1.4295 +v -0.0021 0.9091 -1.3292 +v 0.6259 0.9964 -1.2484 +v 0.3766 1.3061 -1.4414 +v -0.0819 0.7819 -1.2557 +v 0.5960 1.5738 -1.4145 +v 0.5636 1.4506 -1.4208 +v 0.6336 1.4506 -1.3947 +v 0.6580 1.5721 -1.3905 +v 0.6085 1.6876 -1.3987 +v 0.6611 1.6834 -1.3902 +v 0.6297 1.7869 -1.3785 +v 0.6718 1.7837 -1.3732 +v 0.6526 1.8721 -1.3487 +v 0.6807 1.8729 -1.3423 +v 0.5330 1.5684 -1.4345 +v 0.4955 1.4398 -1.4410 +v 0.5534 1.6841 -1.4135 +v 0.5836 1.7835 -1.3855 +v 0.6211 1.8702 -1.3570 +v 0.4686 1.5579 -1.4442 +v 0.4250 1.4366 -1.4514 +v 0.4976 1.6699 -1.4258 +v 0.5370 1.7761 -1.3902 +v 0.5893 1.8617 -1.3614 +v 0.4023 1.5526 -1.4548 +v 0.3505 1.4335 -1.4562 +v 0.4423 1.6607 -1.4338 +v 0.4935 1.7585 -1.4008 +v 0.5600 1.8510 -1.3677 +v 0.7013 1.4416 -1.3726 +v 0.7021 1.8727 -1.3378 +v 0.6891 1.9538 -1.3019 +v 0.6754 1.9520 -1.3080 +v 0.6179 1.9244 -1.3340 +v 0.6073 1.9088 -1.3425 +v 0.5344 1.8364 -1.3756 +v 0.2704 1.4462 -1.4541 +v 0.7169 1.5644 -1.3734 +v 0.6614 1.9479 -1.3143 +v 0.4551 1.7444 -1.4137 +v 0.7088 1.6776 -1.3768 +v 0.6469 1.9430 -1.3206 +v 0.3890 1.6523 -1.4351 +v 0.7061 1.7813 -1.3684 +v 0.6322 1.9355 -1.3273 +v 0.3336 1.5475 -1.4536 +v 0.3000 0.0876 -0.0484 +v 0.2472 0.0786 -0.0295 +v 0.2999 0.0987 0.0086 +v 0.3600 0.1088 -0.0161 +v 0.3546 0.0989 -0.0842 +v 0.4186 0.1208 -0.0510 +v 0.4084 0.1116 -0.1349 +v 0.4767 0.1359 -0.0915 +v 0.4586 0.1351 -0.1853 +v 0.5369 0.1618 -0.1364 +v 0.2415 0.0682 -0.0933 +v 0.1942 0.0564 -0.0618 +v 0.2903 0.0821 -0.1276 +v 0.3360 0.0974 -0.1697 +v 0.3766 0.1185 -0.2287 +v 0.1814 0.0531 -0.1273 +v 0.1417 0.0451 -0.0888 +v 0.2209 0.0647 -0.1726 +v 0.2580 0.0786 -0.2205 +v 0.3025 0.1065 -0.2706 +v 0.1224 0.0418 -0.1569 +v 0.0937 0.0305 -0.1132 +v 0.1512 0.0499 -0.2048 +v 0.1842 0.0683 -0.2588 +v 0.2240 0.1013 -0.3212 +v 0.2318 0.0963 0.0135 +v 0.2674 0.1248 0.0464 +v 0.3373 0.1350 0.0375 +v 0.6154 0.1865 -0.0847 +v 0.6855 0.2111 -0.1365 +v 0.5968 0.1795 -0.1898 +v 0.2525 0.1330 -0.3848 +v 0.0669 0.0229 -0.0752 +v 0.4066 0.1465 0.0167 +v 0.5133 0.1579 -0.2415 +v 0.1072 0.0382 -0.0534 +v 0.4779 0.1542 -0.0106 +v 0.4310 0.1512 -0.2916 +v 0.1486 0.0508 -0.0328 +v 0.5465 0.1746 -0.0419 +v 0.3423 0.1365 -0.3339 +v 0.1909 0.0707 -0.0105 +v 0.6168 0.2269 -0.3720 +v 0.5667 0.1959 -0.3006 +v 0.6544 0.2086 -0.2491 +v 0.7051 0.2461 -0.3104 +v 0.6594 0.2748 -0.4435 +v 0.7599 0.3032 -0.3771 +v 0.6979 0.3424 -0.5176 +v 0.7990 0.3710 -0.4471 +v 0.7399 0.4139 -0.5904 +v 0.8341 0.4395 -0.5242 +v 0.5220 0.2163 -0.4229 +v 0.4733 0.1765 -0.3573 +v 0.5602 0.2540 -0.4912 +v 0.6003 0.3151 -0.5724 +v 0.6483 0.3845 -0.6557 +v 0.4246 0.2144 -0.4733 +v 0.3808 0.1686 -0.4052 +v 0.4610 0.2572 -0.5419 +v 0.5046 0.3069 -0.6189 +v 0.5555 0.3723 -0.7039 +v 0.3281 0.2169 -0.5277 +v 0.2909 0.1694 -0.4512 +v 0.3669 0.2605 -0.5975 +v 0.4137 0.3124 -0.6723 +v 0.4651 0.3711 -0.7530 +v 0.7419 0.2437 -0.1848 +v 0.9404 0.4716 -0.4476 +v 0.9690 0.5503 -0.5350 +v 0.8811 0.5166 -0.6111 +v 0.5054 0.4562 -0.8435 +v 0.7993 0.2846 -0.2463 +v 0.7964 0.4851 -0.6721 +v 0.8512 0.3365 -0.3081 +v 0.7002 0.4609 -0.7417 +v 0.9024 0.3972 -0.3746 +v 0.6044 0.4552 -0.8010 +v 0.8871 0.7203 -0.8936 +v 0.8366 0.5844 -0.7795 +v 0.9230 0.6037 -0.7135 +v 0.9643 0.7389 -0.8119 +v 0.9159 0.8791 -0.9835 +v 0.9896 0.8823 -0.9193 +v 0.9473 1.0408 -1.0724 +v 1.0135 1.0424 -1.0110 +v 0.9608 1.1808 -1.1370 +v 1.0221 1.1923 -1.0813 +v 0.8019 0.7204 -0.9525 +v 0.7405 0.5776 -0.8352 +v 0.8354 0.8731 -1.0424 +v 0.8723 1.0285 -1.1202 +v 0.8905 1.1760 -1.1873 +v 0.7078 0.7111 -0.9982 +v 0.6510 0.5672 -0.8975 +v 0.7480 0.8609 -1.0843 +v 0.7902 1.0137 -1.1713 +v 0.8112 1.1663 -1.2377 +v 0.6106 0.7021 -1.0379 +v 0.5609 0.5626 -0.9479 +v 0.6647 0.8488 -1.1265 +v 0.7072 1.0048 -1.2140 +v 0.7356 1.1614 -1.2758 +v 1.0080 0.6414 -0.6321 +v 1.0744 1.1939 -1.0174 +v 1.0659 1.3308 -1.0653 +v 1.0079 1.3240 -1.1342 +v 0.7562 1.3043 -1.3064 +v 1.0361 0.7506 -0.7360 +v 0.9454 1.3142 -1.1905 +v 1.0532 0.8899 -0.8462 +v 0.8885 1.3084 -1.2289 +v 1.0686 1.0360 -0.9407 +v 0.8230 1.3060 -1.2649 +v 0.9141 1.5526 -1.2571 +v 0.9297 1.4342 -1.2249 +v 0.9844 1.4392 -1.1748 +v 0.9644 1.5545 -1.2137 +v 0.8794 1.6657 -1.2696 +v 0.9235 1.6598 -1.2352 +v 0.8459 1.7675 -1.2797 +v 0.8774 1.7578 -1.2529 +v 0.8067 1.8518 -1.2857 +v 0.8327 1.8444 -1.2700 +v 0.8697 1.5562 -1.2922 +v 0.8742 1.4357 -1.2656 +v 0.8368 1.6680 -1.3039 +v 0.8100 1.7674 -1.3082 +v 0.7796 1.8577 -1.3052 +v 0.8243 1.5527 -1.3221 +v 0.8204 1.4330 -1.3033 +v 0.7931 1.6655 -1.3342 +v 0.7719 1.7694 -1.3363 +v 0.7496 1.8638 -1.3212 +v 0.7718 1.5584 -1.3494 +v 0.7645 1.4341 -1.3384 +v 0.7519 1.6731 -1.3586 +v 0.7374 1.7784 -1.3560 +v 0.7229 1.8695 -1.3310 +v 1.0377 1.4494 -1.1121 +v 0.8535 1.8351 -1.2564 +v 0.7872 1.9120 -1.2702 +v 0.7658 1.9197 -1.2793 +v 0.7033 1.9512 -1.2970 +v 1.0074 1.5565 -1.1571 +v 0.7492 1.9287 -1.2836 +v 0.9633 1.6566 -1.1933 +v 0.7333 1.9377 -1.2872 +v 0.9076 1.7501 -1.2306 +v 0.7181 1.9456 -1.2925 +v -0.0007 0.0028 -0.1602 +v -0.0557 0.0144 -0.1767 +v -0.0514 0.0248 -0.2315 +v 0.0103 0.0130 -0.2135 +v -0.0442 0.0493 -0.2918 +v 0.0249 0.0280 -0.2709 +v -0.0390 0.0781 -0.3569 +v 0.0407 0.0551 -0.3354 +v -0.0308 0.1038 -0.4270 +v 0.0522 0.0881 -0.4035 +v -0.1138 0.0322 -0.1966 +v -0.1182 0.0485 -0.2535 +v -0.1164 0.0759 -0.3151 +v -0.1192 0.1023 -0.3813 +v -0.1071 0.1258 -0.4488 +v -0.1727 0.0657 -0.2105 +v -0.1814 0.0853 -0.2686 +v -0.1879 0.1053 -0.3312 +v -0.1961 0.1329 -0.3972 +v -0.1851 0.1609 -0.4680 +v -0.2289 0.1055 -0.2189 +v -0.2438 0.1298 -0.2829 +v -0.2606 0.1516 -0.3497 +v -0.2667 0.1768 -0.4187 +v -0.2666 0.1953 -0.4939 +v 0.0306 -0.0020 -0.1009 +v -0.0107 -0.0027 -0.1145 +v 0.0491 0.0021 -0.1418 +v 0.0827 0.1175 -0.4725 +v 0.1654 0.1157 -0.4336 +v 0.1411 0.0802 -0.3619 +v -0.3517 0.2517 -0.5978 +v -0.2587 0.2166 -0.5714 +v -0.3505 0.2350 -0.5151 +v -0.1933 0.0918 -0.1610 +v -0.2420 0.1336 -0.1680 +v -0.2748 0.1508 -0.2301 +v 0.0675 0.0139 -0.1904 +v -0.0008 0.1274 -0.5006 +v -0.3392 0.2222 -0.4349 +v -0.1477 0.0542 -0.1555 +v 0.0915 0.0267 -0.2428 +v -0.0876 0.1460 -0.5234 +v -0.3282 0.1982 -0.3617 +v -0.1017 0.0287 -0.1440 +v 0.1178 0.0495 -0.3001 +v -0.1720 0.1835 -0.5450 +v -0.3004 0.1738 -0.2925 +v -0.0571 0.0068 -0.1285 +v 0.1171 0.1509 -0.5435 +v 0.0291 0.1574 -0.5788 +v 0.0548 0.1951 -0.6631 +v 0.1521 0.1813 -0.6220 +v 0.0963 0.2425 -0.7409 +v 0.1923 0.2292 -0.7012 +v 0.1316 0.3030 -0.8307 +v 0.2336 0.2921 -0.7848 +v 0.1695 0.3634 -0.9162 +v 0.2675 0.3543 -0.8747 +v -0.0655 0.1824 -0.6028 +v -0.0381 0.2236 -0.6829 +v -0.0040 0.2609 -0.7730 +v 0.0277 0.3142 -0.8652 +v 0.0642 0.3813 -0.9506 +v -0.1595 0.2158 -0.6263 +v -0.1312 0.2480 -0.7049 +v -0.1082 0.2815 -0.7925 +v -0.0791 0.3348 -0.8821 +v -0.0421 0.4099 -0.9727 +v -0.2503 0.2394 -0.6551 +v -0.2267 0.2677 -0.7400 +v -0.2059 0.3185 -0.8244 +v -0.1803 0.3731 -0.9047 +v -0.1487 0.4507 -0.9868 +v 0.2059 0.1531 -0.5095 +v 0.3120 0.4274 -0.9595 +v 0.4087 0.4416 -0.9035 +v 0.3751 0.3626 -0.8180 +v -0.2068 0.5661 -1.0952 +v -0.1031 0.5291 -1.0795 +v -0.2516 0.4854 -1.0079 +v -0.3385 0.2716 -0.6775 +v 0.2464 0.1880 -0.5818 +v 0.2106 0.4362 -0.9990 +v -0.2864 0.4133 -0.9210 +v 0.2814 0.2357 -0.6592 +v 0.1064 0.4588 -1.0340 +v -0.3098 0.3557 -0.8383 +v 0.3309 0.2963 -0.7378 +v 0.0019 0.4931 -1.0608 +v -0.3201 0.3060 -0.7590 +v 0.3699 0.5319 -1.0440 +v 0.2656 0.5340 -1.0934 +v 0.3198 0.6639 -1.1761 +v 0.4192 0.6645 -1.1399 +v 0.3899 0.8141 -1.2627 +v 0.4855 0.8170 -1.2298 +v 0.4558 0.9856 -1.3276 +v 0.5474 0.9909 -1.2940 +v 0.5024 1.1542 -1.3984 +v 0.5863 1.1618 -1.3668 +v 0.1619 0.5563 -1.1205 +v 0.2188 0.6869 -1.2123 +v 0.2933 0.8314 -1.2911 +v 0.3584 0.9877 -1.3612 +v 0.4181 1.1524 -1.4234 +v 0.0557 0.5885 -1.1460 +v 0.1184 0.7098 -1.2392 +v 0.1942 0.8466 -1.3208 +v 0.2624 1.0058 -1.3831 +v 0.3314 1.1579 -1.4320 +v -0.0494 0.6261 -1.1614 +v 0.0157 0.7287 -1.2502 +v 0.0980 0.8725 -1.3407 +v 0.1668 1.0252 -1.4024 +v 0.2415 1.1785 -1.4461 +v 0.4717 0.5484 -1.0034 +v 0.6248 1.3151 -1.4042 +v 0.7004 1.3053 -1.3650 +v 0.6669 1.1582 -1.3310 +v 0.2035 1.3298 -1.4737 +v 0.2903 1.3148 -1.4733 +v 0.1500 1.2029 -1.4537 +v -0.1565 0.6603 -1.1841 +v 0.5206 0.6810 -1.1011 +v 0.5424 1.3129 -1.4348 +v 0.0719 1.0535 -1.4127 +v 0.5772 0.8225 -1.1886 +v 0.4615 1.3042 -1.4496 +v -0.0007 0.9014 -1.3473 +v 0.6315 0.9903 -1.2658 +v 0.3767 1.3038 -1.4611 +v -0.0852 0.7688 -1.2731 +v 0.6371 1.4467 -1.4148 +v 0.5682 1.4512 -1.4399 +v 0.5980 1.5765 -1.4337 +v 0.6614 1.5707 -1.4099 +v 0.6108 1.6894 -1.4186 +v 0.6642 1.6862 -1.4103 +v 0.6310 1.7917 -1.3976 +v 0.6743 1.7874 -1.3934 +v 0.6569 1.8803 -1.3678 +v 0.6863 1.8789 -1.3617 +v 0.4984 1.4421 -1.4610 +v 0.5336 1.5726 -1.4550 +v 0.5546 1.6882 -1.4330 +v 0.5844 1.7897 -1.4051 +v 0.6243 1.8788 -1.3765 +v 0.4258 1.4377 -1.4717 +v 0.4683 1.5610 -1.4645 +v 0.4976 1.6769 -1.4457 +v 0.5376 1.7823 -1.4102 +v 0.5914 1.8705 -1.3813 +v 0.3502 1.4354 -1.4767 +v 0.4015 1.5561 -1.4750 +v 0.4414 1.6652 -1.4543 +v 0.4935 1.7651 -1.4206 +v 0.5614 1.8608 -1.3867 +v 0.7092 1.4390 -1.3908 +v 0.6813 1.9599 -1.3240 +v 0.6962 1.9608 -1.3178 +v 0.7093 1.8782 -1.3572 +v 0.6092 1.9194 -1.3608 +v 0.6225 1.9323 -1.3530 +v 0.5364 1.8446 -1.3947 +v 0.2701 1.4466 -1.4747 +v 0.7239 1.5642 -1.3927 +v 0.6664 1.9554 -1.3312 +v 0.4549 1.7513 -1.4330 +v 0.7140 1.6792 -1.3963 +v 0.6515 1.9499 -1.3385 +v 0.3877 1.6561 -1.4556 +v 0.7109 1.7833 -1.3872 +v 0.6368 1.9427 -1.3459 +v 0.3325 1.5511 -1.4743 +v 0.3045 0.0811 0.0183 +v 0.2537 0.0585 -0.0225 +v 0.3071 0.0676 -0.0451 +v 0.3685 0.0898 -0.0080 +v 0.3631 0.0788 -0.0817 +v 0.4255 0.1020 -0.0489 +v 0.4158 0.0914 -0.1353 +v 0.4860 0.1163 -0.0910 +v 0.4667 0.1155 -0.1886 +v 0.5449 0.1420 -0.1370 +v 0.2009 0.0365 -0.0614 +v 0.2476 0.0490 -0.0928 +v 0.2967 0.0621 -0.1284 +v 0.3406 0.0774 -0.1718 +v 0.3836 0.1004 -0.2313 +v 0.1483 0.0247 -0.0910 +v 0.1874 0.0329 -0.1313 +v 0.2261 0.0453 -0.1776 +v 0.2648 0.0591 -0.2229 +v 0.3075 0.0874 -0.2744 +v 0.0997 0.0102 -0.1158 +v 0.1268 0.0214 -0.1628 +v 0.1568 0.0291 -0.2124 +v 0.1914 0.0495 -0.2664 +v 0.2273 0.0822 -0.3269 +v 0.2743 0.1085 0.0596 +v 0.2379 0.0776 0.0241 +v 0.3454 0.1178 0.0477 +v 0.6039 0.1595 -0.1914 +v 0.6925 0.1925 -0.1357 +v 0.6214 0.1667 -0.0853 +v 0.2551 0.1140 -0.3917 +v 0.0728 0.0026 -0.0771 +v 0.4154 0.1290 0.0233 +v 0.5189 0.1388 -0.2451 +v 0.1139 0.0188 -0.0558 +v 0.4852 0.1345 -0.0066 +v 0.4356 0.1308 -0.2965 +v 0.1556 0.0309 -0.0320 +v 0.5537 0.1559 -0.0403 +v 0.3477 0.1165 -0.3386 +v 0.1977 0.0527 -0.0065 +v 0.6621 0.1900 -0.2516 +v 0.5761 0.1767 -0.3061 +v 0.6237 0.2080 -0.3759 +v 0.7156 0.2286 -0.3151 +v 0.6675 0.2591 -0.4491 +v 0.7662 0.2879 -0.3800 +v 0.7074 0.3262 -0.5248 +v 0.8065 0.3538 -0.4541 +v 0.7503 0.3982 -0.5990 +v 0.8419 0.4255 -0.5339 +v 0.4795 0.1579 -0.3631 +v 0.5277 0.1970 -0.4305 +v 0.5681 0.2373 -0.5024 +v 0.6092 0.2995 -0.5832 +v 0.6592 0.3680 -0.6676 +v 0.3839 0.1511 -0.4123 +v 0.4304 0.1960 -0.4829 +v 0.4691 0.2374 -0.5537 +v 0.5121 0.2886 -0.6280 +v 0.5663 0.3566 -0.7168 +v 0.2941 0.1511 -0.4571 +v 0.3351 0.1984 -0.5350 +v 0.3747 0.2436 -0.6084 +v 0.4212 0.2949 -0.6825 +v 0.4728 0.3550 -0.7647 +v 0.7510 0.2245 -0.1872 +v 0.8909 0.5008 -0.6196 +v 0.9814 0.5362 -0.5423 +v 0.9503 0.4559 -0.4544 +v 0.5111 0.4414 -0.8542 +v 0.8069 0.2676 -0.2498 +v 0.8052 0.4708 -0.6822 +v 0.8599 0.3214 -0.3153 +v 0.7088 0.4465 -0.7523 +v 0.9107 0.3811 -0.3815 +v 0.6108 0.4413 -0.8106 +v 0.9373 0.5910 -0.7244 +v 0.8456 0.5723 -0.7917 +v 0.8983 0.7089 -0.9031 +v 0.9780 0.7276 -0.8238 +v 0.9303 0.8717 -0.9976 +v 1.0045 0.8710 -0.9296 +v 0.9618 1.0295 -1.0866 +v 1.0301 1.0327 -1.0239 +v 0.9749 1.1704 -1.1532 +v 1.0385 1.1852 -1.0957 +v 0.7503 0.5656 -0.8479 +v 0.8100 0.7091 -0.9658 +v 0.8469 0.8624 -1.0583 +v 0.8827 1.0166 -1.1379 +v 0.9017 1.1658 -1.2027 +v 0.6575 0.5558 -0.9096 +v 0.7138 0.7008 -1.0125 +v 0.7571 0.8480 -1.1020 +v 0.7989 1.0034 -1.1853 +v 0.8211 1.1582 -1.2531 +v 0.5661 0.5474 -0.9630 +v 0.6187 0.6899 -1.0537 +v 0.6712 0.8355 -1.1430 +v 0.7134 0.9949 -1.2295 +v 0.7435 1.1525 -1.2943 +v 1.0202 0.6280 -0.6421 +v 1.0229 1.3158 -1.1463 +v 1.0825 1.3258 -1.0760 +v 1.0892 1.1886 -1.0288 +v 0.7675 1.2975 -1.3225 +v 1.0497 0.7370 -0.7447 +v 0.9597 1.3066 -1.2080 +v 1.0689 0.8785 -0.8582 +v 0.9017 1.3020 -1.2487 +v 1.0844 1.0280 -0.9555 +v 0.8338 1.2994 -1.2834 +v 0.9986 1.4337 -1.1890 +v 0.9428 1.4289 -1.2397 +v 0.9280 1.5507 -1.2744 +v 0.9777 1.5507 -1.2262 +v 0.8923 1.6669 -1.2858 +v 0.9364 1.6580 -1.2479 +v 0.8593 1.7692 -1.2944 +v 0.8921 1.7609 -1.2700 +v 0.8192 1.8560 -1.2991 +v 0.8445 1.8498 -1.2847 +v 0.8889 1.4321 -1.2839 +v 0.8849 1.5557 -1.3095 +v 0.8486 1.6690 -1.3191 +v 0.8214 1.7705 -1.3230 +v 0.7888 1.8610 -1.3194 +v 0.8327 1.4288 -1.3208 +v 0.8356 1.5521 -1.3398 +v 0.8061 1.6674 -1.3518 +v 0.7832 1.7731 -1.3523 +v 0.7582 1.8684 -1.3379 +v 0.7755 1.4328 -1.3554 +v 0.7813 1.5598 -1.3676 +v 0.7617 1.6761 -1.3778 +v 0.7462 1.7804 -1.3753 +v 0.7310 1.8760 -1.3499 +v 1.0529 1.4419 -1.1241 +v 0.7744 1.9202 -1.2959 +v 0.7919 1.9064 -1.2899 +v 0.8667 1.8370 -1.2741 +v 0.7113 1.9574 -1.3134 +v 1.0243 1.5527 -1.1692 +v 0.7575 1.9317 -1.3003 +v 0.9775 1.6557 -1.2060 +v 0.7418 1.9422 -1.3037 +v 0.9206 1.7487 -1.2473 +v 0.7264 1.9507 -1.3082 +# 650 vertices + +vn 0.2279 0.9736 0.0160 +vn 0.2066 0.9734 -0.0986 +vn 0.0576 0.9967 -0.0567 +vn 0.0698 0.9971 0.0303 +vn 0.2760 0.9547 0.1111 +vn 0.1186 0.9874 0.1049 +vn 0.2737 0.9542 0.1204 +vn 0.1235 0.9731 0.1944 +vn 0.2262 0.9685 0.1045 +vn 0.0986 0.9714 0.2159 +vn 0.3699 0.9284 -0.0358 +vn 0.3414 0.9121 -0.2272 +vn 0.3382 0.9365 0.0928 +vn 0.3259 0.9424 0.0754 +vn 0.3205 0.9468 0.0274 +vn 0.5034 0.8447 -0.1816 +vn 0.4593 0.8305 -0.3150 +vn 0.4419 0.8954 -0.0553 +vn 0.4054 0.9140 0.0170 +vn 0.3551 0.9345 0.0237 +vn 0.5413 0.8036 -0.2473 +vn 0.5419 0.7086 -0.4519 +vn 0.5117 0.8370 -0.1941 +vn 0.4684 0.8737 -0.1316 +vn 0.3657 0.9281 -0.0706 +vn 0.0513 0.9946 -0.0907 +vn -0.0940 0.9930 -0.0717 +vn -0.1093 0.9939 -0.0166 +vn -0.0123 0.9675 0.2524 +vn -0.0242 0.9689 0.2462 +vn 0.0422 0.9777 0.2057 +vn 0.3246 0.9453 -0.0317 +vn 0.3314 0.9417 -0.0586 +vn 0.3840 0.9072 -0.1718 +vn 0.5795 0.6296 -0.5175 +vn 0.5209 0.6638 -0.5367 +vn 0.4683 0.6766 -0.5682 +vn -0.1057 0.9935 0.0422 +vn 0.1617 0.9765 0.1427 +vn 0.4710 0.8377 -0.2765 +vn 0.4051 0.7889 -0.4621 +vn -0.0631 0.9931 0.0987 +vn 0.2847 0.9543 0.0903 +vn 0.5254 0.8151 -0.2443 +vn 0.3682 0.8406 -0.3973 +vn -0.0218 0.9794 0.2005 +vn 0.3375 0.9408 0.0317 +vn 0.5410 0.7711 -0.3356 +vn 0.1995 0.9697 -0.1407 +vn 0.1719 0.9574 0.2322 +vn 0.1601 0.9708 0.1784 +vn 0.0044 0.9794 0.2018 +vn -0.0019 0.9681 0.2507 +vn 0.1138 0.9360 0.3331 +vn -0.0074 0.9377 0.3473 +vn 0.0847 0.9147 0.3952 +vn -0.0219 0.9151 0.4027 +vn 0.1047 0.8958 0.4320 +vn -0.0156 0.9036 0.4281 +vn 0.2787 0.9433 0.1804 +vn 0.2784 0.9418 0.1882 +vn 0.2190 0.9432 0.2498 +vn 0.1974 0.9077 0.3703 +vn 0.2199 0.8653 0.4504 +vn 0.2383 0.9555 0.1740 +vn 0.2683 0.9525 0.1444 +vn 0.2853 0.9379 0.1974 +vn 0.3183 0.8798 0.3530 +vn 0.3569 0.8271 0.4342 +vn 0.2739 0.9422 0.1928 +vn 0.2942 0.9545 0.0492 +vn 0.3317 0.9031 0.2727 +vn 0.3694 0.8507 0.3739 +vn 0.3752 0.8132 0.4448 +vn -0.0522 0.9713 0.2322 +vn -0.0879 0.8836 0.4600 +vn -0.1070 0.8428 0.5276 +vn -0.0623 0.8561 0.5131 +vn 0.3733 0.7919 0.4833 +vn 0.3666 0.7989 0.4768 +vn 0.3557 0.8190 0.4503 +vn 0.3274 0.9433 0.0551 +vn -0.1066 0.9519 0.2873 +vn 0.1363 0.8613 0.4894 +vn 0.4028 0.8448 0.3523 +vn -0.1184 0.9278 0.3539 +vn 0.2466 0.8210 0.5150 +vn 0.3856 0.8781 0.2831 +vn -0.1012 0.9109 0.3999 +vn 0.3349 0.7908 0.5123 +vn 0.3744 0.9103 0.1766 +vn 0.1033 0.7174 0.6889 +vn 0.1100 0.7851 0.6095 +vn -0.0698 0.7910 0.6078 +vn -0.0259 0.7345 0.6781 +vn 0.1078 0.6561 0.7469 +vn -0.0041 0.6571 0.7538 +vn 0.0535 0.5882 0.8069 +vn 0.0418 0.5979 0.8005 +vn 0.0813 0.5141 0.8539 +vn 0.0233 0.5188 0.8546 +vn 0.2111 0.7050 0.6771 +vn 0.2667 0.7682 0.5820 +vn 0.1932 0.6444 0.7398 +vn 0.1797 0.5802 0.7944 +vn 0.2112 0.4857 0.8482 +vn 0.2944 0.7088 0.6410 +vn 0.3328 0.7558 0.5640 +vn 0.2376 0.6306 0.7388 +vn 0.2551 0.5469 0.7974 +vn 0.3126 0.4599 0.8311 +vn 0.3558 0.7021 0.6168 +vn 0.3524 0.7507 0.5587 +vn 0.3503 0.6106 0.7103 +vn 0.3255 0.5112 0.7954 +vn 0.3442 0.4222 0.8386 +vn -0.0595 0.8014 0.5951 +vn -0.0272 0.5010 0.8650 +vn -0.0611 0.3879 0.9197 +vn 0.0056 0.3617 0.9323 +vn 0.3702 0.3037 0.8779 +vn 0.4134 0.2856 0.8646 +vn 0.3724 0.3974 0.8387 +vn 0.3541 0.7530 0.5546 +vn -0.0794 0.7306 0.6782 +vn 0.1312 0.3684 0.9204 +vn 0.3820 0.4957 0.7800 +vn -0.0757 0.6682 0.7401 +vn 0.2361 0.3595 0.9028 +vn 0.3951 0.6014 0.6944 +vn 0.0078 0.6097 0.7926 +vn 0.2987 0.3391 0.8921 +vn 0.3471 0.6953 0.6294 +vn 0.1030 0.1426 0.9844 +vn 0.1035 0.2431 0.9645 +vn 0.0819 0.2609 0.9619 +vn 0.1235 0.1827 0.9754 +vn 0.2158 0.0574 0.9748 +vn 0.2153 0.1095 0.9704 +vn 0.2867 -0.0412 0.9571 +vn 0.2735 -0.0336 0.9613 +vn 0.2149 -0.1591 0.9636 +vn 0.2228 -0.1789 0.9583 +vn 0.2100 0.1241 0.9698 +vn 0.2165 0.2422 0.9458 +vn 0.2346 -0.0050 0.9721 +vn 0.3251 -0.0656 0.9434 +vn 0.2941 -0.1647 0.9415 +vn 0.2884 0.1138 0.9507 +vn 0.3104 0.2395 0.9199 +vn 0.2995 -0.0230 0.9538 +vn 0.3250 -0.0828 0.9421 +vn 0.3556 -0.1600 0.9208 +vn 0.3694 0.0922 0.9247 +vn 0.3932 0.2105 0.8950 +vn 0.3625 -0.0187 0.9318 +vn 0.2430 -0.0435 0.9691 +vn 0.3108 -0.1143 0.9436 +vn 0.0387 0.3072 0.9509 +vn 0.1432 -0.1932 0.9706 +vn 0.0673 -0.2610 0.9630 +vn 0.1189 -0.2432 0.9627 +vn 0.2241 -0.1314 0.9657 +vn -0.7153 0.5508 -0.4301 +vn 0.2601 -0.0474 0.9644 +vn 0.4376 0.1777 0.8814 +vn 0.0790 0.2113 0.9742 +vn 0.1524 -0.2173 0.9641 +vn 0.2207 -0.0154 0.9752 +vn 0.1020 0.1317 0.9860 +vn 0.1719 -0.2009 0.9644 +vn 0.4335 -0.0268 0.9007 +vn 0.1649 -0.0177 0.9862 +vn 0.2204 -0.1965 0.9554 +vn 0.4439 0.1043 0.8900 +vn -0.3183 0.9323 -0.1716 +vn -0.3516 0.8839 -0.3085 +vn -0.4158 0.7829 -0.4628 +vn -0.4577 0.8339 -0.3085 +vn -0.3001 0.9482 -0.1038 +vn -0.4167 0.8842 -0.2109 +vn -0.2855 0.9584 -0.0025 +vn -0.4080 0.9104 -0.0678 +vn -0.2740 0.9588 0.0756 +vn -0.3446 0.9381 -0.0361 +vn -0.3049 0.9483 -0.0886 +vn -0.3206 0.9305 -0.1770 +vn -0.2818 0.9588 -0.0360 +vn -0.2438 0.9690 0.0404 +vn -0.2107 0.9687 0.1314 +vn -0.2412 0.9687 -0.0589 +vn -0.2685 0.9583 -0.0980 +vn -0.2422 0.9702 0.0002 +vn -0.2197 0.9698 0.1063 +vn -0.1834 0.9655 0.1847 +vn -0.1967 0.9803 -0.0154 +vn -0.2526 0.9673 -0.0244 +vn -0.1540 0.9874 0.0365 +vn -0.1187 0.9795 0.1626 +vn -0.0986 0.9650 0.2431 +vn -0.3718 0.7714 -0.5164 +vn -0.4134 0.6436 -0.6441 +vn -0.5314 0.6702 -0.5181 +vn -0.3243 0.9422 -0.0839 +vn -0.3674 0.9285 0.0535 +vn -0.2976 0.9536 0.0452 +vn -0.0742 0.9658 0.2485 +vn -0.2563 0.9649 -0.0564 +vn -0.5010 0.7696 -0.3958 +vn -0.2416 0.9634 0.1163 +vn -0.3250 0.9401 -0.1025 +vn -0.4506 0.8575 -0.2482 +vn -0.1685 0.9749 0.1458 +vn -0.3214 0.9272 -0.1922 +vn -0.4052 0.9042 -0.1350 +vn -0.1422 0.9693 0.2007 +vn -0.4138 0.8455 -0.3376 +vn -0.2140 0.9472 0.2387 +vn -0.2202 0.9579 0.1843 +vn -0.3023 0.9419 0.1464 +vn -0.3409 0.9035 0.2598 +vn -0.2628 0.8826 0.3897 +vn -0.3502 0.8484 0.3970 +vn -0.3025 0.8346 0.4604 +vn -0.3201 0.8282 0.4599 +vn -0.3251 0.8407 0.4331 +vn -0.3271 0.8313 0.4494 +vn -0.1263 0.9579 0.2580 +vn -0.1650 0.9626 0.2147 +vn -0.1236 0.9350 0.3324 +vn -0.1881 0.8899 0.4156 +vn -0.2416 0.8668 0.4362 +vn -0.0771 0.9442 0.3203 +vn -0.0998 0.9613 0.2566 +vn -0.0529 0.9447 0.3238 +vn -0.0729 0.9268 0.3684 +vn -0.1086 0.8925 0.4377 +vn -0.1021 0.9405 0.3242 +vn -0.0714 0.9581 0.2775 +vn -0.0952 0.9364 0.3378 +vn -0.0653 0.9287 0.3651 +vn -0.0537 0.8939 0.4449 +vn -0.3948 0.9061 0.1522 +vn -0.3547 0.7987 0.4860 +vn -0.4271 0.7620 0.4867 +vn -0.3780 0.8030 0.4608 +vn -0.0269 0.8584 0.5122 +vn -0.3913 0.8838 0.2566 +vn -0.3184 0.8225 0.4712 +vn -0.3573 0.8569 0.3715 +vn -0.2434 0.8196 0.5187 +vn -0.3124 0.8406 0.4424 +vn -0.0930 0.8514 0.5162 +vn -0.2887 0.6773 0.6767 +vn -0.2302 0.8020 0.5512 +vn -0.3880 0.7465 0.5405 +vn -0.4015 0.6450 0.6502 +vn -0.2620 0.6160 0.7429 +vn -0.3466 0.6121 0.7107 +vn -0.2543 0.5632 0.7862 +vn -0.3652 0.5206 0.7718 +vn -0.2714 0.4437 0.8541 +vn -0.3878 0.3904 0.8350 +vn -0.1309 0.7237 0.6776 +vn -0.1902 0.7745 0.6033 +vn -0.1660 0.6383 0.7516 +vn -0.1988 0.5789 0.7908 +vn -0.1832 0.4646 0.8664 +vn -0.0874 0.7253 0.6828 +vn -0.1566 0.7601 0.6306 +vn -0.1106 0.6653 0.7383 +vn -0.1405 0.5986 0.7887 +vn -0.1236 0.4695 0.8742 +vn -0.0803 0.7226 0.6866 +vn -0.0683 0.7851 0.6156 +vn -0.1128 0.6714 0.7325 +vn -0.0710 0.6095 0.7896 +vn -0.0568 0.4908 0.8694 +vn -0.4500 0.7103 0.5413 +vn -0.4362 0.3843 0.8137 +vn -0.4333 0.2637 0.8618 +vn -0.3766 0.2817 0.8825 +vn -0.1075 0.3921 0.9136 +vn -0.3897 0.6806 0.6205 +vn -0.2510 0.3392 0.9066 +vn -0.4130 0.5886 0.6950 +vn -0.1433 0.3821 0.9129 +vn -0.4106 0.5198 0.7491 +vn -0.1150 0.3917 0.9129 +vn -0.2548 0.1704 0.9518 +vn -0.2573 0.2857 0.9231 +vn -0.3691 0.2410 0.8976 +vn -0.3663 0.1209 0.9226 +vn -0.2365 0.0419 0.9707 +vn -0.3064 0.0090 0.9519 +vn -0.2593 -0.0449 0.9648 +vn -0.2613 -0.0171 0.9651 +vn -0.1957 -0.1741 0.9651 +vn -0.2025 -0.1434 0.9687 +vn -0.1937 0.1890 0.9627 +vn -0.1901 0.3156 0.9297 +vn -0.2011 0.0544 0.9781 +vn -0.2040 -0.0213 0.9787 +vn -0.1577 -0.1827 0.9704 +vn -0.1056 0.2270 0.9681 +vn -0.1429 0.3376 0.9304 +vn -0.1310 0.0906 0.9872 +vn -0.1427 -0.0161 0.9896 +vn -0.0428 -0.1696 0.9846 +vn -0.0165 0.2300 0.9731 +vn -0.0837 0.3332 0.9391 +vn -0.0304 0.1227 0.9920 +vn -0.0319 -0.0261 0.9992 +vn 0.0389 -0.1867 0.9817 +vn -0.4337 0.2038 0.8777 +vn -0.1940 -0.0232 0.9807 +vn -0.0379 -0.0666 0.9971 +vn 0.0610 -0.0281 0.9977 +vn 0.0199 -0.2691 0.9629 +vn -0.4552 0.0988 0.8849 +vn 0.0388 -0.1259 0.9913 +vn -0.3561 0.0409 0.9336 +vn -0.1009 -0.2800 0.9547 +vn -0.2081 0.0938 0.9736 +vn -0.0469 -0.2832 0.9579 +vn -0.0670 -0.9964 0.0514 +vn -0.2080 -0.9741 0.0886 +vn -0.2317 -0.9724 -0.0278 +vn -0.0747 -0.9965 -0.0374 +vn -0.2717 -0.9557 -0.1132 +vn -0.1202 -0.9864 -0.1117 +vn -0.2610 -0.9583 -0.1161 +vn -0.1263 -0.9724 -0.1960 +vn -0.2193 -0.9707 -0.0983 +vn -0.0982 -0.9744 -0.2022 +vn -0.3465 -0.9132 0.2145 +vn -0.3673 -0.9298 0.0218 +vn -0.3353 -0.9393 -0.0732 +vn -0.3224 -0.9444 -0.0639 +vn -0.3212 -0.9463 -0.0356 +vn -0.4639 -0.8309 0.3072 +vn -0.4916 -0.8544 0.1684 +vn -0.4383 -0.8967 0.0628 +vn -0.4136 -0.9104 -0.0007 +vn -0.3606 -0.9321 -0.0338 +vn -0.5289 -0.7171 0.4539 +vn -0.5368 -0.8045 0.2543 +vn -0.5064 -0.8428 0.1826 +vn -0.4731 -0.8699 0.1399 +vn -0.3712 -0.9259 0.0705 +vn 0.0927 -0.9927 0.0766 +vn -0.0492 -0.9959 0.0760 +vn 0.1085 -0.9940 0.0115 +vn -0.0357 -0.9776 -0.2075 +vn 0.0311 -0.9691 -0.2448 +vn 0.0139 -0.9677 -0.2519 +vn -0.3312 -0.9417 0.0587 +vn -0.3191 -0.9475 0.0229 +vn -0.3975 -0.8989 0.1843 +vn -0.4647 -0.6587 0.5918 +vn -0.4996 -0.6830 0.5328 +vn -0.5682 -0.6596 0.4920 +vn 0.1032 -0.9935 -0.0487 +vn -0.1666 -0.9758 -0.1416 +vn -0.4781 -0.8399 0.2568 +vn -0.4088 -0.7990 0.4410 +vn 0.0543 -0.9933 -0.1024 +vn -0.2925 -0.9514 -0.0966 +vn -0.5243 -0.8182 0.2357 +vn -0.3630 -0.8448 0.3931 +vn 0.0154 -0.9776 -0.2101 +vn -0.3408 -0.9395 -0.0356 +vn -0.5449 -0.7592 0.3559 +vn -0.2106 -0.9656 0.1525 +vn -0.0070 -0.9794 -0.2020 +vn -0.1583 -0.9691 -0.1892 +vn -0.1782 -0.9566 -0.2307 +vn -0.0081 -0.9696 -0.2444 +vn -0.1202 -0.9356 -0.3321 +vn 0.0083 -0.9339 -0.3576 +vn -0.0892 -0.9187 -0.3848 +vn 0.0200 -0.9179 -0.3963 +vn -0.1086 -0.8969 -0.4288 +vn 0.0267 -0.9021 -0.4308 +vn -0.2785 -0.9412 -0.1913 +vn -0.2708 -0.9447 -0.1847 +vn -0.2185 -0.9436 -0.2487 +vn -0.1982 -0.9091 -0.3665 +vn -0.2265 -0.8675 -0.4428 +vn -0.2704 -0.9534 -0.1338 +vn -0.2387 -0.9559 -0.1710 +vn -0.2838 -0.9365 -0.2062 +vn -0.3195 -0.8808 -0.3494 +vn -0.3517 -0.8313 -0.4304 +vn -0.2905 -0.9556 -0.0487 +vn -0.2793 -0.9410 -0.1910 +vn -0.3369 -0.8987 -0.2808 +vn -0.3693 -0.8497 -0.3763 +vn -0.3796 -0.8160 -0.4358 +vn 0.0559 -0.9729 -0.2244 +vn 0.0598 -0.8520 -0.5202 +vn 0.1094 -0.8404 -0.5308 +vn 0.0883 -0.8833 -0.4605 +vn -0.3812 -0.7948 -0.4723 +vn -0.3787 -0.7868 -0.4873 +vn -0.3596 -0.8193 -0.4467 +vn -0.3239 -0.9443 -0.0589 +vn 0.1132 -0.9516 -0.2856 +vn -0.1311 -0.8550 -0.5018 +vn -0.3993 -0.8451 -0.3555 +vn 0.1179 -0.9255 -0.3599 +vn -0.2454 -0.8224 -0.5133 +vn -0.3917 -0.8757 -0.2823 +vn 0.0984 -0.9103 -0.4021 +vn -0.3404 -0.7912 -0.5081 +vn -0.3744 -0.9100 -0.1780 +vn 0.0663 -0.7875 -0.6127 +vn -0.1091 -0.7831 -0.6123 +vn -0.0988 -0.7169 -0.6901 +vn 0.0154 -0.7367 -0.6761 +vn -0.1100 -0.6548 -0.7477 +vn -0.0009 -0.6539 -0.7566 +vn -0.0586 -0.5867 -0.8077 +vn -0.0456 -0.5937 -0.8034 +vn -0.0758 -0.5153 -0.8537 +vn -0.0246 -0.5182 -0.8549 +vn -0.2564 -0.7688 -0.5858 +vn -0.2028 -0.7057 -0.6788 +vn -0.1843 -0.6431 -0.7433 +vn -0.1758 -0.5781 -0.7968 +vn -0.2102 -0.4865 -0.8480 +vn -0.3423 -0.7533 -0.5616 +vn -0.2893 -0.7071 -0.6452 +vn -0.2379 -0.6284 -0.7406 +vn -0.2542 -0.5439 -0.7997 +vn -0.3072 -0.4609 -0.8326 +vn -0.3622 -0.7493 -0.5545 +vn -0.3570 -0.7028 -0.6154 +vn -0.3578 -0.6026 -0.7134 +vn -0.3276 -0.5074 -0.7970 +vn -0.3459 -0.4245 -0.8367 +vn 0.0516 -0.8039 -0.5925 +vn -0.0199 -0.3687 -0.9293 +vn 0.0529 -0.3887 -0.9199 +vn -0.0002 -0.5100 -0.8602 +vn -0.4134 -0.2871 -0.8641 +vn -0.3680 -0.3034 -0.8789 +vn -0.3777 -0.3994 -0.8353 +vn -0.3435 -0.7566 -0.5564 +vn 0.0692 -0.7314 -0.6784 +vn -0.1295 -0.3693 -0.9202 +vn -0.3831 -0.4912 -0.7823 +vn 0.0640 -0.6665 -0.7427 +vn -0.2399 -0.3590 -0.9020 +vn -0.4039 -0.5920 -0.6974 +vn -0.0132 -0.6038 -0.7970 +vn -0.2988 -0.3400 -0.8917 +vn -0.3461 -0.6987 -0.6261 +vn -0.0863 -0.2586 -0.9621 +vn -0.1055 -0.2410 -0.9648 +vn -0.1025 -0.1395 -0.9849 +vn -0.1324 -0.1849 -0.9738 +vn -0.2210 -0.0605 -0.9734 +vn -0.2206 -0.1091 -0.9692 +vn -0.2893 0.0350 -0.9566 +vn -0.2680 0.0313 -0.9629 +vn -0.2080 0.1653 -0.9641 +vn -0.2200 0.1835 -0.9581 +vn -0.2154 -0.2400 -0.9466 +vn -0.2064 -0.1205 -0.9710 +vn -0.2280 0.0019 -0.9737 +vn -0.3162 0.0565 -0.9470 +vn -0.2836 0.1654 -0.9446 +vn -0.3103 -0.2388 -0.9202 +vn -0.2919 -0.1143 -0.9496 +vn -0.2964 0.0258 -0.9547 +vn -0.3221 0.0783 -0.9435 +vn -0.3607 0.1672 -0.9176 +vn -0.3912 -0.2113 -0.8957 +vn -0.3679 -0.0930 -0.9252 +vn -0.3645 0.0192 -0.9310 +vn -0.2510 0.0482 -0.9668 +vn -0.3397 0.1392 -0.9302 +vn -0.0357 -0.3031 -0.9523 +vn -0.1123 0.2668 -0.9572 +vn -0.0729 0.2851 -0.9557 +vn -0.1539 0.1960 -0.9685 +vn 0.1756 -0.2625 -0.9488 +vn -0.1879 0.1201 -0.9748 +vn -0.2731 0.0565 -0.9603 +vn -0.4372 -0.1792 -0.8813 +vn -0.0838 -0.2126 -0.9735 +vn -0.1333 0.2386 -0.9619 +vn -0.2326 0.0228 -0.9723 +vn -0.1128 -0.1322 -0.9848 +vn -0.1409 0.2156 -0.9662 +vn -0.4333 0.0258 -0.9009 +vn -0.1734 0.0094 -0.9848 +vn -0.1795 0.1985 -0.9635 +vn -0.4385 -0.1055 -0.8925 +vn 0.4166 -0.7810 0.4652 +vn 0.3436 -0.8867 0.3095 +vn 0.3170 -0.9316 0.1778 +vn 0.4692 -0.8269 0.3100 +vn 0.3052 -0.9467 0.1031 +vn 0.4194 -0.8841 0.2060 +vn 0.2821 -0.9594 0.0016 +vn 0.4105 -0.9091 0.0710 +vn 0.2695 -0.9597 -0.0792 +vn 0.3471 -0.9372 0.0342 +vn 0.3210 -0.9309 0.1743 +vn 0.3010 -0.9501 0.0823 +vn 0.2747 -0.9609 0.0361 +vn 0.2424 -0.9689 -0.0506 +vn 0.2054 -0.9702 -0.1283 +vn 0.2659 -0.9586 0.1018 +vn 0.2500 -0.9668 0.0530 +vn 0.2478 -0.9688 -0.0044 +vn 0.2232 -0.9686 -0.1093 +vn 0.1852 -0.9655 -0.1833 +vn 0.2559 -0.9664 0.0244 +vn 0.1879 -0.9820 0.0195 +vn 0.1545 -0.9870 -0.0441 +vn 0.1245 -0.9758 -0.1797 +vn 0.1018 -0.9634 -0.2479 +vn 0.4261 -0.6558 0.6232 +vn 0.3595 -0.7781 0.5150 +vn 0.5318 -0.6730 0.5140 +vn 0.3022 -0.9521 -0.0465 +vn 0.3704 -0.9276 -0.0493 +vn 0.3312 -0.9395 0.0875 +vn 0.0759 -0.9654 -0.2495 +vn 0.2681 -0.9615 0.0605 +vn 0.5128 -0.7679 0.3839 +vn 0.2397 -0.9638 -0.1164 +vn 0.3194 -0.9406 0.1156 +vn 0.4460 -0.8595 0.2496 +vn 0.1681 -0.9746 -0.1481 +vn 0.3257 -0.9237 0.2018 +vn 0.4183 -0.8979 0.1370 +vn 0.1405 -0.9692 -0.2021 +vn 0.3896 -0.8488 0.3574 +vn 0.3060 -0.9408 -0.1459 +vn 0.2211 -0.9582 -0.1813 +vn 0.2215 -0.9430 -0.2482 +vn 0.3470 -0.8959 -0.2774 +vn 0.2784 -0.8763 -0.3932 +vn 0.3509 -0.8481 -0.3969 +vn 0.3113 -0.8395 -0.4454 +vn 0.3218 -0.8333 -0.4496 +vn 0.3382 -0.8340 -0.4359 +vn 0.3307 -0.8306 -0.4479 +vn 0.1582 -0.9646 -0.2108 +vn 0.1315 -0.9581 -0.2543 +vn 0.1460 -0.9286 -0.3411 +vn 0.1982 -0.8908 -0.4089 +vn 0.2470 -0.8626 -0.4415 +vn 0.0939 -0.9621 -0.2560 +vn 0.0688 -0.9519 -0.2986 +vn 0.0517 -0.9453 -0.3220 +vn 0.0788 -0.9227 -0.3774 +vn 0.1058 -0.8881 -0.4472 +vn 0.0802 -0.9577 -0.2762 +vn 0.1031 -0.9437 -0.3143 +vn 0.0840 -0.9384 -0.3352 +vn 0.0581 -0.9271 -0.3703 +vn 0.0475 -0.8915 -0.4505 +vn 0.3939 -0.9067 -0.1507 +vn 0.3718 -0.8095 -0.4543 +vn 0.4290 -0.7645 -0.4811 +vn 0.3499 -0.8037 -0.4813 +vn 0.0346 -0.8551 -0.5174 +vn 0.3964 -0.8758 -0.2755 +vn 0.3192 -0.8209 -0.4736 +vn 0.3451 -0.8641 -0.3664 +vn 0.2382 -0.8149 -0.5284 +vn 0.3133 -0.8410 -0.4412 +vn 0.0937 -0.8449 -0.5267 +vn 0.3820 -0.7492 -0.5410 +vn 0.2231 -0.8024 -0.5535 +vn 0.2812 -0.6837 -0.6734 +vn 0.3945 -0.6475 -0.6520 +vn 0.2663 -0.6221 -0.7362 +vn 0.3406 -0.6196 -0.7071 +vn 0.2560 -0.5673 -0.7827 +vn 0.3656 -0.5243 -0.7691 +vn 0.2647 -0.4520 -0.8519 +vn 0.4106 -0.3711 -0.8329 +vn 0.1828 -0.7753 -0.6045 +vn 0.1338 -0.7294 -0.6708 +vn 0.1743 -0.6414 -0.7471 +vn 0.1836 -0.5821 -0.7921 +vn 0.1647 -0.4771 -0.8633 +vn 0.1647 -0.7594 -0.6295 +vn 0.0941 -0.7317 -0.6752 +vn 0.1079 -0.6673 -0.7370 +vn 0.1238 -0.5995 -0.7908 +vn 0.1230 -0.4731 -0.8724 +vn 0.0734 -0.7893 -0.6096 +vn 0.0893 -0.7223 -0.6858 +vn 0.0974 -0.6733 -0.7329 +vn 0.0639 -0.6081 -0.7912 +vn 0.0537 -0.4969 -0.8661 +vn 0.4579 -0.7075 -0.5383 +vn 0.3923 -0.2687 -0.8797 +vn 0.4352 -0.2666 -0.8599 +vn 0.4686 -0.3533 -0.8097 +vn 0.1055 -0.3905 -0.9146 +vn 0.3897 -0.6831 -0.6177 +vn 0.2736 -0.3206 -0.9069 +vn 0.3986 -0.6028 -0.6912 +vn 0.1335 -0.3896 -0.9112 +vn 0.4161 -0.5152 -0.7493 +vn 0.0921 -0.4028 -0.9106 +vn 0.3727 -0.2373 -0.8971 +vn 0.2810 -0.2733 -0.9200 +vn 0.2822 -0.1551 -0.9467 +vn 0.3783 -0.1111 -0.9190 +vn 0.2501 -0.0278 -0.9678 +vn 0.3178 -0.0222 -0.9479 +vn 0.2187 0.0269 -0.9754 +vn 0.2555 0.0120 -0.9667 +vn 0.1560 0.1590 -0.9749 +vn 0.1696 0.1586 -0.9727 +vn 0.1966 -0.3046 -0.9320 +vn 0.1946 -0.1760 -0.9650 +vn 0.2124 -0.0337 -0.9766 +vn 0.2057 0.0310 -0.9781 +vn 0.1640 0.1831 -0.9693 +vn 0.1181 -0.3379 -0.9337 +vn 0.0850 -0.2330 -0.9688 +vn 0.1490 -0.0765 -0.9859 +vn 0.1724 0.0342 -0.9844 +vn 0.1098 0.1911 -0.9754 +vn 0.0720 -0.3313 -0.9408 +vn 0.0100 -0.2317 -0.9727 +vn 0.0117 -0.1271 -0.9918 +vn 0.0154 0.0204 -0.9997 +vn -0.0052 0.2038 -0.9790 +vn 0.4338 -0.2003 -0.8784 +vn 0.0138 0.1194 -0.9927 +vn 0.2994 0.4124 -0.8604 +vn 0.0293 -0.1349 -0.9904 +vn -0.0037 0.2926 -0.9562 +vn 0.4260 -0.1253 -0.8960 +vn -0.0259 0.1295 -0.9912 +vn 0.3440 -0.0536 -0.9374 +vn 0.0685 0.2505 -0.9657 +vn 0.2519 -0.0763 -0.9647 +vn 0.0885 0.2922 -0.9523 +vn 0.1037 -0.1205 0.9873 +vn 0.0719 -0.1455 0.9868 +vn 0.0781 -0.1557 0.9847 +vn 0.0965 -0.1025 0.9900 +vn -0.9088 0.2272 0.3499 +vn -0.8355 0.2448 0.4920 +vn -0.8339 0.2264 0.5034 +vn -0.9052 0.2198 0.3636 +vn -0.3598 0.7327 0.5776 +vn -0.3307 0.7731 0.5412 +vn -0.3345 0.7652 0.5501 +vn -0.3662 0.7214 0.5878 +vn 0.4065 0.3555 0.8417 +vn 0.3644 0.3186 0.8750 +vn 0.3706 0.3460 0.8619 +vn 0.4091 0.3630 0.8372 +vn -0.7233 0.4418 0.5307 +vn -0.7350 0.4135 0.5374 +vn 0.2184 0.1684 0.9612 +vn 0.2229 0.2078 0.9524 +vn -0.5573 0.5820 0.5921 +vn -0.5738 0.5645 0.5934 +vn 0.0779 0.0944 0.9925 +vn 0.0827 0.1298 0.9881 +vn -0.4299 0.6510 0.6255 +vn -0.4394 0.6360 0.6343 +vn 0.0495 -0.0366 0.9981 +vn 0.0425 -0.0045 0.9991 +vn -0.8929 0.3912 0.2230 +vn -0.8960 0.3833 0.2241 +vn -0.8905 0.3943 0.2271 +vn -0.8943 0.3887 0.2219 +vn -0.9423 0.1982 0.2696 +vn -0.9408 0.2025 0.2717 +vn -0.9612 0.1673 0.2193 +vn -0.9607 0.1710 0.2186 +vn -0.9034 0.2646 0.3373 +vn -0.9069 0.2523 0.3375 +vn -0.9018 0.2917 0.3188 +vn -0.8998 0.2981 0.3187 +vn -0.8394 0.4596 0.2901 +vn -0.8518 0.4414 0.2822 +vn -0.8467 0.4496 0.2846 +vn -0.8375 0.4624 0.2911 +vn -0.9167 0.3659 0.1607 +vn -0.9165 0.3686 0.1556 +vn -0.9134 0.3794 0.1477 +vn -0.9121 0.3794 0.1556 +vn -0.9263 0.3594 0.1127 +vn -0.9261 0.3613 0.1089 +vn -0.8883 0.4389 0.1351 +vn -0.8881 0.4396 0.1340 +vn 0.0556 0.9745 0.2176 +vn -0.1795 0.9486 0.2606 +vn -0.1961 0.9484 0.2493 +vn 0.0108 0.9813 0.1921 +vn -0.5869 0.6730 0.4501 +vn -0.6405 0.6654 0.3834 +vn -0.6405 0.6638 0.3862 +vn -0.6321 0.6543 0.4151 +vn -0.6148 0.7175 0.3273 +vn -0.6736 0.6851 0.2773 +vn -0.7969 0.5280 0.2936 +vn -0.7928 0.5304 0.3004 +vn -0.3053 0.9186 0.2508 +vn -0.2919 0.9204 0.2602 +vn -0.6634 0.6177 0.4223 +vn -0.6635 0.6172 0.4228 +vn -0.3821 0.8927 0.2388 +vn -0.3710 0.8957 0.2453 +vn -0.7379 0.5379 0.4076 +vn -0.7343 0.5414 0.4094 +vn -0.4896 0.8332 0.2569 +vn -0.4977 0.8303 0.2507 +vn -0.7555 0.5237 0.3935 +vn -0.7500 0.5278 0.3986 +vn 0.3186 0.7443 0.5869 +vn 0.4363 0.6736 0.5965 +vn 0.4131 0.6899 0.5945 +vn 0.3021 0.7585 0.5774 +vn -0.3566 0.3123 0.8805 +vn -0.4367 0.3132 0.8433 +vn -0.4262 0.3062 0.8512 +vn -0.3269 0.2928 0.8986 +vn 0.8316 0.2741 0.4831 +vn 0.8131 0.3535 0.4625 +vn 0.8143 0.3528 0.4609 +vn 0.8305 0.2769 0.4834 +vn -0.0098 -0.0423 0.9991 +vn -0.0040 -0.0531 0.9986 +vn 0.5778 0.5775 0.5768 +vn 0.5564 0.5989 0.5760 +vn 0.0403 -0.0518 0.9978 +vn 0.0481 -0.0614 0.9970 +vn 0.6703 0.4405 0.5971 +vn 0.6596 0.4596 0.5947 +vn -0.0354 0.0667 0.9971 +vn -0.0101 0.0412 0.9991 +vn 0.7485 0.3678 0.5518 +vn 0.7362 0.3830 0.5580 +vn -0.1289 0.1884 0.9736 +vn -0.0891 0.1554 0.9838 +vn 0.8702 0.3093 0.3836 +vn 0.8661 0.3180 0.3857 +vn 0.9369 0.3187 0.1436 +vn 0.8984 0.4116 0.1530 +vn 0.8994 0.4098 0.1520 +vn 0.9400 0.3170 0.1260 +vn 0.9142 0.2552 0.3150 +vn 0.9103 0.2637 0.3190 +vn 0.9432 0.1974 0.2674 +vn 0.9414 0.2017 0.2704 +vn 0.9537 0.2156 0.2098 +vn 0.9556 0.2163 0.2002 +vn 0.9213 0.3719 0.1135 +vn 0.9216 0.3712 0.1133 +vn 0.8653 0.3961 0.3071 +vn 0.8222 0.4539 0.3434 +vn 0.8176 0.4651 0.3394 +vn 0.8689 0.3937 0.3001 +vn 0.8872 0.4368 0.1488 +vn 0.8887 0.4349 0.1449 +vn 0.8862 0.4298 0.1731 +vn 0.8863 0.4291 0.1743 +vn 0.9033 0.3825 0.1941 +vn 0.9041 0.3826 0.1904 +vn 0.8446 0.5069 0.1721 +vn 0.8435 0.5098 0.1692 +vn 0.7548 0.6523 0.0694 +vn 0.4901 0.7743 -0.4003 +vn 0.4235 0.7929 -0.4382 +vn 0.7539 0.6495 0.0989 +vn 0.5267 0.8460 -0.0823 +vn 0.4316 0.8808 -0.1946 +vn 0.2735 0.9484 0.1607 +vn 0.2429 0.9598 0.1405 +vn 0.7892 0.5506 0.2719 +vn 0.7876 0.5575 0.2626 +vn 0.5182 0.8552 0.0137 +vn 0.4768 0.8785 -0.0284 +vn 0.7636 0.6151 0.1964 +vn 0.7570 0.6208 0.2039 +vn 0.4858 0.8704 0.0796 +vn 0.4550 0.8890 0.0523 +vn 0.7672 0.6405 0.0347 +vn 0.7685 0.6387 0.0387 +vn 0.3957 0.9106 0.1196 +vn 0.3732 0.9223 0.1005 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_11 +s 1 +f 7151/3576/8779 7152/3577/8780 7153/3578/8781 7154/3579/8782 +f 7155/3580/8783 7151/3576/8779 7154/3579/8782 7156/3581/8784 +f 7157/3582/8785 7155/3580/8783 7156/3581/8784 7158/3583/8786 +f 7159/3584/8787 7157/3582/8785 7158/3583/8786 7160/3585/8788 +f 7161/3586/8789 7162/3587/8790 7152/3577/8780 7151/3576/8779 +f 7163/3588/8791 7161/3586/8789 7151/3576/8779 7155/3580/8783 +f 7164/3589/8792 7163/3588/8791 7155/3580/8783 7157/3582/8785 +f 7165/3590/8793 7164/3589/8792 7157/3582/8785 7159/3584/8787 +f 7166/3591/8794 7167/3592/8795 7162/3587/8790 7161/3586/8789 +f 7168/3593/8796 7166/3591/8794 7161/3586/8789 7163/3588/8791 +f 7169/3594/8797 7168/3593/8796 7163/3588/8791 7164/3589/8792 +f 7170/3595/8798 7169/3594/8797 7164/3589/8792 7165/3590/8793 +f 7171/3596/8799 7172/3597/8800 7167/3592/8795 7166/3591/8794 +f 7173/3598/8801 7171/3596/8799 7166/3591/8794 7168/3593/8796 +f 7174/3599/8802 7173/3598/8801 7168/3593/8796 7169/3594/8797 +f 7175/3600/8803 7174/3599/8802 7169/3594/8797 7170/3595/8798 +f 7153/3578/8781 7176/3601/8804 7177/3602/8805 7178/3603/8806 +f 7179/3604/8807 7180/3605/8808 7181/3606/8809 7160/3585/8788 +f 7175/3600/8803 7182/3607/8810 7183/3608/8811 7184/3609/8812 +f 7185/3610/8813 7186/3611/8814 7187/3612/8815 7172/3597/8800 +f 7154/3579/8782 7153/3578/8781 7178/3603/8806 7188/3613/8816 +f 7160/3585/8788 7181/3606/8809 7189/3614/8817 7159/3584/8787 +f 7174/3599/8802 7175/3600/8803 7184/3609/8812 7190/3615/8818 +f 7172/3597/8800 7187/3612/8815 7191/3616/8819 7167/3592/8795 +f 7156/3581/8784 7154/3579/8782 7188/3613/8816 7192/3617/8820 +f 7159/3584/8787 7189/3614/8817 7193/3618/8821 7165/3590/8793 +f 7173/3598/8801 7174/3599/8802 7190/3615/8818 7194/3619/8822 +f 7167/3592/8795 7191/3616/8819 7195/3620/8823 7162/3587/8790 +f 7158/3583/8786 7156/3581/8784 7192/3617/8820 7196/3621/8824 +f 7165/3590/8793 7193/3618/8821 7197/3622/8825 7170/3595/8798 +f 7171/3596/8799 7173/3598/8801 7194/3619/8822 7198/3623/8826 +f 7162/3587/8790 7195/3620/8823 7199/3624/8827 7152/3577/8780 +f 7160/3585/8788 7158/3583/8786 7196/3621/8824 7179/3604/8807 +f 7170/3595/8798 7197/3622/8825 7182/3607/8810 7175/3600/8803 +f 7172/3597/8800 7171/3596/8799 7198/3623/8826 7185/3610/8813 +f 7152/3577/8780 7199/3624/8827 7176/3601/8804 7153/3578/8781 +f 7200/3625/8828 7201/3626/8829 7202/3627/8830 7203/3628/8831 +f 7204/3629/8832 7200/3625/8828 7203/3628/8831 7205/3630/8833 +f 7206/3631/8834 7204/3629/8832 7205/3630/8833 7207/3632/8835 +f 7208/3633/8836 7206/3631/8834 7207/3632/8835 7209/3634/8837 +f 7210/3635/8838 7211/3636/8839 7201/3626/8829 7200/3625/8828 +f 7212/3637/8840 7210/3635/8838 7200/3625/8828 7204/3629/8832 +f 7213/3638/8841 7212/3637/8840 7204/3629/8832 7206/3631/8834 +f 7214/3639/8842 7213/3638/8841 7206/3631/8834 7208/3633/8836 +f 7215/3640/8843 7216/3641/8844 7211/3636/8839 7210/3635/8838 +f 7217/3642/8845 7215/3640/8843 7210/3635/8838 7212/3637/8840 +f 7218/3643/8846 7217/3642/8845 7212/3637/8840 7213/3638/8841 +f 7219/3644/8847 7218/3643/8846 7213/3638/8841 7214/3639/8842 +f 7220/3645/8848 7221/3646/8849 7216/3641/8844 7215/3640/8843 +f 7222/3647/8850 7220/3645/8848 7215/3640/8843 7217/3642/8845 +f 7223/3648/8851 7222/3647/8850 7217/3642/8845 7218/3643/8846 +f 7224/3649/8852 7223/3648/8851 7218/3643/8846 7219/3644/8847 +f 7202/3627/8830 7181/3606/8809 7180/3605/8808 7225/3650/8853 +f 7226/3651/8854 7227/3652/8855 7228/3653/8856 7209/3634/8837 +f 7224/3649/8852 7229/3654/8857 7230/3655/8858 7231/3656/8859 +f 7232/3657/8860 7183/3608/8811 7182/3607/8810 7221/3646/8849 +f 7203/3628/8831 7202/3627/8830 7225/3650/8853 7233/3658/8861 +f 7209/3634/8837 7228/3653/8856 7234/3659/8862 7208/3633/8836 +f 7223/3648/8851 7224/3649/8852 7231/3656/8859 7235/3660/8863 +f 7221/3646/8849 7182/3607/8810 7197/3622/8825 7216/3641/8844 +f 7205/3630/8833 7203/3628/8831 7233/3658/8861 7236/3661/8864 +f 7208/3633/8836 7234/3659/8862 7237/3662/8865 7214/3639/8842 +f 7222/3647/8850 7223/3648/8851 7235/3660/8863 7238/3663/8866 +f 7216/3641/8844 7197/3622/8825 7193/3618/8821 7211/3636/8839 +f 7207/3632/8835 7205/3630/8833 7236/3661/8864 7239/3664/8867 +f 7214/3639/8842 7237/3662/8865 7240/3665/8868 7219/3644/8847 +f 7220/3645/8848 7222/3647/8850 7238/3663/8866 7241/3666/8869 +f 7211/3636/8839 7193/3618/8821 7189/3614/8817 7201/3626/8829 +f 7209/3634/8837 7207/3632/8835 7239/3664/8867 7226/3651/8854 +f 7219/3644/8847 7240/3665/8868 7229/3654/8857 7224/3649/8852 +f 7221/3646/8849 7220/3645/8848 7241/3666/8869 7232/3657/8860 +f 7201/3626/8829 7189/3614/8817 7181/3606/8809 7202/3627/8830 +f 7242/3667/8870 7243/3668/8871 7244/3669/8872 7245/3670/8873 +f 7246/3671/8874 7242/3667/8870 7245/3670/8873 7247/3672/8875 +f 7248/3673/8876 7246/3671/8874 7247/3672/8875 7249/3674/8877 +f 7250/3675/8878 7248/3673/8876 7249/3674/8877 7251/3676/8879 +f 7252/3677/8880 7253/3678/8881 7243/3668/8871 7242/3667/8870 +f 7254/3679/8882 7252/3677/8880 7242/3667/8870 7246/3671/8874 +f 7255/3680/8883 7254/3679/8882 7246/3671/8874 7248/3673/8876 +f 7256/3681/8884 7255/3680/8883 7248/3673/8876 7250/3675/8878 +f 7257/3682/8885 7258/3683/8886 7253/3678/8881 7252/3677/8880 +f 7259/3684/8887 7257/3682/8885 7252/3677/8880 7254/3679/8882 +f 7260/3685/8888 7259/3684/8887 7254/3679/8882 7255/3680/8883 +f 7261/3686/8889 7260/3685/8888 7255/3680/8883 7256/3681/8884 +f 7262/3687/8890 7263/3688/8891 7258/3683/8886 7257/3682/8885 +f 7264/3689/8892 7262/3687/8890 7257/3682/8885 7259/3684/8887 +f 7265/3690/8893 7264/3689/8892 7259/3684/8887 7260/3685/8888 +f 7266/3691/8894 7265/3690/8893 7260/3685/8888 7261/3686/8889 +f 7244/3669/8872 7228/3653/8856 7227/3652/8855 7267/3692/8895 +f 7268/3693/8896 7269/3694/8897 7270/3695/8898 7251/3676/8879 +f 7266/3691/8894 7271/3696/8899 7272/3697/8900 7273/3698/8901 +f 7274/3699/8902 7230/3655/8858 7229/3654/8857 7263/3688/8891 +f 7245/3670/8873 7244/3669/8872 7267/3692/8895 7275/3700/8903 +f 7251/3676/8879 7270/3695/8898 7276/3701/8904 7250/3675/8878 +f 7265/3690/8893 7266/3691/8894 7273/3698/8901 7277/3702/8905 +f 7263/3688/8891 7229/3654/8857 7240/3665/8868 7258/3683/8886 +f 7247/3672/8875 7245/3670/8873 7275/3700/8903 7278/3703/8906 +f 7250/3675/8878 7276/3701/8904 7279/3704/8907 7256/3681/8884 +f 7264/3689/8892 7265/3690/8893 7277/3702/8905 7280/3705/8908 +f 7258/3683/8886 7240/3665/8868 7237/3662/8865 7253/3678/8881 +f 7249/3674/8877 7247/3672/8875 7278/3703/8906 7281/3706/8909 +f 7256/3681/8884 7279/3704/8907 7282/3707/8910 7261/3686/8889 +f 7262/3687/8890 7264/3689/8892 7280/3705/8908 7283/3708/8911 +f 7253/3678/8881 7237/3662/8865 7234/3659/8862 7243/3668/8871 +f 7251/3676/8879 7249/3674/8877 7281/3706/8909 7268/3693/8896 +f 7261/3686/8889 7282/3707/8910 7271/3696/8899 7266/3691/8894 +f 7263/3688/8891 7262/3687/8890 7283/3708/8911 7274/3699/8902 +f 7243/3668/8871 7234/3659/8862 7228/3653/8856 7244/3669/8872 +f 7284/3709/8912 7285/3710/8913 7286/3711/8914 7287/3712/8915 +f 7288/3713/8916 7284/3709/8912 7287/3712/8915 7289/3714/8917 +f 7290/3715/8918 7288/3713/8916 7289/3714/8917 7291/3716/8919 +f 7292/3717/8920 7290/3715/8918 7291/3716/8919 7293/3718/8921 +f 7294/3719/8922 7295/3720/8923 7285/3710/8913 7284/3709/8912 +f 7296/3721/8924 7294/3719/8922 7284/3709/8912 7288/3713/8916 +f 7297/3722/8925 7296/3721/8924 7288/3713/8916 7290/3715/8918 +f 7298/3723/8926 7297/3722/8925 7290/3715/8918 7292/3717/8920 +f 7299/3724/8927 7300/3725/8928 7295/3720/8923 7294/3719/8922 +f 7301/3726/8929 7299/3724/8927 7294/3719/8922 7296/3721/8924 +f 7302/3727/8930 7301/3726/8929 7296/3721/8924 7297/3722/8925 +f 7303/3728/8931 7302/3727/8930 7297/3722/8925 7298/3723/8926 +f 7304/3729/8932 7305/3730/8933 7300/3725/8928 7299/3724/8927 +f 7306/3731/8934 7304/3729/8932 7299/3724/8927 7301/3726/8929 +f 7307/3732/8935 7306/3731/8934 7301/3726/8929 7302/3727/8930 +f 7308/3733/8936 7307/3732/8935 7302/3727/8930 7303/3728/8931 +f 7286/3711/8914 7270/3695/8898 7269/3694/8897 7309/3734/8937 +f 7310/3735/8938 7311/3736/8939 7312/3737/8940 7293/3718/8921 +f 7308/3733/8936 7313/3738/8941 7314/3739/8942 7315/3740/8943 +f 7316/3741/8944 7272/3697/8900 7271/3696/8899 7305/3730/8933 +f 7287/3712/8915 7286/3711/8914 7309/3734/8937 7317/3742/8945 +f 7293/3718/8921 7312/3737/8940 7318/3743/8946 7292/3717/8920 +f 7307/3732/8935 7308/3733/8936 7315/3740/8943 7319/3744/8947 +f 7305/3730/8933 7271/3696/8899 7282/3707/8910 7300/3725/8928 +f 7289/3714/8917 7287/3712/8915 7317/3742/8945 7320/3745/8948 +f 7292/3717/8920 7318/3743/8946 7321/3746/8949 7298/3723/8926 +f 7306/3731/8934 7307/3732/8935 7319/3744/8947 7322/3747/8950 +f 7300/3725/8928 7282/3707/8910 7279/3704/8907 7295/3720/8923 +f 7291/3716/8919 7289/3714/8917 7320/3745/8948 7323/3748/8951 +f 7298/3723/8926 7321/3746/8949 7324/3749/8952 7303/3728/8931 +f 7304/3729/8932 7306/3731/8934 7322/3747/8950 7325/3750/8953 +f 7295/3720/8923 7279/3704/8907 7276/3701/8904 7285/3710/8913 +f 7293/3718/8921 7291/3716/8919 7323/3748/8951 7310/3735/8938 +f 7303/3728/8931 7324/3749/8952 7313/3738/8941 7308/3733/8936 +f 7305/3730/8933 7304/3729/8932 7325/3750/8953 7316/3741/8944 +f 7285/3710/8913 7276/3701/8904 7270/3695/8898 7286/3711/8914 +f 7326/3751/8954 7327/3752/8955 7328/3753/8956 7329/3754/8957 +f 7330/3755/8958 7326/3751/8954 7329/3754/8957 7331/3756/8959 +f 7332/3757/8960 7330/3755/8958 7331/3756/8959 7333/3758/8961 +f 7334/3759/8962 7332/3757/8960 7333/3758/8961 7335/3760/8963 +f 7336/3761/8964 7337/3762/8965 7327/3752/8955 7326/3751/8954 +f 7338/3763/8966 7336/3761/8964 7326/3751/8954 7330/3755/8958 +f 7339/3764/8967 7338/3763/8966 7330/3755/8958 7332/3757/8960 +f 7340/3765/8968 7339/3764/8967 7332/3757/8960 7334/3759/8962 +f 7341/3766/8969 7342/3767/8970 7337/3762/8965 7336/3761/8964 +f 7343/3768/8971 7341/3766/8969 7336/3761/8964 7338/3763/8966 +f 7344/3769/8972 7343/3768/8971 7338/3763/8966 7339/3764/8967 +f 7345/3770/8973 7344/3769/8972 7339/3764/8967 7340/3765/8968 +f 7346/3771/8974 7347/3772/8975 7342/3767/8970 7341/3766/8969 +f 7348/3773/8976 7346/3771/8974 7341/3766/8969 7343/3768/8971 +f 7349/3774/8977 7348/3773/8976 7343/3768/8971 7344/3769/8972 +f 7350/3775/8978 7349/3774/8977 7344/3769/8972 7345/3770/8973 +f 7328/3753/8956 7351/3776/8979 7352/3777/8980 7353/3778/8981 +f 7354/3779/8982 7355/3780/8983 7356/3781/8984 7335/3760/8963 +f 7350/3775/8978 7357/3782/8985 7180/3605/8808 7179/3604/8807 +f 7178/3603/8806 7177/3602/8805 7358/3783/8986 7347/3772/8975 +f 7329/3754/8957 7328/3753/8956 7353/3778/8981 7359/3784/8987 +f 7335/3760/8963 7356/3781/8984 7360/3785/8988 7334/3759/8962 +f 7349/3774/8977 7350/3775/8978 7179/3604/8807 7196/3621/8824 +f 7347/3772/8975 7358/3783/8986 7361/3786/8989 7342/3767/8970 +f 7331/3756/8959 7329/3754/8957 7359/3784/8987 7362/3787/8990 +f 7334/3759/8962 7360/3785/8988 7363/3788/8991 7340/3765/8968 +f 7348/3773/8976 7349/3774/8977 7196/3621/8824 7192/3617/8820 +f 7342/3767/8970 7361/3786/8989 7364/3789/8992 7337/3762/8965 +f 7333/3758/8961 7331/3756/8959 7362/3787/8990 7365/3790/8993 +f 7340/3765/8968 7363/3788/8991 7366/3791/8994 7345/3770/8973 +f 7346/3771/8974 7348/3773/8976 7192/3617/8820 7188/3613/8816 +f 7337/3762/8965 7364/3789/8992 7367/3792/8995 7327/3752/8955 +f 7335/3760/8963 7333/3758/8961 7365/3790/8993 7354/3779/8982 +f 7345/3770/8973 7366/3791/8994 7357/3782/8985 7350/3775/8978 +f 7347/3772/8975 7346/3771/8974 7188/3613/8816 7178/3603/8806 +f 7327/3752/8955 7367/3792/8995 7351/3776/8979 7328/3753/8956 +f 7368/3793/8996 7369/3794/8997 7370/3795/8998 7371/3796/8999 +f 7372/3797/9000 7368/3793/8996 7371/3796/8999 7373/3798/9001 +f 7374/3799/9002 7372/3797/9000 7373/3798/9001 7375/3800/9003 +f 7376/3801/9004 7374/3799/9002 7375/3800/9003 7377/3802/9005 +f 7378/3803/9006 7379/3804/9007 7369/3794/8997 7368/3793/8996 +f 7380/3805/9008 7378/3803/9006 7368/3793/8996 7372/3797/9000 +f 7381/3806/9009 7380/3805/9008 7372/3797/9000 7374/3799/9002 +f 7382/3807/9010 7381/3806/9009 7374/3799/9002 7376/3801/9004 +f 7383/3808/9011 7384/3809/9012 7379/3804/9007 7378/3803/9006 +f 7385/3810/9013 7383/3808/9011 7378/3803/9006 7380/3805/9008 +f 7386/3811/9014 7385/3810/9013 7380/3805/9008 7381/3806/9009 +f 7387/3812/9015 7386/3811/9014 7381/3806/9009 7382/3807/9010 +f 7388/3813/9016 7389/3814/9017 7384/3809/9012 7383/3808/9011 +f 7390/3815/9018 7388/3813/9016 7383/3808/9011 7385/3810/9013 +f 7391/3816/9019 7390/3815/9018 7385/3810/9013 7386/3811/9014 +f 7392/3817/9020 7391/3816/9019 7386/3811/9014 7387/3812/9015 +f 7370/3795/8998 7356/3781/8984 7355/3780/8983 7393/3818/9021 +f 7394/3819/9022 7395/3820/9023 7396/3821/9024 7377/3802/9005 +f 7392/3817/9020 7397/3822/9025 7227/3652/8855 7226/3651/8854 +f 7225/3650/8853 7180/3605/8808 7357/3782/8985 7389/3814/9017 +f 7371/3796/8999 7370/3795/8998 7393/3818/9021 7398/3823/9026 +f 7377/3802/9005 7396/3821/9024 7399/3824/9027 7376/3801/9004 +f 7391/3816/9019 7392/3817/9020 7226/3651/8854 7239/3664/8867 +f 7389/3814/9017 7357/3782/8985 7366/3791/8994 7384/3809/9012 +f 7373/3798/9001 7371/3796/8999 7398/3823/9026 7400/3825/9028 +f 7376/3801/9004 7399/3824/9027 7401/3826/9029 7382/3807/9010 +f 7390/3815/9018 7391/3816/9019 7239/3664/8867 7236/3661/8864 +f 7384/3809/9012 7366/3791/8994 7363/3788/8991 7379/3804/9007 +f 7375/3800/9003 7373/3798/9001 7400/3825/9028 7402/3827/9030 +f 7382/3807/9010 7401/3826/9029 7403/3828/9031 7387/3812/9015 +f 7388/3813/9016 7390/3815/9018 7236/3661/8864 7233/3658/8861 +f 7379/3804/9007 7363/3788/8991 7360/3785/8988 7369/3794/8997 +f 7377/3802/9005 7375/3800/9003 7402/3827/9030 7394/3819/9022 +f 7387/3812/9015 7403/3828/9031 7397/3822/9025 7392/3817/9020 +f 7389/3814/9017 7388/3813/9016 7233/3658/8861 7225/3650/8853 +f 7369/3794/8997 7360/3785/8988 7356/3781/8984 7370/3795/8998 +f 7404/3829/9032 7405/3830/9033 7406/3831/9034 7407/3832/9035 +f 7408/3833/9036 7404/3829/9032 7407/3832/9035 7409/3834/9037 +f 7410/3835/9038 7408/3833/9036 7409/3834/9037 7411/3836/9039 +f 7412/3837/9040 7410/3835/9038 7411/3836/9039 7413/3838/9041 +f 7414/3839/9042 7415/3840/9043 7405/3830/9033 7404/3829/9032 +f 7416/3841/9044 7414/3839/9042 7404/3829/9032 7408/3833/9036 +f 7417/3842/9045 7416/3841/9044 7408/3833/9036 7410/3835/9038 +f 7418/3843/9046 7417/3842/9045 7410/3835/9038 7412/3837/9040 +f 7419/3844/9047 7420/3845/9048 7415/3840/9043 7414/3839/9042 +f 7421/3846/9049 7419/3844/9047 7414/3839/9042 7416/3841/9044 +f 7422/3847/9050 7421/3846/9049 7416/3841/9044 7417/3842/9045 +f 7423/3848/9051 7422/3847/9050 7417/3842/9045 7418/3843/9046 +f 7424/3849/9052 7425/3850/9053 7420/3845/9048 7419/3844/9047 +f 7426/3851/9054 7424/3849/9052 7419/3844/9047 7421/3846/9049 +f 7427/3852/9055 7426/3851/9054 7421/3846/9049 7422/3847/9050 +f 7428/3853/9056 7427/3852/9055 7422/3847/9050 7423/3848/9051 +f 7406/3831/9034 7396/3821/9024 7395/3820/9023 7429/3854/9057 +f 7430/3855/9058 7431/3856/9059 7432/3857/9060 7413/3838/9041 +f 7428/3853/9056 7433/3858/9061 7269/3694/8897 7268/3693/8896 +f 7267/3692/8895 7227/3652/8855 7397/3822/9025 7425/3850/9053 +f 7407/3832/9035 7406/3831/9034 7429/3854/9057 7434/3859/9062 +f 7413/3838/9041 7432/3857/9060 7435/3860/9063 7412/3837/9040 +f 7427/3852/9055 7428/3853/9056 7268/3693/8896 7281/3706/8909 +f 7425/3850/9053 7397/3822/9025 7403/3828/9031 7420/3845/9048 +f 7409/3834/9037 7407/3832/9035 7434/3859/9062 7436/3861/9064 +f 7412/3837/9040 7435/3860/9063 7437/3862/9065 7418/3843/9046 +f 7426/3851/9054 7427/3852/9055 7281/3706/8909 7278/3703/8906 +f 7420/3845/9048 7403/3828/9031 7401/3826/9029 7415/3840/9043 +f 7411/3836/9039 7409/3834/9037 7436/3861/9064 7438/3863/9066 +f 7418/3843/9046 7437/3862/9065 7439/3864/9067 7423/3848/9051 +f 7424/3849/9052 7426/3851/9054 7278/3703/8906 7275/3700/8903 +f 7415/3840/9043 7401/3826/9029 7399/3824/9027 7405/3830/9033 +f 7413/3838/9041 7411/3836/9039 7438/3863/9066 7430/3855/9058 +f 7423/3848/9051 7439/3864/9067 7433/3858/9061 7428/3853/9056 +f 7425/3850/9053 7424/3849/9052 7275/3700/8903 7267/3692/8895 +f 7405/3830/9033 7399/3824/9027 7396/3821/9024 7406/3831/9034 +f 7440/3865/9068 7441/3866/9069 7442/3867/9070 7443/3868/9071 +f 7444/3869/9072 7440/3865/9068 7443/3868/9071 7445/3870/9073 +f 7446/3871/9074 7444/3869/9072 7445/3870/9073 7447/3872/9075 +f 7448/3873/9076 7446/3871/9074 7447/3872/9075 7449/3874/9077 +f 7450/3875/9078 7451/3876/9079 7441/3866/9069 7440/3865/9068 +f 7452/3877/9080 7450/3875/9078 7440/3865/9068 7444/3869/9072 +f 7453/3878/9081 7452/3877/9080 7444/3869/9072 7446/3871/9074 +f 7454/3879/9082 7453/3878/9081 7446/3871/9074 7448/3873/9076 +f 7455/3880/9083 7456/3881/9084 7451/3876/9079 7450/3875/9078 +f 7457/3882/9085 7455/3880/9083 7450/3875/9078 7452/3877/9080 +f 7458/3883/9086 7457/3882/9085 7452/3877/9080 7453/3878/9081 +f 7459/3884/9087 7458/3883/9086 7453/3878/9081 7454/3879/9082 +f 7460/3885/9088 7461/3886/9089 7456/3881/9084 7455/3880/9083 +f 7462/3887/9090 7460/3885/9088 7455/3880/9083 7457/3882/9085 +f 7463/3888/9091 7462/3887/9090 7457/3882/9085 7458/3883/9086 +f 7464/3889/9092 7463/3888/9091 7458/3883/9086 7459/3884/9087 +f 7442/3867/9070 7432/3857/9060 7431/3856/9059 7465/3890/9093 +f 7466/3891/9094 7467/3892/9095 7468/3893/9096 7449/3874/9077 +f 7464/3889/9092 7469/3894/9097 7311/3736/8939 7310/3735/8938 +f 7309/3734/8937 7269/3694/8897 7433/3858/9061 7461/3886/9089 +f 7443/3868/9071 7442/3867/9070 7465/3890/9093 7470/3895/9098 +f 7449/3874/9077 7468/3893/9096 7471/3896/9099 7448/3873/9076 +f 7463/3888/9091 7464/3889/9092 7310/3735/8938 7323/3748/8951 +f 7461/3886/9089 7433/3858/9061 7439/3864/9067 7456/3881/9084 +f 7445/3870/9073 7443/3868/9071 7470/3895/9098 7472/3897/9100 +f 7448/3873/9076 7471/3896/9099 7473/3898/9101 7454/3879/9082 +f 7462/3887/9090 7463/3888/9091 7323/3748/8951 7320/3745/8948 +f 7456/3881/9084 7439/3864/9067 7437/3862/9065 7451/3876/9079 +f 7447/3872/9075 7445/3870/9073 7472/3897/9100 7474/3899/9102 +f 7454/3879/9082 7473/3898/9101 7475/3900/9103 7459/3884/9087 +f 7460/3885/9088 7462/3887/9090 7320/3745/8948 7317/3742/8945 +f 7451/3876/9079 7437/3862/9065 7435/3860/9063 7441/3866/9069 +f 7449/3874/9077 7447/3872/9075 7474/3899/9102 7466/3891/9094 +f 7459/3884/9087 7475/3900/9103 7469/3894/9097 7464/3889/9092 +f 7461/3886/9089 7460/3885/9088 7317/3742/8945 7309/3734/8937 +f 7441/3866/9069 7435/3860/9063 7432/3857/9060 7442/3867/9070 +f 7476/3578/9104 7477/3577/9105 7478/3576/9106 7479/3579/9107 +f 7479/3579/9107 7478/3576/9106 7480/3580/9108 7481/3581/9109 +f 7481/3581/9109 7480/3580/9108 7482/3582/9110 7483/3583/9111 +f 7483/3583/9111 7482/3582/9110 7484/3584/9112 7485/3585/9113 +f 7477/3577/9105 7486/3587/9114 7487/3586/9115 7478/3576/9106 +f 7478/3576/9106 7487/3586/9115 7488/3588/9116 7480/3580/9108 +f 7480/3580/9108 7488/3588/9116 7489/3589/9117 7482/3582/9110 +f 7482/3582/9110 7489/3589/9117 7490/3590/9118 7484/3584/9112 +f 7486/3587/9114 7491/3592/9119 7492/3591/9120 7487/3586/9115 +f 7487/3586/9115 7492/3591/9120 7493/3593/9121 7488/3588/9116 +f 7488/3588/9116 7493/3593/9121 7494/3594/9122 7489/3589/9117 +f 7489/3589/9117 7494/3594/9122 7495/3595/9123 7490/3590/9118 +f 7491/3592/9119 7496/3597/9124 7497/3596/9125 7492/3591/9120 +f 7492/3591/9120 7497/3596/9125 7498/3598/9126 7493/3593/9121 +f 7493/3593/9121 7498/3598/9126 7499/3599/9127 7494/3594/9122 +f 7494/3594/9122 7499/3599/9127 7500/3600/9128 7495/3595/9123 +f 7501/3602/9129 7502/3601/9130 7476/3578/9104 7503/3603/9131 +f 7504/3606/9132 7505/3605/9133 7506/3604/9134 7485/3585/9113 +f 7507/3608/9135 7508/3607/9136 7500/3600/9128 7509/3609/9137 +f 7510/3612/9138 7511/3611/9139 7512/3610/9140 7496/3597/9124 +f 7503/3603/9131 7476/3578/9104 7479/3579/9107 7513/3613/9141 +f 7514/3614/9142 7504/3606/9132 7485/3585/9113 7484/3584/9112 +f 7509/3609/9137 7500/3600/9128 7499/3599/9127 7515/3615/9143 +f 7516/3616/9144 7510/3612/9138 7496/3597/9124 7491/3592/9119 +f 7513/3613/9141 7479/3579/9107 7481/3581/9109 7517/3617/9145 +f 7518/3618/9146 7514/3614/9142 7484/3584/9112 7490/3590/9118 +f 7515/3615/9143 7499/3599/9127 7498/3598/9126 7519/3619/9147 +f 7520/3620/9148 7516/3616/9144 7491/3592/9119 7486/3587/9114 +f 7517/3617/9145 7481/3581/9109 7483/3583/9111 7521/3621/9149 +f 7522/3622/9150 7518/3618/9146 7490/3590/9118 7495/3595/9123 +f 7519/3619/9147 7498/3598/9126 7497/3596/9125 7523/3623/9151 +f 7524/3624/9152 7520/3620/9148 7486/3587/9114 7477/3577/9105 +f 7521/3621/9149 7483/3583/9111 7485/3585/9113 7506/3604/9134 +f 7508/3607/9136 7522/3622/9150 7495/3595/9123 7500/3600/9128 +f 7523/3623/9151 7497/3596/9125 7496/3597/9124 7512/3610/9140 +f 7502/3601/9130 7524/3624/9152 7477/3577/9105 7476/3578/9104 +f 7525/3627/9153 7526/3626/9154 7527/3625/9155 7528/3628/9156 +f 7528/3628/9156 7527/3625/9155 7529/3629/9157 7530/3630/9158 +f 7530/3630/9158 7529/3629/9157 7531/3631/9159 7532/3632/9160 +f 7532/3632/9160 7531/3631/9159 7533/3633/9161 7534/3634/9162 +f 7526/3626/9154 7535/3636/9163 7536/3635/9164 7527/3625/9155 +f 7527/3625/9155 7536/3635/9164 7537/3637/9165 7529/3629/9157 +f 7529/3629/9157 7537/3637/9165 7538/3638/9166 7531/3631/9159 +f 7531/3631/9159 7538/3638/9166 7539/3639/9167 7533/3633/9161 +f 7535/3636/9163 7540/3641/9168 7541/3640/9169 7536/3635/9164 +f 7536/3635/9164 7541/3640/9169 7542/3642/9170 7537/3637/9165 +f 7537/3637/9165 7542/3642/9170 7543/3643/9171 7538/3638/9166 +f 7538/3638/9166 7543/3643/9171 7544/3644/9172 7539/3639/9167 +f 7540/3641/9168 7545/3646/9173 7546/3645/9174 7541/3640/9169 +f 7541/3640/9169 7546/3645/9174 7547/3647/9175 7542/3642/9170 +f 7542/3642/9170 7547/3647/9175 7548/3648/9176 7543/3643/9171 +f 7543/3643/9171 7548/3648/9176 7549/3649/9177 7544/3644/9172 +f 7505/3605/9133 7504/3606/9132 7525/3627/9153 7550/3650/9178 +f 7551/3653/9179 7552/3652/9180 7553/3651/9181 7534/3634/9162 +f 7554/3655/9182 7555/3654/9183 7549/3649/9177 7556/3656/9184 +f 7508/3607/9136 7507/3608/9135 7557/3657/9185 7545/3646/9173 +f 7550/3650/9178 7525/3627/9153 7528/3628/9156 7558/3658/9186 +f 7559/3659/9187 7551/3653/9179 7534/3634/9162 7533/3633/9161 +f 7556/3656/9184 7549/3649/9177 7548/3648/9176 7560/3660/9188 +f 7522/3622/9150 7508/3607/9136 7545/3646/9173 7540/3641/9168 +f 7558/3658/9186 7528/3628/9156 7530/3630/9158 7561/3661/9189 +f 7562/3662/9190 7559/3659/9187 7533/3633/9161 7539/3639/9167 +f 7560/3660/9188 7548/3648/9176 7547/3647/9175 7563/3663/9191 +f 7518/3618/9146 7522/3622/9150 7540/3641/9168 7535/3636/9163 +f 7561/3661/9189 7530/3630/9158 7532/3632/9160 7564/3664/9192 +f 7565/3665/9193 7562/3662/9190 7539/3639/9167 7544/3644/9172 +f 7563/3663/9191 7547/3647/9175 7546/3645/9174 7566/3666/9194 +f 7514/3614/9142 7518/3618/9146 7535/3636/9163 7526/3626/9154 +f 7564/3664/9192 7532/3632/9160 7534/3634/9162 7553/3651/9181 +f 7555/3654/9183 7565/3665/9193 7544/3644/9172 7549/3649/9177 +f 7566/3666/9194 7546/3645/9174 7545/3646/9173 7557/3657/9185 +f 7504/3606/9132 7514/3614/9142 7526/3626/9154 7525/3627/9153 +f 7567/3669/9195 7568/3668/9196 7569/3667/9197 7570/3670/9198 +f 7570/3670/9198 7569/3667/9197 7571/3671/9199 7572/3672/9200 +f 7572/3672/9200 7571/3671/9199 7573/3673/9201 7574/3674/9202 +f 7574/3674/9202 7573/3673/9201 7575/3675/9203 7576/3676/9204 +f 7568/3668/9196 7577/3678/9205 7578/3677/9206 7569/3667/9197 +f 7569/3667/9197 7578/3677/9206 7579/3679/9207 7571/3671/9199 +f 7571/3671/9199 7579/3679/9207 7580/3680/9208 7573/3673/9201 +f 7573/3673/9201 7580/3680/9208 7581/3681/9209 7575/3675/9203 +f 7577/3678/9205 7582/3683/9210 7583/3682/9211 7578/3677/9206 +f 7578/3677/9206 7583/3682/9211 7584/3684/9212 7579/3679/9207 +f 7579/3679/9207 7584/3684/9212 7585/3685/9213 7580/3680/9208 +f 7580/3680/9208 7585/3685/9213 7586/3686/9214 7581/3681/9209 +f 7582/3683/9210 7587/3688/9215 7588/3687/9216 7583/3682/9211 +f 7583/3682/9211 7588/3687/9216 7589/3689/9217 7584/3684/9212 +f 7584/3684/9212 7589/3689/9217 7590/3690/9218 7585/3685/9213 +f 7585/3685/9213 7590/3690/9218 7591/3691/9219 7586/3686/9214 +f 7552/3652/9180 7551/3653/9179 7567/3669/9195 7592/3692/9220 +f 7593/3695/9221 7594/3694/9222 7595/3693/9223 7576/3676/9204 +f 7596/3697/9224 7597/3696/9225 7591/3691/9219 7598/3698/9226 +f 7555/3654/9183 7554/3655/9182 7599/3699/9227 7587/3688/9215 +f 7592/3692/9220 7567/3669/9195 7570/3670/9198 7600/3700/9228 +f 7601/3701/9229 7593/3695/9221 7576/3676/9204 7575/3675/9203 +f 7598/3698/9226 7591/3691/9219 7590/3690/9218 7602/3702/9230 +f 7565/3665/9193 7555/3654/9183 7587/3688/9215 7582/3683/9210 +f 7600/3700/9228 7570/3670/9198 7572/3672/9200 7603/3703/9231 +f 7604/3704/9232 7601/3701/9229 7575/3675/9203 7581/3681/9209 +f 7602/3702/9230 7590/3690/9218 7589/3689/9217 7605/3705/9233 +f 7562/3662/9190 7565/3665/9193 7582/3683/9210 7577/3678/9205 +f 7603/3703/9231 7572/3672/9200 7574/3674/9202 7606/3706/9234 +f 7607/3707/9235 7604/3704/9232 7581/3681/9209 7586/3686/9214 +f 7605/3705/9233 7589/3689/9217 7588/3687/9216 7608/3708/9236 +f 7559/3659/9187 7562/3662/9190 7577/3678/9205 7568/3668/9196 +f 7606/3706/9234 7574/3674/9202 7576/3676/9204 7595/3693/9223 +f 7597/3696/9225 7607/3707/9235 7586/3686/9214 7591/3691/9219 +f 7608/3708/9236 7588/3687/9216 7587/3688/9215 7599/3699/9227 +f 7551/3653/9179 7559/3659/9187 7568/3668/9196 7567/3669/9195 +f 7609/3711/9237 7610/3710/9238 7611/3709/9239 7612/3712/9240 +f 7612/3712/9240 7611/3709/9239 7613/3713/9241 7614/3714/9242 +f 7614/3714/9242 7613/3713/9241 7615/3715/9243 7616/3716/9244 +f 7616/3716/9244 7615/3715/9243 7617/3717/9245 7618/3718/9246 +f 7610/3710/9238 7619/3720/9247 7620/3719/9248 7611/3709/9239 +f 7611/3709/9239 7620/3719/9248 7621/3721/9249 7613/3713/9241 +f 7613/3713/9241 7621/3721/9249 7622/3722/9250 7615/3715/9243 +f 7615/3715/9243 7622/3722/9250 7623/3723/9251 7617/3717/9245 +f 7619/3720/9247 7624/3725/9252 7625/3724/9253 7620/3719/9248 +f 7620/3719/9248 7625/3724/9253 7626/3726/9254 7621/3721/9249 +f 7621/3721/9249 7626/3726/9254 7627/3727/9255 7622/3722/9250 +f 7622/3722/9250 7627/3727/9255 7628/3728/9256 7623/3723/9251 +f 7624/3725/9252 7629/3730/9257 7630/3729/9258 7625/3724/9253 +f 7625/3724/9253 7630/3729/9258 7631/3731/9259 7626/3726/9254 +f 7626/3726/9254 7631/3731/9259 7632/3732/9260 7627/3727/9255 +f 7627/3727/9255 7632/3732/9260 7633/3733/9261 7628/3728/9256 +f 7594/3694/9222 7593/3695/9221 7609/3711/9237 7634/3734/9262 +f 7635/3737/9263 7636/3736/9264 7637/3735/9265 7618/3718/9246 +f 7638/3739/9266 7639/3738/9267 7633/3733/9261 7640/3740/9268 +f 7597/3696/9225 7596/3697/9224 7641/3741/9269 7629/3730/9257 +f 7634/3734/9262 7609/3711/9237 7612/3712/9240 7642/3742/9270 +f 7643/3743/9271 7635/3737/9263 7618/3718/9246 7617/3717/9245 +f 7640/3740/9268 7633/3733/9261 7632/3732/9260 7644/3744/9272 +f 7607/3707/9235 7597/3696/9225 7629/3730/9257 7624/3725/9252 +f 7642/3742/9270 7612/3712/9240 7614/3714/9242 7645/3745/9273 +f 7646/3746/9274 7643/3743/9271 7617/3717/9245 7623/3723/9251 +f 7644/3744/9272 7632/3732/9260 7631/3731/9259 7647/3747/9275 +f 7604/3704/9232 7607/3707/9235 7624/3725/9252 7619/3720/9247 +f 7645/3745/9273 7614/3714/9242 7616/3716/9244 7648/3748/9276 +f 7649/3749/9277 7646/3746/9274 7623/3723/9251 7628/3728/9256 +f 7647/3747/9275 7631/3731/9259 7630/3729/9258 7650/3750/9278 +f 7601/3701/9229 7604/3704/9232 7619/3720/9247 7610/3710/9238 +f 7648/3748/9276 7616/3716/9244 7618/3718/9246 7637/3735/9265 +f 7639/3738/9267 7649/3749/9277 7628/3728/9256 7633/3733/9261 +f 7650/3750/9278 7630/3729/9258 7629/3730/9257 7641/3741/9269 +f 7593/3695/9221 7601/3701/9229 7610/3710/9238 7609/3711/9237 +f 7651/3753/9279 7652/3752/9280 7653/3751/9281 7654/3754/9282 +f 7654/3754/9282 7653/3751/9281 7655/3755/9283 7656/3756/9284 +f 7656/3756/9284 7655/3755/9283 7657/3757/9285 7658/3758/9286 +f 7658/3758/9286 7657/3757/9285 7659/3759/9287 7660/3760/9288 +f 7652/3752/9280 7661/3762/9289 7662/3761/9290 7653/3751/9281 +f 7653/3751/9281 7662/3761/9290 7663/3763/9291 7655/3755/9283 +f 7655/3755/9283 7663/3763/9291 7664/3764/9292 7657/3757/9285 +f 7657/3757/9285 7664/3764/9292 7665/3765/9293 7659/3759/9287 +f 7661/3762/9289 7666/3767/9294 7667/3766/9295 7662/3761/9290 +f 7662/3761/9290 7667/3766/9295 7668/3768/9296 7663/3763/9291 +f 7663/3763/9291 7668/3768/9296 7669/3769/9297 7664/3764/9292 +f 7664/3764/9292 7669/3769/9297 7670/3770/9298 7665/3765/9293 +f 7666/3767/9294 7671/3772/9299 7672/3771/9300 7667/3766/9295 +f 7667/3766/9295 7672/3771/9300 7673/3773/9301 7668/3768/9296 +f 7668/3768/9296 7673/3773/9301 7674/3774/9302 7669/3769/9297 +f 7669/3769/9297 7674/3774/9302 7675/3775/9303 7670/3770/9298 +f 7676/3777/9304 7677/3776/9305 7651/3753/9279 7678/3778/9306 +f 7679/3781/9307 7680/3780/9308 7681/3779/9309 7660/3760/9288 +f 7505/3605/9133 7682/3782/9310 7675/3775/9303 7506/3604/9134 +f 7683/3783/9311 7501/3602/9129 7503/3603/9131 7671/3772/9299 +f 7678/3778/9306 7651/3753/9279 7654/3754/9282 7684/3784/9312 +f 7685/3785/9313 7679/3781/9307 7660/3760/9288 7659/3759/9287 +f 7506/3604/9134 7675/3775/9303 7674/3774/9302 7521/3621/9149 +f 7686/3786/9314 7683/3783/9311 7671/3772/9299 7666/3767/9294 +f 7684/3784/9312 7654/3754/9282 7656/3756/9284 7687/3787/9315 +f 7688/3788/9316 7685/3785/9313 7659/3759/9287 7665/3765/9293 +f 7521/3621/9149 7674/3774/9302 7673/3773/9301 7517/3617/9145 +f 7689/3789/9317 7686/3786/9314 7666/3767/9294 7661/3762/9289 +f 7687/3787/9315 7656/3756/9284 7658/3758/9286 7690/3790/9318 +f 7691/3791/9319 7688/3788/9316 7665/3765/9293 7670/3770/9298 +f 7517/3617/9145 7673/3773/9301 7672/3771/9300 7513/3613/9141 +f 7692/3792/9320 7689/3789/9317 7661/3762/9289 7652/3752/9280 +f 7690/3790/9318 7658/3758/9286 7660/3760/9288 7681/3779/9309 +f 7682/3782/9310 7691/3791/9319 7670/3770/9298 7675/3775/9303 +f 7513/3613/9141 7672/3771/9300 7671/3772/9299 7503/3603/9131 +f 7677/3776/9305 7692/3792/9320 7652/3752/9280 7651/3753/9279 +f 7693/3795/9321 7694/3794/9322 7695/3793/9323 7696/3796/9324 +f 7696/3796/9324 7695/3793/9323 7697/3797/9325 7698/3798/9326 +f 7698/3798/9326 7697/3797/9325 7699/3799/9327 7700/3800/9328 +f 7700/3800/9328 7699/3799/9327 7701/3801/9329 7702/3802/9330 +f 7694/3794/9322 7703/3804/9331 7704/3803/9332 7695/3793/9323 +f 7695/3793/9323 7704/3803/9332 7705/3805/9333 7697/3797/9325 +f 7697/3797/9325 7705/3805/9333 7706/3806/9334 7699/3799/9327 +f 7699/3799/9327 7706/3806/9334 7707/3807/9335 7701/3801/9329 +f 7703/3804/9331 7708/3809/9336 7709/3808/9337 7704/3803/9332 +f 7704/3803/9332 7709/3808/9337 7710/3810/9338 7705/3805/9333 +f 7705/3805/9333 7710/3810/9338 7711/3811/9339 7706/3806/9334 +f 7706/3806/9334 7711/3811/9339 7712/3812/9340 7707/3807/9335 +f 7708/3809/9336 7713/3814/9341 7714/3813/9342 7709/3808/9337 +f 7709/3808/9337 7714/3813/9342 7715/3815/9343 7710/3810/9338 +f 7710/3810/9338 7715/3815/9343 7716/3816/9344 7711/3811/9339 +f 7711/3811/9339 7716/3816/9344 7717/3817/9345 7712/3812/9340 +f 7680/3780/9308 7679/3781/9307 7693/3795/9321 7718/3818/9346 +f 7719/3821/9347 7720/3820/9348 7721/3819/9349 7702/3802/9330 +f 7552/3652/9180 7722/3822/9350 7717/3817/9345 7553/3651/9181 +f 7682/3782/9310 7505/3605/9133 7550/3650/9178 7713/3814/9341 +f 7718/3818/9346 7693/3795/9321 7696/3796/9324 7723/3823/9351 +f 7724/3824/9352 7719/3821/9347 7702/3802/9330 7701/3801/9329 +f 7553/3651/9181 7717/3817/9345 7716/3816/9344 7564/3664/9192 +f 7691/3791/9319 7682/3782/9310 7713/3814/9341 7708/3809/9336 +f 7723/3823/9351 7696/3796/9324 7698/3798/9326 7725/3825/9353 +f 7726/3826/9354 7724/3824/9352 7701/3801/9329 7707/3807/9335 +f 7564/3664/9192 7716/3816/9344 7715/3815/9343 7561/3661/9189 +f 7688/3788/9316 7691/3791/9319 7708/3809/9336 7703/3804/9331 +f 7725/3825/9353 7698/3798/9326 7700/3800/9328 7727/3827/9355 +f 7728/3828/9356 7726/3826/9354 7707/3807/9335 7712/3812/9340 +f 7561/3661/9189 7715/3815/9343 7714/3813/9342 7558/3658/9186 +f 7685/3785/9313 7688/3788/9316 7703/3804/9331 7694/3794/9322 +f 7727/3827/9355 7700/3800/9328 7702/3802/9330 7721/3819/9349 +f 7722/3822/9350 7728/3828/9356 7712/3812/9340 7717/3817/9345 +f 7558/3658/9186 7714/3813/9342 7713/3814/9341 7550/3650/9178 +f 7679/3781/9307 7685/3785/9313 7694/3794/9322 7693/3795/9321 +f 7729/3831/9357 7730/3830/9358 7731/3829/9359 7732/3832/9360 +f 7732/3832/9360 7731/3829/9359 7733/3833/9361 7734/3834/9362 +f 7734/3834/9362 7733/3833/9361 7735/3835/9363 7736/3836/9364 +f 7736/3836/9364 7735/3835/9363 7737/3837/9365 7738/3838/9366 +f 7730/3830/9358 7739/3840/9367 7740/3839/9368 7731/3829/9359 +f 7731/3829/9359 7740/3839/9368 7741/3841/9369 7733/3833/9361 +f 7733/3833/9361 7741/3841/9369 7742/3842/9370 7735/3835/9363 +f 7735/3835/9363 7742/3842/9370 7743/3843/9371 7737/3837/9365 +f 7739/3840/9367 7744/3845/9372 7745/3844/9373 7740/3839/9368 +f 7740/3839/9368 7745/3844/9373 7746/3846/9374 7741/3841/9369 +f 7741/3841/9369 7746/3846/9374 7747/3847/9375 7742/3842/9370 +f 7742/3842/9370 7747/3847/9375 7748/3848/9376 7743/3843/9371 +f 7744/3845/9372 7749/3850/9377 7750/3849/9378 7745/3844/9373 +f 7745/3844/9373 7750/3849/9378 7751/3851/9379 7746/3846/9374 +f 7746/3846/9374 7751/3851/9379 7752/3852/9380 7747/3847/9375 +f 7747/3847/9375 7752/3852/9380 7753/3853/9381 7748/3848/9376 +f 7720/3820/9348 7719/3821/9347 7729/3831/9357 7754/3854/9382 +f 7755/3857/9383 7756/3856/9384 7757/3855/9385 7738/3838/9366 +f 7594/3694/9222 7758/3858/9386 7753/3853/9381 7595/3693/9223 +f 7722/3822/9350 7552/3652/9180 7592/3692/9220 7749/3850/9377 +f 7754/3854/9382 7729/3831/9357 7732/3832/9360 7759/3859/9387 +f 7760/3860/9388 7755/3857/9383 7738/3838/9366 7737/3837/9365 +f 7595/3693/9223 7753/3853/9381 7752/3852/9380 7606/3706/9234 +f 7728/3828/9356 7722/3822/9350 7749/3850/9377 7744/3845/9372 +f 7759/3859/9387 7732/3832/9360 7734/3834/9362 7761/3861/9389 +f 7762/3862/9390 7760/3860/9388 7737/3837/9365 7743/3843/9371 +f 7606/3706/9234 7752/3852/9380 7751/3851/9379 7603/3703/9231 +f 7726/3826/9354 7728/3828/9356 7744/3845/9372 7739/3840/9367 +f 7761/3861/9389 7734/3834/9362 7736/3836/9364 7763/3863/9391 +f 7764/3864/9392 7762/3862/9390 7743/3843/9371 7748/3848/9376 +f 7603/3703/9231 7751/3851/9379 7750/3849/9378 7600/3700/9228 +f 7724/3824/9352 7726/3826/9354 7739/3840/9367 7730/3830/9358 +f 7763/3863/9391 7736/3836/9364 7738/3838/9366 7757/3855/9385 +f 7758/3858/9386 7764/3864/9392 7748/3848/9376 7753/3853/9381 +f 7600/3700/9228 7750/3849/9378 7749/3850/9377 7592/3692/9220 +f 7719/3821/9347 7724/3824/9352 7730/3830/9358 7729/3831/9357 +f 7765/3867/9393 7766/3866/9394 7767/3865/9395 7768/3868/9396 +f 7768/3868/9396 7767/3865/9395 7769/3869/9397 7770/3870/9398 +f 7770/3870/9398 7769/3869/9397 7771/3871/9399 7772/3872/9400 +f 7772/3872/9400 7771/3871/9399 7773/3873/9401 7774/3874/9402 +f 7766/3866/9394 7775/3876/9403 7776/3875/9404 7767/3865/9395 +f 7767/3865/9395 7776/3875/9404 7777/3877/9405 7769/3869/9397 +f 7769/3869/9397 7777/3877/9405 7778/3878/9406 7771/3871/9399 +f 7771/3871/9399 7778/3878/9406 7779/3879/9407 7773/3873/9401 +f 7775/3876/9403 7780/3881/9408 7781/3880/9409 7776/3875/9404 +f 7776/3875/9404 7781/3880/9409 7782/3882/9410 7777/3877/9405 +f 7777/3877/9405 7782/3882/9410 7783/3883/9411 7778/3878/9406 +f 7778/3878/9406 7783/3883/9411 7784/3884/9412 7779/3879/9407 +f 7780/3881/9408 7785/3886/9413 7786/3885/9414 7781/3880/9409 +f 7781/3880/9409 7786/3885/9414 7787/3887/9415 7782/3882/9410 +f 7782/3882/9410 7787/3887/9415 7788/3888/9416 7783/3883/9411 +f 7783/3883/9411 7788/3888/9416 7789/3889/9417 7784/3884/9412 +f 7756/3856/9384 7755/3857/9383 7765/3867/9393 7790/3890/9418 +f 7791/3893/9419 7792/3892/9420 7793/3891/9421 7774/3874/9402 +f 7636/3736/9264 7794/3894/9422 7789/3889/9417 7637/3735/9265 +f 7758/3858/9386 7594/3694/9222 7634/3734/9262 7785/3886/9413 +f 7790/3890/9418 7765/3867/9393 7768/3868/9396 7795/3895/9423 +f 7796/3896/9424 7791/3893/9419 7774/3874/9402 7773/3873/9401 +f 7637/3735/9265 7789/3889/9417 7788/3888/9416 7648/3748/9276 +f 7764/3864/9392 7758/3858/9386 7785/3886/9413 7780/3881/9408 +f 7795/3895/9423 7768/3868/9396 7770/3870/9398 7797/3897/9425 +f 7798/3898/9426 7796/3896/9424 7773/3873/9401 7779/3879/9407 +f 7648/3748/9276 7788/3888/9416 7787/3887/9415 7645/3745/9273 +f 7762/3862/9390 7764/3864/9392 7780/3881/9408 7775/3876/9403 +f 7797/3897/9425 7770/3870/9398 7772/3872/9400 7799/3899/9427 +f 7800/3900/9428 7798/3898/9426 7779/3879/9407 7784/3884/9412 +f 7645/3745/9273 7787/3887/9415 7786/3885/9414 7642/3742/9270 +f 7760/3860/9388 7762/3862/9390 7775/3876/9403 7766/3866/9394 +f 7799/3899/9427 7772/3872/9400 7774/3874/9402 7793/3891/9421 +f 7794/3894/9422 7800/3900/9428 7784/3884/9412 7789/3889/9417 +f 7642/3742/9270 7786/3885/9414 7785/3886/9413 7634/3734/9262 +f 7755/3857/9383 7760/3860/9388 7766/3866/9394 7765/3867/9393 +s 2 +f 7502/3601/9429 7501/3602/9430 7177/3602/9431 7176/3601/9432 +s 4 +f 7507/3608/9433 7509/3609/9434 7184/3609/9435 7183/3608/9436 +f 7512/3610/9437 7511/3611/9438 7186/3611/9439 7185/3610/9440 +s 2 +f 7511/3611/9441 7510/3612/9442 7187/3612/9443 7186/3611/9444 +s 4 +f 7509/3609/9434 7515/3615/9445 7190/3615/9446 7184/3609/9435 +s 2 +f 7510/3612/9442 7516/3616/9447 7191/3616/9448 7187/3612/9443 +s 4 +f 7515/3615/9445 7519/3619/9449 7194/3619/9450 7190/3615/9446 +s 2 +f 7516/3616/9447 7520/3620/9451 7195/3620/9452 7191/3616/9448 +s 4 +f 7519/3619/9449 7523/3623/9453 7198/3623/9454 7194/3619/9450 +s 2 +f 7520/3620/9451 7524/3624/9455 7199/3624/9456 7195/3620/9452 +s 4 +f 7523/3623/9453 7512/3610/9437 7185/3610/9440 7198/3623/9454 +s 2 +f 7524/3624/9455 7502/3601/9429 7176/3601/9432 7199/3624/9456 +s 4 +f 7554/3655/9457 7556/3656/9458 7231/3656/9459 7230/3655/9460 +f 7557/3657/9461 7507/3608/9433 7183/3608/9436 7232/3657/9462 +f 7556/3656/9458 7560/3660/9463 7235/3660/9464 7231/3656/9459 +f 7560/3660/9463 7563/3663/9465 7238/3663/9466 7235/3660/9464 +f 7563/3663/9465 7566/3666/9467 7241/3666/9468 7238/3663/9466 +f 7566/3666/9467 7557/3657/9461 7232/3657/9462 7241/3666/9468 +f 7596/3697/9469 7598/3698/9470 7273/3698/9471 7272/3697/9472 +f 7599/3699/9473 7554/3655/9457 7230/3655/9460 7274/3699/9474 +f 7598/3698/9470 7602/3702/9475 7277/3702/9476 7273/3698/9471 +f 7602/3702/9475 7605/3705/9477 7280/3705/9478 7277/3702/9476 +f 7605/3705/9477 7608/3708/9479 7283/3708/9480 7280/3705/9478 +f 7608/3708/9479 7599/3699/9473 7274/3699/9474 7283/3708/9480 +f 7636/3736/9481 7635/3737/9482 7312/3737/9483 7311/3736/9484 +f 7638/3739/9485 7640/3740/9486 7315/3740/9487 7314/3739/9488 +f 7639/3738/9489 7638/3739/9485 7314/3739/9488 7313/3738/9490 +f 7641/3741/9491 7596/3697/9469 7272/3697/9472 7316/3741/9492 +f 7635/3737/9482 7643/3743/9493 7318/3743/9494 7312/3737/9483 +f 7640/3740/9486 7644/3744/9495 7319/3744/9496 7315/3740/9487 +f 7643/3743/9493 7646/3746/9497 7321/3746/9498 7318/3743/9494 +f 7644/3744/9495 7647/3747/9499 7322/3747/9500 7319/3744/9496 +f 7646/3746/9497 7649/3749/9501 7324/3749/9502 7321/3746/9498 +f 7647/3747/9499 7650/3750/9503 7325/3750/9504 7322/3747/9500 +f 7649/3749/9501 7639/3738/9489 7313/3738/9490 7324/3749/9502 +f 7650/3750/9503 7641/3741/9491 7316/3741/9492 7325/3750/9504 +f 7676/3777/9505 7678/3778/9506 7353/3778/9507 7352/3777/9508 +s 2 +f 7677/3776/9509 7676/3777/9510 7352/3777/9511 7351/3776/9512 +s 4 +f 7681/3779/9513 7680/3780/9514 7355/3780/9515 7354/3779/9516 +s 2 +f 7501/3602/9430 7683/3783/9517 7358/3783/9518 7177/3602/9431 +s 4 +f 7678/3778/9506 7684/3784/9519 7359/3784/9520 7353/3778/9507 +s 2 +f 7683/3783/9517 7686/3786/9521 7361/3786/9522 7358/3783/9518 +s 4 +f 7684/3784/9519 7687/3787/9523 7362/3787/9524 7359/3784/9520 +s 2 +f 7686/3786/9521 7689/3789/9525 7364/3789/9526 7361/3786/9522 +s 4 +f 7687/3787/9523 7690/3790/9527 7365/3790/9528 7362/3787/9524 +s 2 +f 7689/3789/9525 7692/3792/9529 7367/3792/9530 7364/3789/9526 +s 4 +f 7690/3790/9527 7681/3779/9513 7354/3779/9516 7365/3790/9528 +s 2 +f 7692/3792/9529 7677/3776/9509 7351/3776/9512 7367/3792/9530 +s 4 +f 7680/3780/9514 7718/3818/9531 7393/3818/9532 7355/3780/9515 +f 7721/3819/9533 7720/3820/9534 7395/3820/9535 7394/3819/9536 +f 7718/3818/9531 7723/3823/9537 7398/3823/9538 7393/3818/9532 +f 7723/3823/9537 7725/3825/9539 7400/3825/9540 7398/3823/9538 +f 7725/3825/9539 7727/3827/9541 7402/3827/9542 7400/3825/9540 +f 7727/3827/9541 7721/3819/9533 7394/3819/9536 7402/3827/9542 +f 7720/3820/9534 7754/3854/9543 7429/3854/9544 7395/3820/9535 +f 7757/3855/9545 7756/3856/9546 7431/3856/9547 7430/3855/9548 +f 7754/3854/9543 7759/3859/9549 7434/3859/9550 7429/3854/9544 +f 7759/3859/9549 7761/3861/9551 7436/3861/9552 7434/3859/9550 +f 7761/3861/9551 7763/3863/9553 7438/3863/9554 7436/3861/9552 +f 7763/3863/9553 7757/3855/9545 7430/3855/9548 7438/3863/9554 +f 7756/3856/9546 7790/3890/9555 7465/3890/9556 7431/3856/9547 +f 7793/3891/9557 7792/3892/9558 7467/3892/9559 7466/3891/9560 +f 7792/3892/9558 7791/3893/9561 7468/3893/9562 7467/3892/9559 +f 7794/3894/9563 7636/3736/9481 7311/3736/9484 7469/3894/9564 +f 7790/3890/9555 7795/3895/9565 7470/3895/9566 7465/3890/9556 +f 7791/3893/9561 7796/3896/9567 7471/3896/9568 7468/3893/9562 +f 7795/3895/9565 7797/3897/9569 7472/3897/9570 7470/3895/9566 +f 7796/3896/9567 7798/3898/9571 7473/3898/9572 7471/3896/9568 +f 7797/3897/9569 7799/3899/9573 7474/3899/9574 7472/3897/9570 +f 7798/3898/9571 7800/3900/9575 7475/3900/9576 7473/3898/9572 +f 7799/3899/9573 7793/3891/9557 7466/3891/9560 7474/3899/9574 +f 7800/3900/9575 7794/3894/9563 7469/3894/9564 7475/3900/9576 +# 648 polygons + +# +# object lotu_petal_12 +# + +v 0.2036 0.0615 -0.1618 +v 0.1539 0.0488 -0.1364 +v 0.1554 0.0428 -0.0827 +v 0.2065 0.0539 -0.0991 +v 0.2569 0.0800 -0.1830 +v 0.2642 0.0709 -0.1088 +v 0.3176 0.0997 -0.1957 +v 0.3280 0.0880 -0.1159 +v 0.3821 0.1235 -0.2195 +v 0.3967 0.1073 -0.1354 +v 0.1899 0.0745 -0.2257 +v 0.1449 0.0632 -0.1893 +v 0.2431 0.0960 -0.2567 +v 0.3077 0.1200 -0.2754 +v 0.3758 0.1486 -0.3034 +v 0.1847 0.1037 -0.2897 +v 0.1351 0.0850 -0.2441 +v 0.2336 0.1260 -0.3254 +v 0.2923 0.1445 -0.3534 +v 0.3537 0.1685 -0.3865 +v 0.1717 0.1429 -0.3517 +v 0.1315 0.1195 -0.2967 +v 0.2160 0.1674 -0.3982 +v 0.2751 0.1844 -0.4320 +v 0.3387 0.2123 -0.4697 +v 0.1114 0.0344 -0.0686 +v 0.1135 0.0313 -0.0238 +v 0.1577 0.0365 -0.0313 +v 0.3974 0.0990 -0.0480 +v 0.4730 0.1301 -0.0553 +v 0.4706 0.1366 -0.1467 +v 0.4044 0.2422 -0.4991 +v 0.3754 0.2778 -0.5818 +v 0.3105 0.2495 -0.5518 +v 0.1186 0.1622 -0.3493 +v 0.0880 0.1429 -0.2873 +v 0.0893 0.1028 -0.2447 +v 0.2084 0.0484 -0.0386 +v 0.4596 0.1523 -0.2367 +v 0.2548 0.2253 -0.5095 +v 0.0999 0.0767 -0.1994 +v 0.2652 0.0642 -0.0370 +v 0.4489 0.1738 -0.3270 +v 0.2043 0.2064 -0.4621 +v 0.1083 0.0572 -0.1549 +v 0.3288 0.0799 -0.0352 +v 0.4280 0.2000 -0.4123 +v 0.1560 0.1839 -0.4087 +v 0.1110 0.0399 -0.1120 +v 0.6200 0.2172 -0.2664 +v 0.5388 0.1814 -0.2486 +v 0.5509 0.1718 -0.1533 +v 0.6371 0.2037 -0.1645 +v 0.7065 0.2664 -0.2743 +v 0.7225 0.2595 -0.1700 +v 0.7991 0.3314 -0.2795 +v 0.8169 0.3141 -0.1732 +v 0.8951 0.4144 -0.2778 +v 0.9128 0.3974 -0.1715 +v 0.6035 0.2415 -0.3656 +v 0.5225 0.2056 -0.3467 +v 0.6874 0.2902 -0.3811 +v 0.7786 0.3590 -0.3854 +v 0.8735 0.4326 -0.3858 +v 0.5758 0.2616 -0.4584 +v 0.5021 0.2334 -0.4371 +v 0.6558 0.3190 -0.4844 +v 0.7409 0.3907 -0.4888 +v 0.8348 0.4598 -0.4880 +v 0.5432 0.2979 -0.5488 +v 0.4717 0.2654 -0.5224 +v 0.6255 0.3481 -0.5780 +v 0.7094 0.4120 -0.5889 +v 0.8054 0.4827 -0.5875 +v 0.5497 0.1671 -0.0587 +v 0.9179 0.3796 -0.0647 +v 1.0120 0.4742 -0.0575 +v 1.0102 0.4848 -0.1653 +v 0.9042 0.5694 -0.6001 +v 0.8757 0.5891 -0.7048 +v 0.7841 0.5077 -0.6935 +v 0.4450 0.3032 -0.6068 +v 0.6337 0.2014 -0.0654 +v 0.9891 0.5040 -0.2734 +v 0.6883 0.4337 -0.6873 +v 0.7224 0.2428 -0.0659 +v 0.9671 0.5184 -0.3823 +v 0.5997 0.3804 -0.6653 +v 0.8197 0.2999 -0.0675 +v 0.9306 0.5511 -0.4917 +v 0.5213 0.3350 -0.6392 +v 1.2044 0.7315 -0.2624 +v 1.0928 0.6068 -0.2664 +v 1.1096 0.5877 -0.1584 +v 1.2170 0.7118 -0.1617 +v 1.3115 0.8739 -0.2625 +v 1.3318 0.8540 -0.1635 +v 1.4042 1.0249 -0.2548 +v 1.4223 1.0067 -0.1649 +v 1.4805 1.1711 -0.2356 +v 1.5011 1.1550 -0.1483 +v 1.1797 0.7390 -0.3656 +v 1.0731 0.6242 -0.3746 +v 1.2810 0.8822 -0.3639 +v 1.3737 1.0337 -0.3483 +v 1.4498 1.1855 -0.3261 +v 1.1526 0.7654 -0.4671 +v 1.0350 0.6493 -0.4799 +v 1.2477 0.9002 -0.4632 +v 1.3404 1.0425 -0.4431 +v 1.4147 1.1949 -0.4162 +v 1.1129 0.7983 -0.5650 +v 1.0065 0.6771 -0.5845 +v 1.2064 0.9324 -0.5555 +v 1.2999 1.0678 -0.5283 +v 1.3875 1.2094 -0.4997 +v 1.1208 0.5720 -0.0505 +v 1.5077 1.1577 -0.0660 +v 1.5488 1.3011 -0.0570 +v 1.5400 1.3006 -0.1348 +v 1.4350 1.3422 -0.4431 +v 1.3866 1.3587 -0.5195 +v 1.3402 1.2350 -0.5804 +v 0.9644 0.6927 -0.6918 +v 1.2324 0.7001 -0.0632 +v 1.5271 1.3085 -0.2146 +v 1.2602 1.0952 -0.6091 +v 1.3381 0.8456 -0.0699 +v 1.5017 1.3180 -0.2935 +v 1.1660 0.9540 -0.6474 +v 1.4338 1.0001 -0.0776 +v 1.4728 1.3302 -0.3699 +v 1.0700 0.8150 -0.6715 +v 1.5497 1.5549 -0.1609 +v 1.5417 1.4366 -0.1861 +v 1.5506 1.4330 -0.1183 +v 1.5570 1.5544 -0.1011 +v 1.5576 1.6681 -0.1354 +v 1.5692 1.6668 -0.0850 +v 1.5426 1.7691 -0.1130 +v 1.5509 1.7712 -0.0735 +v 1.5166 1.8617 -0.0860 +v 1.5241 1.8641 -0.0585 +v 1.5321 1.5603 -0.2210 +v 1.5186 1.4410 -0.2524 +v 1.5395 1.6711 -0.1880 +v 1.5287 1.7663 -0.1558 +v 1.5081 1.8558 -0.1164 +v 1.5155 1.5641 -0.2811 +v 1.4990 1.4497 -0.3206 +v 1.5252 1.6718 -0.2408 +v 1.5161 1.7674 -0.1985 +v 1.5025 1.8470 -0.1471 +v 1.4851 1.5714 -0.3450 +v 1.4680 1.4611 -0.3951 +v 1.5078 1.6727 -0.2931 +v 1.5046 1.7645 -0.2378 +v 1.4953 1.8411 -0.1759 +v 1.5554 1.4278 -0.0481 +v 1.5300 1.8626 -0.0370 +v 1.5025 1.9453 -0.0255 +v 1.5000 1.9437 -0.0401 +v 1.4901 1.9122 -0.1023 +v 1.4892 1.8965 -0.1168 +v 1.4907 1.8335 -0.2003 +v 1.4272 1.4712 -0.4721 +v 1.5666 1.5491 -0.0403 +v 1.4962 1.9405 -0.0551 +v 1.4943 1.7599 -0.2710 +v 1.5782 1.6638 -0.0380 +v 1.4934 1.9344 -0.0706 +v 1.4765 1.6739 -0.3409 +v 1.5584 1.7692 -0.0402 +v 1.4914 1.9247 -0.0863 +v 1.4577 1.5771 -0.4129 +v 0.2061 0.0792 0.2394 +v 0.1563 0.0749 0.2098 +v 0.1571 0.0981 0.2705 +v 0.2096 0.1092 0.3119 +v 0.2633 0.0945 0.2729 +v 0.2646 0.1218 0.3523 +v 0.3292 0.1121 0.2975 +v 0.3237 0.1323 0.3826 +v 0.3998 0.1254 0.3116 +v 0.3903 0.1526 0.4071 +v 0.2084 0.0690 0.1658 +v 0.1569 0.0607 0.1441 +v 0.2676 0.0789 0.1920 +v 0.3281 0.0916 0.2140 +v 0.3950 0.1073 0.2199 +v 0.2093 0.0528 0.0924 +v 0.1587 0.0457 0.0804 +v 0.2666 0.0615 0.1127 +v 0.3304 0.0813 0.1306 +v 0.3974 0.1085 0.1297 +v 0.2133 0.0500 0.0237 +v 0.1627 0.0391 0.0216 +v 0.2699 0.0578 0.0358 +v 0.3324 0.0764 0.0471 +v 0.3989 0.1054 0.0407 +v 0.1090 0.0947 0.2251 +v 0.1110 0.1252 0.2789 +v 0.1582 0.1301 0.3299 +v 0.3750 0.1937 0.5050 +v 0.4420 0.2156 0.5316 +v 0.4682 0.1796 0.4262 +v 0.4698 0.1300 0.0381 +v 0.1174 0.0320 0.0224 +v 0.2008 0.1432 0.3805 +v 0.4748 0.1473 0.3278 +v 0.1154 0.0379 0.0701 +v 0.2567 0.1499 0.4312 +v 0.4661 0.1275 0.2301 +v 0.1142 0.0528 0.1193 +v 0.3146 0.1631 0.4690 +v 0.4698 0.1345 0.1331 +v 0.1133 0.0732 0.1728 +v 0.6332 0.2160 0.3540 +v 0.5512 0.1818 0.3459 +v 0.5449 0.2085 0.4521 +v 0.6217 0.2455 0.4620 +v 0.7201 0.2715 0.3672 +v 0.6995 0.3005 0.4762 +v 0.8068 0.3383 0.3737 +v 0.7835 0.3731 0.4855 +v 0.9012 0.4130 0.3791 +v 0.8800 0.4394 0.4942 +v 0.6328 0.2047 0.2465 +v 0.5460 0.1639 0.2419 +v 0.7243 0.2631 0.2563 +v 0.8136 0.3198 0.2617 +v 0.9065 0.4030 0.2653 +v 0.6322 0.1988 0.1393 +v 0.5475 0.1641 0.1384 +v 0.7248 0.2513 0.1466 +v 0.8178 0.3126 0.1492 +v 0.9116 0.3866 0.1534 +v 0.6290 0.2029 0.0345 +v 0.5439 0.1629 0.0378 +v 0.7160 0.2392 0.0387 +v 0.8132 0.3007 0.0392 +v 0.9098 0.3833 0.0432 +v 0.5135 0.2428 0.5569 +v 0.8476 0.4615 0.6064 +v 0.9511 0.5303 0.6021 +v 0.9815 0.5094 0.4918 +v 1.0082 0.4790 0.0506 +v 0.5865 0.2815 0.5685 +v 0.9979 0.5016 0.3815 +v 0.6648 0.3370 0.5842 +v 1.0057 0.4902 0.2706 +v 0.7531 0.3991 0.5968 +v 1.0111 0.4834 0.1601 +v 1.2226 0.7179 0.3532 +v 1.1049 0.5939 0.3777 +v 1.0968 0.6049 0.4845 +v 1.2092 0.7250 0.4607 +v 1.3039 0.8631 0.3279 +v 1.3006 0.8703 0.4275 +v 1.3945 1.0188 0.2985 +v 1.3761 1.0268 0.3951 +v 1.4907 1.1687 0.2792 +v 1.4580 1.1761 0.3637 +v 1.2302 0.7079 0.2459 +v 1.1160 0.5948 0.2710 +v 1.3210 0.8564 0.2255 +v 1.4153 1.0085 0.2005 +v 1.5079 1.1625 0.1913 +v 1.2404 0.7041 0.1411 +v 1.1241 0.5828 0.1638 +v 1.3326 0.8529 0.1236 +v 1.4325 1.0094 0.1043 +v 1.5163 1.1560 0.1029 +v 1.2392 0.7075 0.0378 +v 1.1209 0.5784 0.0566 +v 1.3494 0.8520 0.0246 +v 1.4392 1.0059 0.0109 +v 1.5163 1.1542 0.0166 +v 1.0711 0.6161 0.5924 +v 1.4230 1.1869 0.4448 +v 1.4780 1.3153 0.4099 +v 1.5081 1.3100 0.3307 +v 1.5484 1.2975 0.0206 +v 1.1909 0.7367 0.5663 +v 1.5282 1.3002 0.2544 +v 1.2821 0.8819 0.5234 +v 1.5447 1.2987 0.1774 +v 1.3536 1.0373 0.4856 +v 1.5449 1.2967 0.0988 +v 1.5653 1.5447 0.2016 +v 1.5543 1.4229 0.2301 +v 1.5365 1.4286 0.3019 +v 1.5542 1.5402 0.2629 +v 1.5679 1.6549 0.1661 +v 1.5595 1.6493 0.2180 +v 1.5587 1.7547 0.1232 +v 1.5516 1.7469 0.1650 +v 1.5315 1.8412 0.0779 +v 1.5345 1.8326 0.1072 +v 1.5709 1.5448 0.1405 +v 1.5608 1.4250 0.1605 +v 1.5730 1.6590 0.1127 +v 1.5589 1.7601 0.0787 +v 1.5293 1.8495 0.0459 +v 1.5721 1.5489 0.0804 +v 1.5614 1.4271 0.0920 +v 1.5789 1.6610 0.0598 +v 1.5569 1.7636 0.0344 +v 1.5306 1.8567 0.0136 +v 1.5743 1.5477 0.0205 +v 1.5598 1.4256 0.0230 +v 1.5798 1.6626 0.0091 +v 1.5584 1.7682 -0.0065 +v 1.5316 1.8596 -0.0151 +v 1.5174 1.4327 0.3770 +v 1.5328 1.8217 0.1327 +v 1.5191 1.9004 0.0706 +v 1.5159 1.9102 0.0493 +v 1.5046 1.9442 -0.0110 +v 1.5377 1.5459 0.3244 +v 1.5136 1.9217 0.0330 +v 1.5470 1.6429 0.2687 +v 1.5107 1.9307 0.0180 +v 1.5474 1.7396 0.2020 +v 1.5076 1.9389 0.0035 +v 0.1609 0.0226 -0.0878 +v 0.1569 0.0283 -0.1441 +v 0.2067 0.0413 -0.1691 +v 0.2135 0.0343 -0.1037 +v 0.2604 0.0591 -0.1868 +v 0.2712 0.0512 -0.1113 +v 0.3222 0.0800 -0.2002 +v 0.3357 0.0680 -0.1183 +v 0.3894 0.1055 -0.2241 +v 0.4049 0.0876 -0.1370 +v 0.1457 0.0435 -0.2009 +v 0.1934 0.0557 -0.2340 +v 0.2472 0.0768 -0.2632 +v 0.3132 0.1010 -0.2806 +v 0.3790 0.1297 -0.3083 +v 0.1328 0.0670 -0.2536 +v 0.1845 0.0855 -0.2976 +v 0.2362 0.1084 -0.3354 +v 0.2937 0.1264 -0.3612 +v 0.3564 0.1504 -0.3930 +v 0.1244 0.1042 -0.3085 +v 0.1666 0.1253 -0.3586 +v 0.2129 0.1501 -0.4061 +v 0.2744 0.1667 -0.4407 +v 0.3404 0.1943 -0.4776 +v 0.1170 0.0112 -0.0255 +v 0.1167 0.0145 -0.0736 +v 0.1630 0.0161 -0.0341 +v 0.4810 0.1180 -0.1505 +v 0.4811 0.1105 -0.0570 +v 0.4058 0.0796 -0.0476 +v 0.3814 0.2602 -0.5926 +v 0.4085 0.2232 -0.5082 +v 0.3174 0.2304 -0.5621 +v 0.0811 0.0872 -0.2559 +v 0.0756 0.1281 -0.2981 +v 0.1087 0.1468 -0.3590 +v 0.2147 0.0285 -0.0413 +v 0.4642 0.1328 -0.2419 +v 0.2540 0.2063 -0.5178 +v 0.0939 0.0582 -0.2086 +v 0.2722 0.0434 -0.0381 +v 0.4536 0.1541 -0.3322 +v 0.1998 0.1885 -0.4746 +v 0.1064 0.0378 -0.1649 +v 0.3362 0.0604 -0.0354 +v 0.4322 0.1828 -0.4216 +v 0.1492 0.1661 -0.4195 +v 0.1151 0.0193 -0.1205 +v 0.5585 0.1522 -0.1564 +v 0.5484 0.1635 -0.2540 +v 0.6289 0.1998 -0.2684 +v 0.6442 0.1861 -0.1664 +v 0.7159 0.2505 -0.2781 +v 0.7336 0.2419 -0.1707 +v 0.8079 0.3163 -0.2834 +v 0.8272 0.2978 -0.1754 +v 0.9094 0.4006 -0.2823 +v 0.9259 0.3822 -0.1743 +v 0.5287 0.1865 -0.3508 +v 0.6120 0.2227 -0.3719 +v 0.6951 0.2744 -0.3844 +v 0.7887 0.3443 -0.3907 +v 0.8857 0.4180 -0.3898 +v 0.5092 0.2131 -0.4479 +v 0.5839 0.2442 -0.4681 +v 0.6652 0.3035 -0.4920 +v 0.7502 0.3763 -0.4965 +v 0.8453 0.4458 -0.4961 +v 0.4779 0.2466 -0.5339 +v 0.5525 0.2797 -0.5582 +v 0.6343 0.3311 -0.5878 +v 0.7198 0.3985 -0.5993 +v 0.8160 0.4675 -0.5964 +v 0.5603 0.1487 -0.0597 +v 1.0249 0.4694 -0.1675 +v 1.0273 0.4582 -0.0592 +v 0.9310 0.3661 -0.0669 +v 0.8898 0.5742 -0.7142 +v 0.9187 0.5542 -0.6042 +v 0.7952 0.4940 -0.6991 +v 0.4500 0.2836 -0.6184 +v 0.6438 0.1815 -0.0671 +v 1.0034 0.4873 -0.2753 +v 0.6965 0.4170 -0.6948 +v 0.7330 0.2248 -0.0656 +v 0.9813 0.5054 -0.3842 +v 0.6115 0.3634 -0.6771 +v 0.8307 0.2827 -0.0701 +v 0.9444 0.5365 -0.4959 +v 0.5279 0.3180 -0.6471 +v 1.1251 0.5720 -0.1579 +v 1.1069 0.5912 -0.2671 +v 1.2199 0.7198 -0.2668 +v 1.2329 0.6998 -0.1663 +v 1.3291 0.8599 -0.2650 +v 1.3478 0.8432 -0.1679 +v 1.4212 1.0148 -0.2612 +v 1.4415 0.9959 -0.1685 +v 1.4990 1.1614 -0.2384 +v 1.5203 1.1465 -0.1506 +v 1.0870 0.6083 -0.3772 +v 1.1944 0.7257 -0.3701 +v 1.2971 0.8685 -0.3679 +v 1.3914 1.0261 -0.3539 +v 1.4677 1.1753 -0.3294 +v 1.0477 0.6367 -0.4855 +v 1.1670 0.7538 -0.4739 +v 1.2648 0.8888 -0.4708 +v 1.3579 1.0323 -0.4506 +v 1.4324 1.1880 -0.4224 +v 1.0220 0.6629 -0.5907 +v 1.1288 0.7848 -0.5734 +v 1.2234 0.9199 -0.5650 +v 1.3156 1.0592 -0.5390 +v 1.4046 1.2064 -0.5101 +v 1.1367 0.5589 -0.0505 +v 1.5606 1.2959 -0.1376 +v 1.5693 1.2917 -0.0578 +v 1.5266 1.1504 -0.0650 +v 1.4045 1.3577 -0.5277 +v 1.4520 1.3386 -0.4540 +v 1.3572 1.2278 -0.5903 +v 0.9785 0.6801 -0.6979 +v 1.2485 0.6893 -0.0628 +v 1.5459 1.3023 -0.2168 +v 1.2755 1.0869 -0.6194 +v 1.3547 0.8340 -0.0732 +v 1.5215 1.3115 -0.2984 +v 1.1828 0.9436 -0.6547 +v 1.4521 0.9909 -0.0784 +v 1.4912 1.3259 -0.3782 +v 1.0851 0.8020 -0.6765 +v 1.5715 1.4291 -0.1221 +v 1.5614 1.4327 -0.1918 +v 1.5697 1.5534 -0.1662 +v 1.5775 1.5515 -0.1035 +v 1.5778 1.6705 -0.1408 +v 1.5895 1.6658 -0.0896 +v 1.5620 1.7742 -0.1201 +v 1.5700 1.7706 -0.0801 +v 1.5357 1.8666 -0.0930 +v 1.5430 1.8677 -0.0641 +v 1.5389 1.4381 -0.2597 +v 1.5523 1.5602 -0.2272 +v 1.5589 1.6723 -0.1938 +v 1.5473 1.7709 -0.1631 +v 1.5268 1.8608 -0.1243 +v 1.5172 1.4476 -0.3274 +v 1.5341 1.5649 -0.2885 +v 1.5446 1.6727 -0.2477 +v 1.5352 1.7717 -0.2064 +v 1.5200 1.8534 -0.1553 +v 1.4857 1.4595 -0.4005 +v 1.5048 1.5710 -0.3512 +v 1.5253 1.6740 -0.3004 +v 1.5238 1.7678 -0.2469 +v 1.5103 1.8483 -0.1839 +v 1.5759 1.4201 -0.0483 +v 1.5186 1.9497 -0.0435 +v 1.5215 1.9506 -0.0276 +v 1.5496 1.8664 -0.0403 +v 1.5063 1.9040 -0.1253 +v 1.5089 1.9181 -0.1094 +v 1.5077 1.8383 -0.2079 +v 1.4461 1.4700 -0.4792 +v 1.5867 1.5434 -0.0404 +v 1.5149 1.9476 -0.0596 +v 1.5121 1.7611 -0.2812 +v 1.5988 1.6603 -0.0405 +v 1.5128 1.9408 -0.0762 +v 1.4942 1.6747 -0.3501 +v 1.5779 1.7689 -0.0447 +v 1.5105 1.9298 -0.0931 +v 1.4753 1.5766 -0.4177 +v 0.1519 0.0791 0.2808 +v 0.1547 0.0551 0.2141 +v 0.2091 0.0598 0.2447 +v 0.2074 0.0906 0.3181 +v 0.2672 0.0756 0.2782 +v 0.2623 0.1019 0.3600 +v 0.3322 0.0919 0.3044 +v 0.3239 0.1125 0.3903 +v 0.4053 0.1058 0.3161 +v 0.3944 0.1332 0.4110 +v 0.1606 0.0410 0.1471 +v 0.2112 0.0488 0.1683 +v 0.2692 0.0581 0.1961 +v 0.3336 0.0707 0.2187 +v 0.4023 0.0869 0.2227 +v 0.1648 0.0252 0.0827 +v 0.2153 0.0324 0.0941 +v 0.2736 0.0415 0.1150 +v 0.3375 0.0620 0.1325 +v 0.4067 0.0887 0.1323 +v 0.1660 0.0192 0.0213 +v 0.2197 0.0297 0.0231 +v 0.2782 0.0376 0.0365 +v 0.3411 0.0572 0.0479 +v 0.4095 0.0864 0.0428 +v 0.1031 0.1091 0.2868 +v 0.1042 0.0754 0.2334 +v 0.1501 0.1145 0.3400 +v 0.4719 0.1609 0.4330 +v 0.4469 0.1961 0.5344 +v 0.3795 0.1741 0.5108 +v 0.4814 0.1104 0.0381 +v 0.1195 0.0119 0.0230 +v 0.1960 0.1248 0.3897 +v 0.4828 0.1285 0.3328 +v 0.1209 0.0177 0.0726 +v 0.2565 0.1314 0.4389 +v 0.4769 0.1076 0.2326 +v 0.1172 0.0341 0.1236 +v 0.3167 0.1452 0.4773 +v 0.4800 0.1150 0.1348 +v 0.1093 0.0529 0.1762 +v 0.5506 0.1905 0.4553 +v 0.5588 0.1621 0.3501 +v 0.6425 0.1978 0.3592 +v 0.6299 0.2278 0.4674 +v 0.7306 0.2550 0.3723 +v 0.7099 0.2855 0.4836 +v 0.8190 0.3216 0.3778 +v 0.7931 0.3575 0.4912 +v 0.9134 0.3987 0.3815 +v 0.8912 0.4233 0.4977 +v 0.5549 0.1448 0.2442 +v 0.6386 0.1877 0.2499 +v 0.7339 0.2454 0.2607 +v 0.8247 0.3038 0.2618 +v 0.9205 0.3883 0.2671 +v 0.5570 0.1441 0.1399 +v 0.6416 0.1813 0.1408 +v 0.7326 0.2334 0.1492 +v 0.8301 0.2954 0.1478 +v 0.9258 0.3730 0.1538 +v 0.5555 0.1437 0.0383 +v 0.6379 0.1829 0.0344 +v 0.7273 0.2212 0.0398 +v 0.8231 0.2857 0.0367 +v 0.9232 0.3693 0.0422 +v 0.5218 0.2242 0.5621 +v 0.9943 0.4938 0.4988 +v 0.9628 0.5135 0.6103 +v 0.8570 0.4439 0.6137 +v 1.0237 0.4635 0.0509 +v 0.5955 0.2646 0.5744 +v 1.0111 0.4851 0.3861 +v 0.6752 0.3211 0.5903 +v 1.0194 0.4744 0.2740 +v 0.7633 0.3819 0.6024 +v 1.0235 0.4687 0.1621 +v 1.1108 0.5899 0.4929 +v 1.1180 0.5812 0.3847 +v 1.2392 0.7058 0.3558 +v 1.2255 0.7149 0.4643 +v 1.3222 0.8528 0.3314 +v 1.3193 0.8586 0.4345 +v 1.4105 1.0104 0.3018 +v 1.3947 1.0194 0.3998 +v 1.5085 1.1603 0.2855 +v 1.4767 1.1677 0.3729 +v 1.1304 0.5795 0.2749 +v 1.2465 0.6938 0.2506 +v 1.3394 0.8462 0.2269 +v 1.4320 0.9998 0.2041 +v 1.5278 1.1534 0.1962 +v 1.1372 0.5657 0.1651 +v 1.2576 0.6887 0.1454 +v 1.3512 0.8443 0.1232 +v 1.4498 0.9972 0.1069 +v 1.5362 1.1467 0.1075 +v 1.1357 0.5649 0.0566 +v 1.2545 0.6939 0.0408 +v 1.3681 0.8399 0.0227 +v 1.4578 0.9932 0.0120 +v 1.5352 1.1461 0.0198 +v 1.0851 0.6020 0.6007 +v 1.5271 1.3040 0.3401 +v 1.4967 1.3102 0.4182 +v 1.4417 1.1796 0.4551 +v 1.5686 1.2896 0.0224 +v 1.2076 0.7244 0.5728 +v 1.5482 1.2929 0.2617 +v 1.3003 0.8727 0.5319 +v 1.5649 1.2929 0.1811 +v 1.3705 1.0311 0.4939 +v 1.5650 1.2917 0.1019 +v 1.5571 1.4261 0.3077 +v 1.5746 1.4200 0.2345 +v 1.5854 1.5452 0.2066 +v 1.5747 1.5414 0.2697 +v 1.5889 1.6583 0.1703 +v 1.5800 1.6499 0.2243 +v 1.5781 1.7571 0.1267 +v 1.5713 1.7509 0.1704 +v 1.5521 1.8477 0.0812 +v 1.5544 1.8380 0.1119 +v 1.5818 1.4238 0.1649 +v 1.5917 1.5466 0.1453 +v 1.5934 1.6605 0.1154 +v 1.5789 1.7653 0.0799 +v 1.5498 1.8540 0.0477 +v 1.5822 1.4237 0.0961 +v 1.5927 1.5474 0.0840 +v 1.5995 1.6620 0.0612 +v 1.5766 1.7666 0.0338 +v 1.5508 1.8614 0.0144 +v 1.5805 1.4196 0.0256 +v 1.5948 1.5435 0.0222 +v 1.6003 1.6597 0.0089 +v 1.5782 1.7683 -0.0085 +v 1.5517 1.8650 -0.0160 +v 1.5371 1.4299 0.3842 +v 1.5363 1.9119 0.0480 +v 1.5386 1.8962 0.0628 +v 1.5523 1.8239 0.1365 +v 1.5239 1.9481 -0.0120 +v 1.5581 1.5449 0.3333 +v 1.5332 1.9258 0.0329 +v 1.5669 1.6429 0.2748 +v 1.5299 1.9353 0.0181 +v 1.5672 1.7397 0.2079 +v 1.5268 1.9425 0.0033 +# 650 vertices + +vn 0.1152 0.9920 0.0517 +vn 0.1311 0.9906 -0.0386 +vn 0.0547 0.9985 -0.0059 +vn 0.0495 0.9969 0.0612 +vn 0.1300 0.9860 0.1044 +vn 0.0526 0.9941 0.0953 +vn 0.1479 0.9826 0.1119 +vn 0.0702 0.9942 0.0816 +vn 0.1818 0.9769 0.1120 +vn 0.0858 0.9883 0.1264 +vn 0.2795 0.9580 -0.0635 +vn 0.2784 0.9392 -0.2011 +vn 0.2645 0.9625 0.0608 +vn 0.2242 0.9679 0.1135 +vn 0.2274 0.9680 0.1062 +vn 0.4208 0.8967 -0.1372 +vn 0.4118 0.8514 -0.3248 +vn 0.4033 0.9133 -0.0571 +vn 0.3488 0.9372 0.0010 +vn 0.3324 0.9410 0.0640 +vn 0.4948 0.8298 -0.2582 +vn 0.5076 0.7684 -0.3898 +vn 0.4589 0.8748 -0.1553 +vn 0.4183 0.9058 -0.0676 +vn 0.4045 0.9140 0.0327 +vn 0.0323 0.9994 -0.0123 +vn -0.0142 0.9987 -0.0486 +vn -0.0143 0.9999 -0.0067 +vn -0.0451 0.9857 0.1625 +vn -0.0592 0.9710 0.2316 +vn 0.0557 0.9771 0.2054 +vn 0.3963 0.9166 0.0527 +vn 0.3828 0.9223 0.0537 +vn 0.3998 0.9165 0.0157 +vn 0.5242 0.6972 -0.4889 +vn 0.5329 0.4637 -0.7077 +vn 0.4614 0.7964 -0.3910 +vn -0.0238 0.9971 0.0725 +vn 0.1603 0.9744 0.1574 +vn 0.4317 0.8936 -0.1230 +vn 0.3654 0.8524 -0.3741 +vn 0.0137 0.9970 0.0767 +vn 0.2307 0.9640 0.1323 +vn 0.4740 0.8452 -0.2471 +vn 0.3252 0.8914 -0.3157 +vn 0.0106 0.9961 0.0880 +vn 0.3292 0.9378 0.1105 +vn 0.5115 0.7941 -0.3283 +vn 0.1351 0.9871 -0.0854 +vn 0.1476 0.9545 0.2591 +vn 0.1382 0.9718 0.1911 +vn 0.0206 0.9771 0.2118 +vn 0.0092 0.9584 0.2852 +vn 0.1289 0.9139 0.3850 +vn 0.0449 0.9303 0.3640 +vn 0.1582 0.8776 0.4525 +vn 0.0823 0.8951 0.4381 +vn 0.1392 0.8314 0.5380 +vn 0.0932 0.8428 0.5301 +vn 0.2198 0.9409 0.2576 +vn 0.2265 0.9588 0.1716 +vn 0.2442 0.8914 0.3818 +vn 0.2700 0.8538 0.4451 +vn 0.2441 0.8255 0.5089 +vn 0.2985 0.9280 0.2231 +vn 0.3127 0.9413 0.1269 +vn 0.2879 0.8708 0.3985 +vn 0.2853 0.8428 0.4563 +vn 0.2800 0.8291 0.4839 +vn 0.3604 0.9168 0.1719 +vn 0.3712 0.9252 0.0789 +vn 0.3206 0.8905 0.3228 +vn 0.2324 0.8642 0.4462 +vn 0.2288 0.8531 0.4688 +vn -0.0605 0.9705 0.2334 +vn -0.0610 0.8471 0.5280 +vn -0.0796 0.8253 0.5591 +vn 0.0744 0.8161 0.5731 +vn 0.2130 0.7955 0.5673 +vn 0.2116 0.7924 0.5721 +vn 0.2029 0.8556 0.4763 +vn 0.3844 0.9219 0.0491 +vn -0.0726 0.9639 0.2562 +vn 0.1418 0.8104 0.5684 +vn 0.2328 0.8819 0.4100 +vn -0.0193 0.9535 0.3008 +vn 0.2258 0.7967 0.5606 +vn 0.3438 0.9034 0.2564 +vn -0.0421 0.9031 0.4273 +vn 0.2569 0.7882 0.5593 +vn 0.3614 0.9171 0.1684 +vn 0.1256 0.7425 0.6580 +vn 0.1345 0.7866 0.6026 +vn 0.0901 0.7917 0.6042 +vn 0.1061 0.7572 0.6445 +vn 0.1742 0.6801 0.7121 +vn 0.0926 0.6946 0.7134 +vn 0.1919 0.5999 0.7767 +vn 0.1044 0.6236 0.7748 +vn 0.2087 0.5037 0.8383 +vn 0.0660 0.5100 0.8576 +vn 0.1886 0.7310 0.6558 +vn 0.2128 0.7779 0.5913 +vn 0.2138 0.6629 0.7175 +vn 0.2261 0.5826 0.7807 +vn 0.2610 0.4871 0.8334 +vn 0.3170 0.7031 0.6366 +vn 0.2925 0.7587 0.5821 +vn 0.3291 0.6325 0.7012 +vn 0.3059 0.5709 0.7619 +vn 0.2679 0.4625 0.8452 +vn 0.3267 0.6759 0.6607 +vn 0.2582 0.7383 0.6231 +vn 0.3765 0.6042 0.7023 +vn 0.4098 0.5502 0.7276 +vn 0.3692 0.4138 0.8321 +vn -0.0374 0.8141 0.5796 +vn -0.0188 0.5050 0.8629 +vn -0.0380 0.3203 0.9465 +vn 0.0361 0.3346 0.9417 +vn 0.4006 0.2813 0.8720 +vn 0.4557 0.2432 0.8563 +vn 0.4474 0.3990 0.8004 +vn 0.2582 0.7264 0.6369 +vn -0.0112 0.7596 0.6503 +vn 0.1599 0.3283 0.9310 +vn 0.4035 0.5413 0.7377 +vn -0.0214 0.6959 0.7178 +vn 0.2456 0.3274 0.9124 +vn 0.3375 0.6050 0.7212 +vn -0.0183 0.6242 0.7811 +vn 0.3220 0.3200 0.8910 +vn 0.2868 0.6756 0.6792 +vn 0.1136 0.1943 0.9743 +vn 0.1384 0.2178 0.9661 +vn 0.0097 0.2228 0.9748 +vn 0.0459 0.2343 0.9711 +vn 0.1746 0.0974 0.9798 +vn 0.1114 0.1239 0.9860 +vn 0.1890 -0.0878 0.9780 +vn 0.1293 -0.0735 0.9889 +vn 0.2212 -0.1588 0.9622 +vn 0.1812 -0.1428 0.9730 +vn 0.1874 0.1833 0.9650 +vn 0.2117 0.2126 0.9539 +vn 0.2016 0.0704 0.9769 +vn 0.2148 -0.0882 0.9727 +vn 0.2184 -0.1620 0.9623 +vn 0.2526 0.1800 0.9507 +vn 0.2541 0.2031 0.9456 +vn 0.2004 0.0648 0.9776 +vn 0.2042 -0.0955 0.9743 +vn 0.2128 -0.1722 0.9618 +vn 0.3233 0.1366 0.9364 +vn 0.3400 0.1940 0.9202 +vn 0.3481 0.0350 0.9368 +vn 0.2332 -0.1075 0.9665 +vn 0.2283 -0.1997 0.9529 +vn -0.0270 0.2376 0.9710 +vn 0.0588 -0.1340 0.9892 +vn 0.0735 -0.1481 0.9862 +vn 0.1701 -0.1610 0.9722 +vn 0.3628 -0.2805 0.8887 +vn 0.6923 -0.6428 -0.3279 +vn 0.2122 -0.1680 0.9627 +vn 0.4033 0.2132 0.8899 +vn 0.0445 0.2675 0.9625 +vn 0.2270 -0.1661 0.9596 +vn 0.2818 -0.0820 0.9560 +vn 0.0258 0.1250 0.9918 +vn 0.2386 -0.1741 0.9554 +vn 0.4294 0.0356 0.9024 +vn 0.0230 -0.0669 0.9975 +vn 0.2704 -0.1896 0.9439 +vn 0.3091 0.1379 0.9410 +vn -0.3134 0.9315 -0.1847 +vn -0.3043 0.8995 -0.3136 +vn -0.4328 0.7924 -0.4299 +vn -0.4324 0.8528 -0.2927 +vn -0.3348 0.9376 -0.0942 +vn -0.3697 0.9040 -0.2147 +vn -0.2987 0.9530 -0.0500 +vn -0.3513 0.9305 -0.1032 +vn -0.2870 0.9579 0.0037 +vn -0.4040 0.9147 0.0077 +vn -0.2422 0.9626 -0.1211 +vn -0.2913 0.9406 -0.1743 +vn -0.2362 0.9704 -0.0499 +vn -0.2206 0.9752 0.0169 +vn -0.1534 0.9863 0.0603 +vn -0.1887 0.9786 -0.0821 +vn -0.2306 0.9705 -0.0699 +vn -0.1988 0.9800 -0.0077 +vn -0.1807 0.9748 0.1304 +vn -0.1123 0.9794 0.1677 +vn -0.0828 0.9966 0.0040 +vn -0.1362 0.9907 0.0042 +vn -0.0521 0.9980 0.0363 +vn -0.0996 0.9824 0.1580 +vn -0.1237 0.9725 0.1972 +vn -0.3945 0.7852 -0.4773 +vn -0.4549 0.6941 -0.5580 +vn -0.4563 0.7770 -0.4336 +vn -0.4450 0.8955 -0.0027 +vn -0.4187 0.9081 0.0005 +vn -0.3982 0.9161 0.0475 +vn -0.1020 0.9743 0.2008 +vn -0.1338 0.9904 -0.0334 +vn -0.4052 0.8437 -0.3522 +vn -0.3016 0.9465 0.1148 +vn -0.2529 0.9658 -0.0566 +vn -0.3679 0.8963 -0.2476 +vn -0.1375 0.9793 0.1484 +vn -0.3361 0.9287 -0.1567 +vn -0.4229 0.9035 -0.0695 +vn -0.0721 0.9813 0.1782 +vn -0.3247 0.8846 -0.3347 +vn -0.2611 0.9274 0.2680 +vn -0.2760 0.9452 0.1741 +vn -0.3906 0.9128 0.1192 +vn -0.4253 0.8685 0.2545 +vn -0.2943 0.8804 0.3718 +vn -0.4553 0.8143 0.3599 +vn -0.3356 0.8362 0.4338 +vn -0.4277 0.8215 0.3770 +vn -0.2954 0.8372 0.4602 +vn -0.3700 0.8487 0.3780 +vn -0.1659 0.9407 0.2961 +vn -0.1606 0.9594 0.2319 +vn -0.1751 0.9133 0.3678 +vn -0.2087 0.8742 0.4383 +vn -0.2145 0.8370 0.5033 +vn -0.0902 0.9608 0.2620 +vn -0.0659 0.9746 0.2139 +vn -0.1582 0.9198 0.3591 +vn -0.1569 0.8894 0.4294 +vn -0.1627 0.8422 0.5140 +vn -0.0752 0.9680 0.2392 +vn -0.0841 0.9677 0.2376 +vn -0.1011 0.9474 0.3036 +vn -0.1457 0.8896 0.4329 +vn -0.1440 0.8398 0.5234 +vn -0.4498 0.8864 0.1096 +vn -0.3895 0.8532 0.3469 +vn -0.3741 0.8376 0.3982 +vn -0.3155 0.8455 0.4308 +vn -0.1304 0.8339 0.5363 +vn -0.4878 0.8384 0.2431 +vn -0.2406 0.8344 0.4958 +vn -0.4747 0.8158 0.3303 +vn -0.1993 0.8321 0.5176 +vn -0.4044 0.8507 0.3357 +vn -0.1489 0.8374 0.5259 +vn -0.2312 0.6946 0.6813 +vn -0.1998 0.8173 0.5405 +vn -0.2860 0.7987 0.5295 +vn -0.2688 0.6925 0.6694 +vn -0.2331 0.6140 0.7541 +vn -0.2541 0.5928 0.7642 +vn -0.3053 0.5987 0.7405 +vn -0.3414 0.5385 0.7704 +vn -0.3736 0.4744 0.7971 +vn -0.4663 0.4175 0.7799 +vn -0.2033 0.7231 0.6601 +vn -0.1977 0.8109 0.5508 +vn -0.2436 0.6278 0.7393 +vn -0.2831 0.6160 0.7352 +vn -0.2554 0.5084 0.8224 +vn -0.1522 0.7406 0.6545 +vn -0.1631 0.8136 0.5580 +vn -0.2282 0.6392 0.7344 +vn -0.2086 0.6316 0.7467 +vn -0.1696 0.5045 0.8466 +vn -0.0839 0.7612 0.6431 +vn -0.1201 0.8170 0.5640 +vn -0.1382 0.6728 0.7268 +vn -0.1300 0.6180 0.7754 +vn -0.0660 0.5121 0.8564 +vn -0.3164 0.8136 0.4878 +vn -0.4951 0.3903 0.7762 +vn -0.4375 0.3677 0.8206 +vn -0.4137 0.3390 0.8450 +vn -0.1103 0.3095 0.9445 +vn -0.3040 0.7012 0.6448 +vn -0.3369 0.3331 0.8807 +vn -0.3278 0.5562 0.7637 +vn -0.2080 0.3345 0.9192 +vn -0.3828 0.4894 0.7836 +vn -0.1281 0.3285 0.9358 +vn -0.2330 0.1803 0.9556 +vn -0.2652 0.2678 0.9263 +vn -0.3473 0.2651 0.8995 +vn -0.3050 0.1711 0.9369 +vn -0.2196 0.0722 0.9729 +vn -0.2965 0.0361 0.9544 +vn -0.1977 -0.0952 0.9756 +vn -0.2556 -0.0896 0.9626 +vn -0.0700 -0.0761 0.9946 +vn -0.1605 -0.1128 0.9806 +vn -0.1542 0.2093 0.9656 +vn -0.1549 0.2705 0.9502 +vn -0.1872 0.0639 0.9802 +vn -0.0932 -0.0537 0.9942 +vn -0.1270 -0.1241 0.9841 +vn -0.1194 0.2344 0.9648 +vn -0.0944 0.2776 0.9560 +vn -0.1504 0.0720 0.9860 +vn -0.1065 -0.0710 0.9918 +vn -0.1472 -0.1321 0.9803 +vn -0.0544 0.2556 0.9652 +vn -0.0563 0.2732 0.9603 +vn -0.0865 0.0978 0.9914 +vn -0.1084 -0.0823 0.9907 +vn -0.0865 -0.1292 0.9878 +vn -0.3492 0.3157 0.8823 +vn -0.2655 -0.1862 0.9459 +vn 0.0206 0.0890 0.9958 +vn -0.1189 -0.0892 0.9889 +vn 0.0163 -0.1192 0.9927 +vn -0.3480 0.1585 0.9240 +vn -0.0117 -0.0071 0.9999 +vn -0.3248 0.0632 0.9437 +vn 0.0159 -0.0114 0.9998 +vn -0.2218 0.0235 0.9748 +vn 0.0026 -0.0731 0.9973 +vn -0.0514 -0.9987 0.0054 +vn -0.1293 -0.9912 0.0301 +vn -0.1237 -0.9911 -0.0501 +vn -0.0475 -0.9967 -0.0661 +vn -0.1315 -0.9853 -0.1086 +vn -0.0566 -0.9940 -0.0933 +vn -0.1525 -0.9811 -0.1190 +vn -0.0721 -0.9939 -0.0837 +vn -0.1869 -0.9760 -0.1117 +vn -0.0882 -0.9880 -0.1265 +vn -0.2925 -0.9357 0.1974 +vn -0.2871 -0.9568 0.0466 +vn -0.2697 -0.9608 -0.0637 +vn -0.2296 -0.9660 -0.1189 +vn -0.2310 -0.9673 -0.1043 +vn -0.4234 -0.8509 0.3112 +vn -0.4310 -0.8912 0.1410 +vn -0.4103 -0.9097 0.0632 +vn -0.3531 -0.9356 -0.0056 +vn -0.3302 -0.9417 -0.0641 +vn -0.5078 -0.7743 0.3778 +vn -0.4858 -0.8406 0.2394 +vn -0.4489 -0.8812 0.1486 +vn -0.4138 -0.9076 0.0717 +vn -0.3932 -0.9190 -0.0283 +vn 0.0180 -0.9980 0.0600 +vn -0.0231 -0.9996 0.0133 +vn 0.0201 -0.9998 0.0082 +vn -0.0585 -0.9769 -0.2057 +vn 0.0531 -0.9717 -0.2302 +vn 0.0456 -0.9859 -0.1608 +vn -0.3757 -0.9259 -0.0407 +vn -0.3892 -0.9205 -0.0352 +vn -0.3772 -0.9255 -0.0344 +vn -0.4731 -0.7875 0.3951 +vn -0.5379 -0.5325 0.6535 +vn -0.5191 -0.6953 0.4972 +vn 0.0219 -0.9975 -0.0677 +vn -0.1648 -0.9744 -0.1530 +vn -0.4178 -0.9001 0.1237 +vn -0.3766 -0.8540 0.3591 +vn -0.0151 -0.9970 -0.0764 +vn -0.2294 -0.9656 -0.1227 +vn -0.4463 -0.8707 0.2064 +vn -0.3234 -0.8913 0.3178 +vn -0.0054 -0.9954 -0.0960 +vn -0.3282 -0.9408 -0.0852 +vn -0.4904 -0.8127 0.3148 +vn -0.1265 -0.9888 0.0796 +vn -0.0206 -0.9742 -0.2246 +vn -0.1399 -0.9707 -0.1955 +vn -0.1381 -0.9511 -0.2763 +vn -0.0234 -0.9585 -0.2841 +vn -0.1377 -0.9119 -0.3866 +vn -0.0565 -0.9296 -0.3643 +vn -0.1632 -0.8786 -0.4488 +vn -0.0917 -0.8950 -0.4366 +vn -0.1461 -0.8368 -0.5277 +vn -0.0887 -0.8467 -0.5246 +vn -0.2153 -0.9610 -0.1738 +vn -0.2119 -0.9384 -0.2728 +vn -0.2375 -0.8879 -0.3939 +vn -0.2675 -0.8571 -0.4401 +vn -0.2440 -0.8279 -0.5051 +vn -0.3037 -0.9445 -0.1252 +vn -0.2920 -0.9251 -0.2429 +vn -0.2738 -0.8672 -0.4159 +vn -0.2765 -0.8456 -0.4566 +vn -0.2731 -0.8341 -0.4793 +vn -0.3739 -0.9245 -0.0737 +vn -0.3662 -0.9135 -0.1775 +vn -0.3063 -0.8887 -0.3411 +vn -0.2282 -0.8626 -0.4515 +vn -0.2281 -0.8578 -0.4607 +vn 0.0493 -0.9718 -0.2308 +vn -0.0752 -0.8194 -0.5682 +vn 0.0768 -0.8298 -0.5527 +vn 0.0649 -0.8507 -0.5217 +vn -0.2081 -0.7936 -0.5717 +vn -0.2066 -0.7983 -0.5657 +vn -0.2158 -0.8610 -0.4605 +vn -0.3830 -0.9216 -0.0626 +vn 0.0589 -0.9650 -0.2555 +vn -0.1486 -0.8119 -0.5645 +vn -0.2267 -0.8764 -0.4248 +vn 0.0197 -0.9504 -0.3103 +vn -0.2313 -0.7970 -0.5580 +vn -0.3342 -0.9023 -0.2724 +vn 0.0470 -0.8998 -0.4337 +vn -0.2464 -0.7910 -0.5600 +vn -0.3785 -0.9132 -0.1513 +vn -0.0875 -0.7893 -0.6077 +vn -0.1346 -0.7838 -0.6063 +vn -0.1276 -0.7447 -0.6551 +vn -0.0992 -0.7562 -0.6468 +vn -0.1683 -0.6811 -0.7125 +vn -0.0867 -0.6977 -0.7112 +vn -0.2004 -0.5991 -0.7752 +vn -0.1027 -0.6254 -0.7735 +vn -0.2091 -0.5023 -0.8390 +vn -0.0613 -0.5079 -0.8592 +vn -0.2195 -0.7781 -0.5885 +vn -0.1882 -0.7330 -0.6537 +vn -0.2120 -0.6653 -0.7158 +vn -0.2243 -0.5792 -0.7837 +vn -0.2629 -0.4910 -0.8306 +vn -0.2827 -0.7624 -0.5821 +vn -0.3098 -0.7100 -0.6324 +vn -0.3217 -0.6367 -0.7008 +vn -0.3015 -0.5683 -0.7656 +vn -0.2682 -0.4625 -0.8451 +vn -0.2550 -0.7405 -0.6218 +vn -0.3229 -0.6807 -0.6576 +vn -0.3783 -0.6029 -0.7024 +vn -0.4118 -0.5450 -0.7304 +vn -0.3686 -0.4079 -0.8353 +vn 0.0461 -0.8075 -0.5880 +vn -0.0469 -0.3371 -0.9403 +vn 0.0378 -0.3291 -0.9435 +vn 0.0204 -0.5074 -0.8615 +vn -0.4626 -0.2398 -0.8535 +vn -0.4021 -0.2777 -0.8725 +vn -0.4447 -0.4010 -0.8009 +vn -0.2676 -0.7229 -0.6371 +vn 0.0137 -0.7585 -0.6516 +vn -0.1574 -0.3336 -0.9295 +vn -0.4118 -0.5351 -0.7376 +vn 0.0101 -0.7012 -0.7129 +vn -0.2420 -0.3320 -0.9117 +vn -0.3572 -0.5981 -0.7174 +vn 0.0196 -0.6220 -0.7828 +vn -0.3254 -0.3169 -0.8909 +vn -0.3043 -0.6732 -0.6739 +vn -0.0133 -0.2217 -0.9750 +vn -0.1395 -0.2221 -0.9650 +vn -0.1140 -0.1930 -0.9746 +vn -0.0433 -0.2326 -0.9716 +vn -0.1793 -0.0952 -0.9792 +vn -0.1042 -0.1241 -0.9868 +vn -0.1776 0.0907 -0.9799 +vn -0.1072 0.0683 -0.9919 +vn -0.2045 0.1547 -0.9666 +vn -0.1664 0.1362 -0.9766 +vn -0.2171 -0.2148 -0.9522 +vn -0.1906 -0.1798 -0.9651 +vn -0.2043 -0.0714 -0.9763 +vn -0.2192 0.0878 -0.9717 +vn -0.2312 0.1647 -0.9589 +vn -0.2705 -0.2014 -0.9414 +vn -0.2618 -0.1758 -0.9490 +vn -0.2114 -0.0679 -0.9750 +vn -0.2014 0.1037 -0.9740 +vn -0.2521 0.1887 -0.9491 +vn -0.3395 -0.1906 -0.9211 +vn -0.3348 -0.1370 -0.9323 +vn -0.3524 -0.0400 -0.9350 +vn -0.2558 0.1238 -0.9588 +vn -0.2214 0.1748 -0.9594 +vn 0.0319 -0.2354 -0.9714 +vn -0.1481 0.1606 -0.9758 +vn -0.0634 0.1567 -0.9856 +vn -0.0762 0.1273 -0.9889 +vn -0.6711 0.6197 -0.4071 +vn -0.3313 0.2545 -0.9086 +vn -0.1844 0.1692 -0.9682 +vn -0.3895 -0.2082 -0.8972 +vn -0.0409 -0.2676 -0.9627 +vn -0.1834 0.1602 -0.9699 +vn -0.3145 0.0835 -0.9456 +vn -0.0238 -0.1275 -0.9916 +vn -0.2088 0.1682 -0.9634 +vn -0.4225 -0.0402 -0.9055 +vn -0.0296 0.0614 -0.9977 +vn -0.2839 0.1918 -0.9395 +vn -0.3285 -0.1351 -0.9348 +vn 0.4392 -0.7910 0.4259 +vn 0.2943 -0.9075 0.2998 +vn 0.3148 -0.9331 0.1739 +vn 0.4288 -0.8564 0.2877 +vn 0.3346 -0.9365 0.1049 +vn 0.3677 -0.9022 0.2255 +vn 0.3020 -0.9518 0.0546 +vn 0.3614 -0.9268 0.1023 +vn 0.2945 -0.9556 -0.0059 +vn 0.4045 -0.9145 -0.0089 +vn 0.2866 -0.9421 0.1739 +vn 0.2422 -0.9617 0.1281 +vn 0.2365 -0.9698 0.0594 +vn 0.2212 -0.9752 -0.0095 +vn 0.1560 -0.9859 -0.0610 +vn 0.2297 -0.9703 0.0756 +vn 0.1915 -0.9781 0.0819 +vn 0.2013 -0.9795 0.0019 +vn 0.1745 -0.9765 -0.1263 +vn 0.1091 -0.9811 -0.1599 +vn 0.1300 -0.9915 0.0016 +vn 0.0771 -0.9970 0.0049 +vn 0.0565 -0.9975 -0.0433 +vn 0.1018 -0.9817 -0.1608 +vn 0.1184 -0.9752 -0.1872 +vn 0.4627 -0.6647 0.5866 +vn 0.3869 -0.7911 0.4738 +vn 0.4628 -0.7696 0.4400 +vn 0.4054 -0.9128 -0.0494 +vn 0.4183 -0.9083 -0.0083 +vn 0.4426 -0.8967 0.0007 +vn 0.0963 -0.9753 -0.1985 +vn 0.1305 -0.9909 0.0337 +vn 0.4013 -0.8424 0.3597 +vn 0.3090 -0.9444 -0.1122 +vn 0.2506 -0.9661 0.0623 +vn 0.3831 -0.8887 0.2518 +vn 0.1433 -0.9781 -0.1509 +vn 0.3384 -0.9255 0.1702 +vn 0.4266 -0.9016 0.0720 +vn 0.0722 -0.9817 -0.1761 +vn 0.3132 -0.8949 0.3180 +vn 0.3910 -0.9130 -0.1163 +vn 0.2800 -0.9433 -0.1783 +vn 0.2592 -0.9275 -0.2694 +vn 0.4257 -0.8692 -0.2515 +vn 0.2972 -0.8788 -0.3733 +vn 0.4590 -0.8114 -0.3618 +vn 0.3372 -0.8345 -0.4359 +vn 0.4266 -0.8212 -0.3791 +vn 0.2973 -0.8379 -0.4578 +vn 0.3600 -0.8557 -0.3718 +vn 0.1686 -0.9533 -0.2506 +vn 0.1624 -0.9396 -0.3012 +vn 0.1721 -0.9157 -0.3632 +vn 0.2076 -0.8741 -0.4392 +vn 0.2120 -0.8391 -0.5010 +vn 0.0727 -0.9718 -0.2241 +vn 0.1085 -0.9551 -0.2756 +vn 0.1594 -0.9210 -0.3555 +vn 0.1498 -0.8904 -0.4298 +vn 0.1638 -0.8414 -0.5151 +vn 0.0817 -0.9674 -0.2397 +vn 0.0849 -0.9649 -0.2485 +vn 0.1125 -0.9416 -0.3175 +vn 0.1463 -0.8862 -0.4396 +vn 0.1370 -0.8472 -0.5133 +vn 0.4396 -0.8914 -0.1104 +vn 0.3122 -0.8480 -0.4284 +vn 0.3705 -0.8406 -0.3951 +vn 0.3787 -0.8594 -0.3437 +vn 0.1397 -0.8334 -0.5347 +vn 0.4887 -0.8362 -0.2489 +vn 0.2430 -0.8351 -0.4935 +vn 0.4704 -0.8176 -0.3321 +vn 0.1937 -0.8366 -0.5124 +vn 0.3917 -0.8572 -0.3344 +vn 0.1502 -0.8390 -0.5231 +vn 0.2816 -0.7980 -0.5328 +vn 0.2024 -0.8155 -0.5422 +vn 0.2388 -0.6943 -0.6790 +vn 0.2644 -0.6955 -0.6681 +vn 0.2279 -0.6135 -0.7561 +vn 0.2505 -0.5941 -0.7644 +vn 0.3007 -0.5993 -0.7419 +vn 0.3362 -0.5400 -0.7716 +vn 0.3712 -0.4847 -0.7920 +vn 0.4589 -0.4281 -0.7785 +vn 0.2085 -0.8092 -0.5493 +vn 0.2150 -0.7199 -0.6599 +vn 0.2414 -0.6259 -0.7416 +vn 0.2953 -0.6135 -0.7324 +vn 0.2650 -0.5101 -0.8183 +vn 0.1534 -0.8211 -0.5498 +vn 0.1490 -0.7414 -0.6543 +vn 0.2339 -0.6351 -0.7362 +vn 0.2205 -0.6303 -0.7444 +vn 0.1657 -0.5090 -0.8447 +vn 0.1181 -0.8156 -0.5665 +vn 0.0661 -0.7679 -0.6372 +vn 0.1325 -0.6752 -0.7257 +vn 0.1275 -0.6167 -0.7768 +vn 0.0611 -0.5144 -0.8554 +vn 0.3192 -0.8092 -0.4933 +vn 0.4200 -0.3322 -0.8445 +vn 0.4461 -0.3575 -0.8205 +vn 0.4961 -0.3963 -0.7725 +vn 0.1144 -0.3118 -0.9432 +vn 0.2879 -0.7122 -0.6403 +vn 0.3349 -0.3368 -0.8800 +vn 0.3385 -0.5472 -0.7655 +vn 0.2040 -0.3374 -0.9190 +vn 0.3909 -0.4839 -0.7829 +vn 0.1295 -0.3268 -0.9362 +vn 0.3459 -0.2647 -0.9001 +vn 0.2654 -0.2650 -0.9270 +vn 0.2316 -0.1826 -0.9555 +vn 0.2991 -0.1741 -0.9382 +vn 0.2180 -0.0659 -0.9737 +vn 0.3043 -0.0273 -0.9522 +vn 0.1946 0.0859 -0.9771 +vn 0.2570 0.0920 -0.9620 +vn 0.0761 0.0789 -0.9940 +vn 0.2438 0.2027 -0.9484 +vn 0.1580 -0.2675 -0.9505 +vn 0.1598 -0.2032 -0.9660 +vn 0.1791 -0.0667 -0.9816 +vn 0.0980 0.0584 -0.9935 +vn 0.1159 0.1239 -0.9855 +vn 0.0956 -0.2777 -0.9559 +vn 0.1199 -0.2318 -0.9653 +vn 0.1469 -0.0666 -0.9869 +vn 0.0921 0.0622 -0.9938 +vn 0.1412 0.1338 -0.9809 +vn 0.0586 -0.2730 -0.9602 +vn 0.0548 -0.2550 -0.9654 +vn 0.0828 -0.0998 -0.9916 +vn 0.0937 0.0723 -0.9930 +vn 0.0687 0.1258 -0.9897 +vn 0.3521 -0.3158 -0.8811 +vn 0.1791 0.1687 -0.9693 +vn 0.3843 0.4949 0.7794 +vn 0.3786 0.3009 -0.8753 +vn 0.0013 0.1352 -0.9908 +vn 0.3429 -0.1672 -0.9244 +vn -0.0097 0.0066 -0.9999 +vn 0.3397 -0.0423 -0.9396 +vn -0.0187 0.0245 -0.9995 +vn 0.2333 -0.0212 -0.9722 +vn 0.0073 0.0881 -0.9961 +vn -0.0667 -0.0809 0.9945 +vn -0.0497 0.0069 0.9987 +vn -0.0368 -0.0150 0.9992 +vn -0.0633 -0.0839 0.9945 +vn -0.8723 0.3576 0.3334 +vn -0.8472 0.2774 0.4531 +vn -0.8416 0.2620 0.4722 +vn -0.8683 0.3616 0.3395 +vn -0.3264 0.7360 0.5931 +vn -0.2597 0.7959 0.5468 +vn -0.2649 0.7835 0.5620 +vn -0.3359 0.7184 0.6092 +vn 0.2927 0.5253 0.7990 +vn 0.2468 0.3920 0.8863 +vn 0.2542 0.4206 0.8709 +vn 0.3038 0.5563 0.7735 +vn -0.7388 0.4119 0.5335 +vn -0.7497 0.3760 0.5446 +vn 0.2024 0.3044 0.9308 +vn 0.1999 0.3428 0.9179 +vn -0.5942 0.6007 0.5348 +vn -0.6023 0.5787 0.5499 +vn 0.0877 0.1430 0.9858 +vn 0.0740 0.2137 0.9741 +vn -0.4708 0.6296 0.6181 +vn -0.4789 0.6149 0.6266 +vn -0.0326 -0.0507 0.9982 +vn -0.0485 -0.0026 0.9988 +vn -0.9468 0.2807 0.1574 +vn -0.9763 0.1656 0.1393 +vn -0.9760 0.1674 0.1396 +vn -0.9463 0.2838 0.1546 +vn -0.8706 0.3851 0.3060 +vn -0.8739 0.3777 0.3059 +vn -0.9468 0.2586 0.1917 +vn -0.9510 0.2492 0.1832 +vn -0.9066 0.3153 0.2806 +vn -0.9068 0.3079 0.2880 +vn -0.9086 0.2602 0.3266 +vn -0.9103 0.2517 0.3287 +vn -0.8510 0.4932 0.1805 +vn -0.8899 0.4260 0.1634 +vn -0.8866 0.4343 0.1590 +vn -0.8502 0.4949 0.1795 +vn -0.9680 0.2487 0.0341 +vn -0.9697 0.2428 0.0286 +vn -0.8937 0.4075 0.1876 +vn -0.8914 0.4099 0.1934 +vn -0.9543 0.2932 0.0582 +vn -0.9511 0.3018 0.0653 +vn -0.9802 0.1980 -0.0103 +vn -0.9801 0.1986 -0.0078 +vn 0.0154 0.9946 0.1030 +vn -0.1079 0.9822 0.1538 +vn -0.1511 0.9799 0.1300 +vn -0.0327 0.9967 0.0741 +vn -0.5894 0.7167 0.3729 +vn -0.6828 0.6744 0.2808 +vn -0.6713 0.6829 0.2880 +vn -0.6218 0.6994 0.3525 +vn -0.6126 0.7367 0.2864 +vn -0.6567 0.7117 0.2496 +vn -0.8650 0.4872 0.1200 +vn -0.8686 0.4818 0.1159 +vn -0.2437 0.9494 0.1984 +vn -0.2622 0.9455 0.1930 +vn -0.7298 0.6369 0.2485 +vn -0.7292 0.6355 0.2538 +vn -0.4581 0.8668 0.1969 +vn -0.4441 0.8715 0.2081 +vn -0.7575 0.6192 0.2070 +vn -0.7511 0.6233 0.2175 +vn -0.5683 0.7957 0.2095 +vn -0.5728 0.7940 0.2037 +vn -0.8472 0.5296 0.0420 +vn -0.8463 0.5304 0.0492 +vn 0.4321 0.7082 0.5583 +vn 0.3662 0.7366 0.5687 +vn 0.3563 0.7450 0.5639 +vn 0.4415 0.6980 0.5638 +vn -0.2331 0.3549 0.9054 +vn -0.3280 0.4681 0.8206 +vn -0.2979 0.4473 0.8433 +vn -0.2156 0.3444 0.9137 +vn 0.8226 0.2737 0.4984 +vn 0.8961 0.1682 0.4108 +vn 0.8934 0.1757 0.4135 +vn 0.8109 0.2974 0.5039 +vn -0.0623 0.0501 0.9968 +vn -0.0716 0.0598 0.9956 +vn 0.5112 0.5952 0.6199 +vn 0.4873 0.6220 0.6129 +vn -0.0319 -0.0718 0.9969 +vn -0.0345 -0.0649 0.9973 +vn 0.6701 0.4515 0.5891 +vn 0.6583 0.4674 0.5900 +vn -0.1028 0.0442 0.9937 +vn -0.0624 0.0049 0.9980 +vn 0.7034 0.4150 0.5771 +vn 0.6921 0.4301 0.5796 +vn -0.2753 0.3124 0.9092 +vn -0.2457 0.2875 0.9257 +vn 0.9035 0.2374 0.3568 +vn 0.9048 0.2300 0.3583 +vn 0.8978 0.3641 0.2479 +vn 0.8908 0.4124 0.1907 +vn 0.8923 0.4101 0.1888 +vn 0.9013 0.3613 0.2390 +vn 0.9028 0.2817 0.3251 +vn 0.9038 0.2792 0.3243 +vn 0.9035 0.2782 0.3260 +vn 0.9025 0.2797 0.3274 +vn 0.9205 0.2737 0.2790 +vn 0.9217 0.2716 0.2769 +vn 0.8757 0.4447 0.1882 +vn 0.8751 0.4453 0.1896 +vn 0.8123 0.4832 0.3266 +vn 0.8363 0.4598 0.2986 +vn 0.8350 0.4604 0.3014 +vn 0.8120 0.4831 0.3274 +vn 0.9009 0.4128 0.1341 +vn 0.9017 0.4120 0.1313 +vn 0.8553 0.4551 0.2476 +vn 0.8588 0.4505 0.2438 +vn 0.8315 0.4632 0.3065 +vn 0.8332 0.4624 0.3031 +vn 0.8282 0.4907 0.2709 +vn 0.8291 0.4916 0.2661 +vn 0.7203 0.6797 0.1382 +vn 0.5666 0.7381 -0.3663 +vn 0.4986 0.7572 -0.4219 +vn 0.7218 0.6687 0.1784 +vn 0.6410 0.7673 -0.0198 +vn 0.5396 0.8274 -0.1555 +vn 0.2025 0.9781 0.0475 +vn 0.1694 0.9851 0.0310 +vn 0.7649 0.5626 0.3139 +vn 0.7632 0.5659 0.3118 +vn 0.5644 0.8217 0.0795 +vn 0.5296 0.8474 0.0368 +vn 0.7571 0.6149 0.2208 +vn 0.7541 0.6172 0.2244 +vn 0.4651 0.8810 0.0862 +vn 0.4682 0.8789 0.0909 +vn 0.7301 0.6546 0.1959 +vn 0.7246 0.6615 0.1935 +vn 0.3567 0.9334 0.0399 +vn 0.3673 0.9285 0.0551 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_12 +s 1 +f 7801/3901/9577 7802/3902/9578 7803/3903/9579 7804/3904/9580 +f 7805/3905/9581 7801/3901/9577 7804/3904/9580 7806/3906/9582 +f 7807/3907/9583 7805/3905/9581 7806/3906/9582 7808/3908/9584 +f 7809/3909/9585 7807/3907/9583 7808/3908/9584 7810/3910/9586 +f 7811/3911/9587 7812/3912/9588 7802/3902/9578 7801/3901/9577 +f 7813/3913/9589 7811/3911/9587 7801/3901/9577 7805/3905/9581 +f 7814/3914/9590 7813/3913/9589 7805/3905/9581 7807/3907/9583 +f 7815/3915/9591 7814/3914/9590 7807/3907/9583 7809/3909/9585 +f 7816/3916/9592 7817/3917/9593 7812/3912/9588 7811/3911/9587 +f 7818/3918/9594 7816/3916/9592 7811/3911/9587 7813/3913/9589 +f 7819/3919/9595 7818/3918/9594 7813/3913/9589 7814/3914/9590 +f 7820/3920/9596 7819/3919/9595 7814/3914/9590 7815/3915/9591 +f 7821/3921/9597 7822/3922/9598 7817/3917/9593 7816/3916/9592 +f 7823/3923/9599 7821/3921/9597 7816/3916/9592 7818/3918/9594 +f 7824/3924/9600 7823/3923/9599 7818/3918/9594 7819/3919/9595 +f 7825/3925/9601 7824/3924/9600 7819/3919/9595 7820/3920/9596 +f 7803/3903/9579 7826/3926/9602 7827/3927/9603 7828/3928/9604 +f 7829/3929/9605 7830/3930/9606 7831/3931/9607 7810/3910/9586 +f 7825/3925/9601 7832/3932/9608 7833/3933/9609 7834/3934/9610 +f 7835/3935/9611 7836/3936/9612 7837/3937/9613 7822/3922/9598 +f 7804/3904/9580 7803/3903/9579 7828/3928/9604 7838/3938/9614 +f 7810/3910/9586 7831/3931/9607 7839/3939/9615 7809/3909/9585 +f 7824/3924/9600 7825/3925/9601 7834/3934/9610 7840/3940/9616 +f 7822/3922/9598 7837/3937/9613 7841/3941/9617 7817/3917/9593 +f 7806/3906/9582 7804/3904/9580 7838/3938/9614 7842/3942/9618 +f 7809/3909/9585 7839/3939/9615 7843/3943/9619 7815/3915/9591 +f 7823/3923/9599 7824/3924/9600 7840/3940/9616 7844/3944/9620 +f 7817/3917/9593 7841/3941/9617 7845/3945/9621 7812/3912/9588 +f 7808/3908/9584 7806/3906/9582 7842/3942/9618 7846/3946/9622 +f 7815/3915/9591 7843/3943/9619 7847/3947/9623 7820/3920/9596 +f 7821/3921/9597 7823/3923/9599 7844/3944/9620 7848/3948/9624 +f 7812/3912/9588 7845/3945/9621 7849/3949/9625 7802/3902/9578 +f 7810/3910/9586 7808/3908/9584 7846/3946/9622 7829/3929/9605 +f 7820/3920/9596 7847/3947/9623 7832/3932/9608 7825/3925/9601 +f 7822/3922/9598 7821/3921/9597 7848/3948/9624 7835/3935/9611 +f 7802/3902/9578 7849/3949/9625 7826/3926/9602 7803/3903/9579 +f 7850/3950/9626 7851/3951/9627 7852/3952/9628 7853/3953/9629 +f 7854/3954/9630 7850/3950/9626 7853/3953/9629 7855/3955/9631 +f 7856/3956/9632 7854/3954/9630 7855/3955/9631 7857/3957/9633 +f 7858/3958/9634 7856/3956/9632 7857/3957/9633 7859/3959/9635 +f 7860/3960/9636 7861/3961/9637 7851/3951/9627 7850/3950/9626 +f 7862/3962/9638 7860/3960/9636 7850/3950/9626 7854/3954/9630 +f 7863/3963/9639 7862/3962/9638 7854/3954/9630 7856/3956/9632 +f 7864/3964/9640 7863/3963/9639 7856/3956/9632 7858/3958/9634 +f 7865/3965/9641 7866/3966/9642 7861/3961/9637 7860/3960/9636 +f 7867/3967/9643 7865/3965/9641 7860/3960/9636 7862/3962/9638 +f 7868/3968/9644 7867/3967/9643 7862/3962/9638 7863/3963/9639 +f 7869/3969/9645 7868/3968/9644 7863/3963/9639 7864/3964/9640 +f 7870/3970/9646 7871/3971/9647 7866/3966/9642 7865/3965/9641 +f 7872/3972/9648 7870/3970/9646 7865/3965/9641 7867/3967/9643 +f 7873/3973/9649 7872/3972/9648 7867/3967/9643 7868/3968/9644 +f 7874/3974/9650 7873/3973/9649 7868/3968/9644 7869/3969/9645 +f 7852/3952/9628 7831/3931/9607 7830/3930/9606 7875/3975/9651 +f 7876/3976/9652 7877/3977/9653 7878/3978/9654 7859/3959/9635 +f 7874/3974/9650 7879/3979/9655 7880/3980/9656 7881/3981/9657 +f 7882/3982/9658 7833/3933/9609 7832/3932/9608 7871/3971/9647 +f 7853/3953/9629 7852/3952/9628 7875/3975/9651 7883/3983/9659 +f 7859/3959/9635 7878/3978/9654 7884/3984/9660 7858/3958/9634 +f 7873/3973/9649 7874/3974/9650 7881/3981/9657 7885/3985/9661 +f 7871/3971/9647 7832/3932/9608 7847/3947/9623 7866/3966/9642 +f 7855/3955/9631 7853/3953/9629 7883/3983/9659 7886/3986/9662 +f 7858/3958/9634 7884/3984/9660 7887/3987/9663 7864/3964/9640 +f 7872/3972/9648 7873/3973/9649 7885/3985/9661 7888/3988/9664 +f 7866/3966/9642 7847/3947/9623 7843/3943/9619 7861/3961/9637 +f 7857/3957/9633 7855/3955/9631 7886/3986/9662 7889/3989/9665 +f 7864/3964/9640 7887/3987/9663 7890/3990/9666 7869/3969/9645 +f 7870/3970/9646 7872/3972/9648 7888/3988/9664 7891/3991/9667 +f 7861/3961/9637 7843/3943/9619 7839/3939/9615 7851/3951/9627 +f 7859/3959/9635 7857/3957/9633 7889/3989/9665 7876/3976/9652 +f 7869/3969/9645 7890/3990/9666 7879/3979/9655 7874/3974/9650 +f 7871/3971/9647 7870/3970/9646 7891/3991/9667 7882/3982/9658 +f 7851/3951/9627 7839/3939/9615 7831/3931/9607 7852/3952/9628 +f 7892/3992/9668 7893/3993/9669 7894/3994/9670 7895/3995/9671 +f 7896/3996/9672 7892/3992/9668 7895/3995/9671 7897/3997/9673 +f 7898/3998/9674 7896/3996/9672 7897/3997/9673 7899/3999/9675 +f 7900/4000/9676 7898/3998/9674 7899/3999/9675 7901/4001/9677 +f 7902/4002/9678 7903/4003/9679 7893/3993/9669 7892/3992/9668 +f 7904/4004/9680 7902/4002/9678 7892/3992/9668 7896/3996/9672 +f 7905/4005/9681 7904/4004/9680 7896/3996/9672 7898/3998/9674 +f 7906/4006/9682 7905/4005/9681 7898/3998/9674 7900/4000/9676 +f 7907/4007/9683 7908/4008/9684 7903/4003/9679 7902/4002/9678 +f 7909/4009/9685 7907/4007/9683 7902/4002/9678 7904/4004/9680 +f 7910/4010/9686 7909/4009/9685 7904/4004/9680 7905/4005/9681 +f 7911/4011/9687 7910/4010/9686 7905/4005/9681 7906/4006/9682 +f 7912/4012/9688 7913/4013/9689 7908/4008/9684 7907/4007/9683 +f 7914/4014/9690 7912/4012/9688 7907/4007/9683 7909/4009/9685 +f 7915/4015/9691 7914/4014/9690 7909/4009/9685 7910/4010/9686 +f 7916/4016/9692 7915/4015/9691 7910/4010/9686 7911/4011/9687 +f 7894/3994/9670 7878/3978/9654 7877/3977/9653 7917/4017/9693 +f 7918/4018/9694 7919/4019/9695 7920/4020/9696 7901/4001/9677 +f 7916/4016/9692 7921/4021/9697 7922/4022/9698 7923/4023/9699 +f 7924/4024/9700 7880/3980/9656 7879/3979/9655 7913/4013/9689 +f 7895/3995/9671 7894/3994/9670 7917/4017/9693 7925/4025/9701 +f 7901/4001/9677 7920/4020/9696 7926/4026/9702 7900/4000/9676 +f 7915/4015/9691 7916/4016/9692 7923/4023/9699 7927/4027/9703 +f 7913/4013/9689 7879/3979/9655 7890/3990/9666 7908/4008/9684 +f 7897/3997/9673 7895/3995/9671 7925/4025/9701 7928/4028/9704 +f 7900/4000/9676 7926/4026/9702 7929/4029/9705 7906/4006/9682 +f 7914/4014/9690 7915/4015/9691 7927/4027/9703 7930/4030/9706 +f 7908/4008/9684 7890/3990/9666 7887/3987/9663 7903/4003/9679 +f 7899/3999/9675 7897/3997/9673 7928/4028/9704 7931/4031/9707 +f 7906/4006/9682 7929/4029/9705 7932/4032/9708 7911/4011/9687 +f 7912/4012/9688 7914/4014/9690 7930/4030/9706 7933/4033/9709 +f 7903/4003/9679 7887/3987/9663 7884/3984/9660 7893/3993/9669 +f 7901/4001/9677 7899/3999/9675 7931/4031/9707 7918/4018/9694 +f 7911/4011/9687 7932/4032/9708 7921/4021/9697 7916/4016/9692 +f 7913/4013/9689 7912/4012/9688 7933/4033/9709 7924/4024/9700 +f 7893/3993/9669 7884/3984/9660 7878/3978/9654 7894/3994/9670 +f 7934/4034/9710 7935/4035/9711 7936/4036/9712 7937/4037/9713 +f 7938/4038/9714 7934/4034/9710 7937/4037/9713 7939/4039/9715 +f 7940/4040/9716 7938/4038/9714 7939/4039/9715 7941/4041/9717 +f 7942/4042/9718 7940/4040/9716 7941/4041/9717 7943/4043/9719 +f 7944/4044/9720 7945/4045/9721 7935/4035/9711 7934/4034/9710 +f 7946/4046/9722 7944/4044/9720 7934/4034/9710 7938/4038/9714 +f 7947/4047/9723 7946/4046/9722 7938/4038/9714 7940/4040/9716 +f 7948/4048/9724 7947/4047/9723 7940/4040/9716 7942/4042/9718 +f 7949/4049/9725 7950/4050/9726 7945/4045/9721 7944/4044/9720 +f 7951/4051/9727 7949/4049/9725 7944/4044/9720 7946/4046/9722 +f 7952/4052/9728 7951/4051/9727 7946/4046/9722 7947/4047/9723 +f 7953/4053/9729 7952/4052/9728 7947/4047/9723 7948/4048/9724 +f 7954/4054/9730 7955/4055/9731 7950/4050/9726 7949/4049/9725 +f 7956/4056/9732 7954/4054/9730 7949/4049/9725 7951/4051/9727 +f 7957/4057/9733 7956/4056/9732 7951/4051/9727 7952/4052/9728 +f 7958/4058/9734 7957/4057/9733 7952/4052/9728 7953/4053/9729 +f 7936/4036/9712 7920/4020/9696 7919/4019/9695 7959/4059/9735 +f 7960/4060/9736 7961/4061/9737 7962/4062/9738 7943/4043/9719 +f 7958/4058/9734 7963/4063/9739 7964/4064/9740 7965/4065/9741 +f 7966/4066/9742 7922/4022/9698 7921/4021/9697 7955/4055/9731 +f 7937/4037/9713 7936/4036/9712 7959/4059/9735 7967/4067/9743 +f 7943/4043/9719 7962/4062/9738 7968/4068/9744 7942/4042/9718 +f 7957/4057/9733 7958/4058/9734 7965/4065/9741 7969/4069/9745 +f 7955/4055/9731 7921/4021/9697 7932/4032/9708 7950/4050/9726 +f 7939/4039/9715 7937/4037/9713 7967/4067/9743 7970/4070/9746 +f 7942/4042/9718 7968/4068/9744 7971/4071/9747 7948/4048/9724 +f 7956/4056/9732 7957/4057/9733 7969/4069/9745 7972/4072/9748 +f 7950/4050/9726 7932/4032/9708 7929/4029/9705 7945/4045/9721 +f 7941/4041/9717 7939/4039/9715 7970/4070/9746 7973/4073/9749 +f 7948/4048/9724 7971/4071/9747 7974/4074/9750 7953/4053/9729 +f 7954/4054/9730 7956/4056/9732 7972/4072/9748 7975/4075/9751 +f 7945/4045/9721 7929/4029/9705 7926/4026/9702 7935/4035/9711 +f 7943/4043/9719 7941/4041/9717 7973/4073/9749 7960/4060/9736 +f 7953/4053/9729 7974/4074/9750 7963/4063/9739 7958/4058/9734 +f 7955/4055/9731 7954/4054/9730 7975/4075/9751 7966/4066/9742 +f 7935/4035/9711 7926/4026/9702 7920/4020/9696 7936/4036/9712 +f 7976/4076/9752 7977/4077/9753 7978/4078/9754 7979/4079/9755 +f 7980/4080/9756 7976/4076/9752 7979/4079/9755 7981/4081/9757 +f 7982/4082/9758 7980/4080/9756 7981/4081/9757 7983/4083/9759 +f 7984/4084/9760 7982/4082/9758 7983/4083/9759 7985/4085/9761 +f 7986/4086/9762 7987/4087/9763 7977/4077/9753 7976/4076/9752 +f 7988/4088/9764 7986/4086/9762 7976/4076/9752 7980/4080/9756 +f 7989/4089/9765 7988/4088/9764 7980/4080/9756 7982/4082/9758 +f 7990/4090/9766 7989/4089/9765 7982/4082/9758 7984/4084/9760 +f 7991/4091/9767 7992/4092/9768 7987/4087/9763 7986/4086/9762 +f 7993/4093/9769 7991/4091/9767 7986/4086/9762 7988/4088/9764 +f 7994/4094/9770 7993/4093/9769 7988/4088/9764 7989/4089/9765 +f 7995/4095/9771 7994/4094/9770 7989/4089/9765 7990/4090/9766 +f 7996/4096/9772 7997/4097/9773 7992/4092/9768 7991/4091/9767 +f 7998/4098/9774 7996/4096/9772 7991/4091/9767 7993/4093/9769 +f 7999/4099/9775 7998/4098/9774 7993/4093/9769 7994/4094/9770 +f 8000/4100/9776 7999/4099/9775 7994/4094/9770 7995/4095/9771 +f 7978/4078/9754 8001/4101/9777 8002/4102/9778 8003/4103/9779 +f 8004/4104/9780 8005/4105/9781 8006/4106/9782 7985/4085/9761 +f 8000/4100/9776 8007/4107/9783 7830/3930/9606 7829/3929/9605 +f 7828/3928/9604 7827/3927/9603 8008/4108/9784 7997/4097/9773 +f 7979/4079/9755 7978/4078/9754 8003/4103/9779 8009/4109/9785 +f 7985/4085/9761 8006/4106/9782 8010/4110/9786 7984/4084/9760 +f 7999/4099/9775 8000/4100/9776 7829/3929/9605 7846/3946/9622 +f 7997/4097/9773 8008/4108/9784 8011/4111/9787 7992/4092/9768 +f 7981/4081/9757 7979/4079/9755 8009/4109/9785 8012/4112/9788 +f 7984/4084/9760 8010/4110/9786 8013/4113/9789 7990/4090/9766 +f 7998/4098/9774 7999/4099/9775 7846/3946/9622 7842/3942/9618 +f 7992/4092/9768 8011/4111/9787 8014/4114/9790 7987/4087/9763 +f 7983/4083/9759 7981/4081/9757 8012/4112/9788 8015/4115/9791 +f 7990/4090/9766 8013/4113/9789 8016/4116/9792 7995/4095/9771 +f 7996/4096/9772 7998/4098/9774 7842/3942/9618 7838/3938/9614 +f 7987/4087/9763 8014/4114/9790 8017/4117/9793 7977/4077/9753 +f 7985/4085/9761 7983/4083/9759 8015/4115/9791 8004/4104/9780 +f 7995/4095/9771 8016/4116/9792 8007/4107/9783 8000/4100/9776 +f 7997/4097/9773 7996/4096/9772 7838/3938/9614 7828/3928/9604 +f 7977/4077/9753 8017/4117/9793 8001/4101/9777 7978/4078/9754 +f 8018/4118/9794 8019/4119/9795 8020/4120/9796 8021/4121/9797 +f 8022/4122/9798 8018/4118/9794 8021/4121/9797 8023/4123/9799 +f 8024/4124/9800 8022/4122/9798 8023/4123/9799 8025/4125/9801 +f 8026/4126/9802 8024/4124/9800 8025/4125/9801 8027/4127/9803 +f 8028/4128/9804 8029/4129/9805 8019/4119/9795 8018/4118/9794 +f 8030/4130/9806 8028/4128/9804 8018/4118/9794 8022/4122/9798 +f 8031/4131/9807 8030/4130/9806 8022/4122/9798 8024/4124/9800 +f 8032/4132/9808 8031/4131/9807 8024/4124/9800 8026/4126/9802 +f 8033/4133/9809 8034/4134/9810 8029/4129/9805 8028/4128/9804 +f 8035/4135/9811 8033/4133/9809 8028/4128/9804 8030/4130/9806 +f 8036/4136/9812 8035/4135/9811 8030/4130/9806 8031/4131/9807 +f 8037/4137/9813 8036/4136/9812 8031/4131/9807 8032/4132/9808 +f 8038/4138/9814 8039/4139/9815 8034/4134/9810 8033/4133/9809 +f 8040/4140/9816 8038/4138/9814 8033/4133/9809 8035/4135/9811 +f 8041/4141/9817 8040/4140/9816 8035/4135/9811 8036/4136/9812 +f 8042/4142/9818 8041/4141/9817 8036/4136/9812 8037/4137/9813 +f 8020/4120/9796 8006/4106/9782 8005/4105/9781 8043/4143/9819 +f 8044/4144/9820 8045/4145/9821 8046/4146/9822 8027/4127/9803 +f 8042/4142/9818 8047/4147/9823 7877/3977/9653 7876/3976/9652 +f 7875/3975/9651 7830/3930/9606 8007/4107/9783 8039/4139/9815 +f 8021/4121/9797 8020/4120/9796 8043/4143/9819 8048/4148/9824 +f 8027/4127/9803 8046/4146/9822 8049/4149/9825 8026/4126/9802 +f 8041/4141/9817 8042/4142/9818 7876/3976/9652 7889/3989/9665 +f 8039/4139/9815 8007/4107/9783 8016/4116/9792 8034/4134/9810 +f 8023/4123/9799 8021/4121/9797 8048/4148/9824 8050/4150/9826 +f 8026/4126/9802 8049/4149/9825 8051/4151/9827 8032/4132/9808 +f 8040/4140/9816 8041/4141/9817 7889/3989/9665 7886/3986/9662 +f 8034/4134/9810 8016/4116/9792 8013/4113/9789 8029/4129/9805 +f 8025/4125/9801 8023/4123/9799 8050/4150/9826 8052/4152/9828 +f 8032/4132/9808 8051/4151/9827 8053/4153/9829 8037/4137/9813 +f 8038/4138/9814 8040/4140/9816 7886/3986/9662 7883/3983/9659 +f 8029/4129/9805 8013/4113/9789 8010/4110/9786 8019/4119/9795 +f 8027/4127/9803 8025/4125/9801 8052/4152/9828 8044/4144/9820 +f 8037/4137/9813 8053/4153/9829 8047/4147/9823 8042/4142/9818 +f 8039/4139/9815 8038/4138/9814 7883/3983/9659 7875/3975/9651 +f 8019/4119/9795 8010/4110/9786 8006/4106/9782 8020/4120/9796 +f 8054/4154/9830 8055/4155/9831 8056/4156/9832 8057/4157/9833 +f 8058/4158/9834 8054/4154/9830 8057/4157/9833 8059/4159/9835 +f 8060/4160/9836 8058/4158/9834 8059/4159/9835 8061/4161/9837 +f 8062/4162/9838 8060/4160/9836 8061/4161/9837 8063/4163/9839 +f 8064/4164/9840 8065/4165/9841 8055/4155/9831 8054/4154/9830 +f 8066/4166/9842 8064/4164/9840 8054/4154/9830 8058/4158/9834 +f 8067/4167/9843 8066/4166/9842 8058/4158/9834 8060/4160/9836 +f 8068/4168/9844 8067/4167/9843 8060/4160/9836 8062/4162/9838 +f 8069/4169/9845 8070/4170/9846 8065/4165/9841 8064/4164/9840 +f 8071/4171/9847 8069/4169/9845 8064/4164/9840 8066/4166/9842 +f 8072/4172/9848 8071/4171/9847 8066/4166/9842 8067/4167/9843 +f 8073/4173/9849 8072/4172/9848 8067/4167/9843 8068/4168/9844 +f 8074/4174/9850 8075/4175/9851 8070/4170/9846 8069/4169/9845 +f 8076/4176/9852 8074/4174/9850 8069/4169/9845 8071/4171/9847 +f 8077/4177/9853 8076/4176/9852 8071/4171/9847 8072/4172/9848 +f 8078/4178/9854 8077/4177/9853 8072/4172/9848 8073/4173/9849 +f 8056/4156/9832 8046/4146/9822 8045/4145/9821 8079/4179/9855 +f 8080/4180/9856 8081/4181/9857 8082/4182/9858 8063/4163/9839 +f 8078/4178/9854 8083/4183/9859 7919/4019/9695 7918/4018/9694 +f 7917/4017/9693 7877/3977/9653 8047/4147/9823 8075/4175/9851 +f 8057/4157/9833 8056/4156/9832 8079/4179/9855 8084/4184/9860 +f 8063/4163/9839 8082/4182/9858 8085/4185/9861 8062/4162/9838 +f 8077/4177/9853 8078/4178/9854 7918/4018/9694 7931/4031/9707 +f 8075/4175/9851 8047/4147/9823 8053/4153/9829 8070/4170/9846 +f 8059/4159/9835 8057/4157/9833 8084/4184/9860 8086/4186/9862 +f 8062/4162/9838 8085/4185/9861 8087/4187/9863 8068/4168/9844 +f 8076/4176/9852 8077/4177/9853 7931/4031/9707 7928/4028/9704 +f 8070/4170/9846 8053/4153/9829 8051/4151/9827 8065/4165/9841 +f 8061/4161/9837 8059/4159/9835 8086/4186/9862 8088/4188/9864 +f 8068/4168/9844 8087/4187/9863 8089/4189/9865 8073/4173/9849 +f 8074/4174/9850 8076/4176/9852 7928/4028/9704 7925/4025/9701 +f 8065/4165/9841 8051/4151/9827 8049/4149/9825 8055/4155/9831 +f 8063/4163/9839 8061/4161/9837 8088/4188/9864 8080/4180/9856 +f 8073/4173/9849 8089/4189/9865 8083/4183/9859 8078/4178/9854 +f 8075/4175/9851 8074/4174/9850 7925/4025/9701 7917/4017/9693 +f 8055/4155/9831 8049/4149/9825 8046/4146/9822 8056/4156/9832 +f 8090/4190/9866 8091/4191/9867 8092/4192/9868 8093/4193/9869 +f 8094/4194/9870 8090/4190/9866 8093/4193/9869 8095/4195/9871 +f 8096/4196/9872 8094/4194/9870 8095/4195/9871 8097/4197/9873 +f 8098/4198/9874 8096/4196/9872 8097/4197/9873 8099/4199/9875 +f 8100/4200/9876 8101/4201/9877 8091/4191/9867 8090/4190/9866 +f 8102/4202/9878 8100/4200/9876 8090/4190/9866 8094/4194/9870 +f 8103/4203/9879 8102/4202/9878 8094/4194/9870 8096/4196/9872 +f 8104/4204/9880 8103/4203/9879 8096/4196/9872 8098/4198/9874 +f 8105/4205/9881 8106/4206/9882 8101/4201/9877 8100/4200/9876 +f 8107/4207/9883 8105/4205/9881 8100/4200/9876 8102/4202/9878 +f 8108/4208/9884 8107/4207/9883 8102/4202/9878 8103/4203/9879 +f 8109/4209/9885 8108/4208/9884 8103/4203/9879 8104/4204/9880 +f 8110/4210/9886 8111/4211/9887 8106/4206/9882 8105/4205/9881 +f 8112/4212/9888 8110/4210/9886 8105/4205/9881 8107/4207/9883 +f 8113/4213/9889 8112/4212/9888 8107/4207/9883 8108/4208/9884 +f 8114/4214/9890 8113/4213/9889 8108/4208/9884 8109/4209/9885 +f 8092/4192/9868 8082/4182/9858 8081/4181/9857 8115/4215/9891 +f 8116/4216/9892 8117/4217/9893 8118/4218/9894 8099/4199/9875 +f 8114/4214/9890 8119/4219/9895 7961/4061/9737 7960/4060/9736 +f 7959/4059/9735 7919/4019/9695 8083/4183/9859 8111/4211/9887 +f 8093/4193/9869 8092/4192/9868 8115/4215/9891 8120/4220/9896 +f 8099/4199/9875 8118/4218/9894 8121/4221/9897 8098/4198/9874 +f 8113/4213/9889 8114/4214/9890 7960/4060/9736 7973/4073/9749 +f 8111/4211/9887 8083/4183/9859 8089/4189/9865 8106/4206/9882 +f 8095/4195/9871 8093/4193/9869 8120/4220/9896 8122/4222/9898 +f 8098/4198/9874 8121/4221/9897 8123/4223/9899 8104/4204/9880 +f 8112/4212/9888 8113/4213/9889 7973/4073/9749 7970/4070/9746 +f 8106/4206/9882 8089/4189/9865 8087/4187/9863 8101/4201/9877 +f 8097/4197/9873 8095/4195/9871 8122/4222/9898 8124/4224/9900 +f 8104/4204/9880 8123/4223/9899 8125/4225/9901 8109/4209/9885 +f 8110/4210/9886 8112/4212/9888 7970/4070/9746 7967/4067/9743 +f 8101/4201/9877 8087/4187/9863 8085/4185/9861 8091/4191/9867 +f 8099/4199/9875 8097/4197/9873 8124/4224/9900 8116/4216/9892 +f 8109/4209/9885 8125/4225/9901 8119/4219/9895 8114/4214/9890 +f 8111/4211/9887 8110/4210/9886 7967/4067/9743 7959/4059/9735 +f 8091/4191/9867 8085/4185/9861 8082/4182/9858 8092/4192/9868 +f 8126/3903/9902 8127/3902/9903 8128/3901/9904 8129/3904/9905 +f 8129/3904/9905 8128/3901/9904 8130/3905/9906 8131/3906/9907 +f 8131/3906/9907 8130/3905/9906 8132/3907/9908 8133/3908/9909 +f 8133/3908/9909 8132/3907/9908 8134/3909/9910 8135/3910/9911 +f 8127/3902/9903 8136/3912/9912 8137/3911/9913 8128/3901/9904 +f 8128/3901/9904 8137/3911/9913 8138/3913/9914 8130/3905/9906 +f 8130/3905/9906 8138/3913/9914 8139/3914/9915 8132/3907/9908 +f 8132/3907/9908 8139/3914/9915 8140/3915/9916 8134/3909/9910 +f 8136/3912/9912 8141/3917/9917 8142/3916/9918 8137/3911/9913 +f 8137/3911/9913 8142/3916/9918 8143/3918/9919 8138/3913/9914 +f 8138/3913/9914 8143/3918/9919 8144/3919/9920 8139/3914/9915 +f 8139/3914/9915 8144/3919/9920 8145/3920/9921 8140/3915/9916 +f 8141/3917/9917 8146/3922/9922 8147/3921/9923 8142/3916/9918 +f 8142/3916/9918 8147/3921/9923 8148/3923/9924 8143/3918/9919 +f 8143/3918/9919 8148/3923/9924 8149/3924/9925 8144/3919/9920 +f 8144/3919/9920 8149/3924/9925 8150/3925/9926 8145/3920/9921 +f 8151/3927/9927 8152/3926/9928 8126/3903/9902 8153/3928/9929 +f 8154/3931/9930 8155/3930/9931 8156/3929/9932 8135/3910/9911 +f 8157/3933/9933 8158/3932/9934 8150/3925/9926 8159/3934/9935 +f 8160/3937/9936 8161/3936/9937 8162/3935/9938 8146/3922/9922 +f 8153/3928/9929 8126/3903/9902 8129/3904/9905 8163/3938/9939 +f 8164/3939/9940 8154/3931/9930 8135/3910/9911 8134/3909/9910 +f 8159/3934/9935 8150/3925/9926 8149/3924/9925 8165/3940/9941 +f 8166/3941/9942 8160/3937/9936 8146/3922/9922 8141/3917/9917 +f 8163/3938/9939 8129/3904/9905 8131/3906/9907 8167/3942/9943 +f 8168/3943/9944 8164/3939/9940 8134/3909/9910 8140/3915/9916 +f 8165/3940/9941 8149/3924/9925 8148/3923/9924 8169/3944/9945 +f 8170/3945/9946 8166/3941/9942 8141/3917/9917 8136/3912/9912 +f 8167/3942/9943 8131/3906/9907 8133/3908/9909 8171/3946/9947 +f 8172/3947/9948 8168/3943/9944 8140/3915/9916 8145/3920/9921 +f 8169/3944/9945 8148/3923/9924 8147/3921/9923 8173/3948/9949 +f 8174/3949/9950 8170/3945/9946 8136/3912/9912 8127/3902/9903 +f 8171/3946/9947 8133/3908/9909 8135/3910/9911 8156/3929/9932 +f 8158/3932/9934 8172/3947/9948 8145/3920/9921 8150/3925/9926 +f 8173/3948/9949 8147/3921/9923 8146/3922/9922 8162/3935/9938 +f 8152/3926/9928 8174/3949/9950 8127/3902/9903 8126/3903/9902 +f 8175/3952/9951 8176/3951/9952 8177/3950/9953 8178/3953/9954 +f 8178/3953/9954 8177/3950/9953 8179/3954/9955 8180/3955/9956 +f 8180/3955/9956 8179/3954/9955 8181/3956/9957 8182/3957/9958 +f 8182/3957/9958 8181/3956/9957 8183/3958/9959 8184/3959/9960 +f 8176/3951/9952 8185/3961/9961 8186/3960/9962 8177/3950/9953 +f 8177/3950/9953 8186/3960/9962 8187/3962/9963 8179/3954/9955 +f 8179/3954/9955 8187/3962/9963 8188/3963/9964 8181/3956/9957 +f 8181/3956/9957 8188/3963/9964 8189/3964/9965 8183/3958/9959 +f 8185/3961/9961 8190/3966/9966 8191/3965/9967 8186/3960/9962 +f 8186/3960/9962 8191/3965/9967 8192/3967/9968 8187/3962/9963 +f 8187/3962/9963 8192/3967/9968 8193/3968/9969 8188/3963/9964 +f 8188/3963/9964 8193/3968/9969 8194/3969/9970 8189/3964/9965 +f 8190/3966/9966 8195/3971/9971 8196/3970/9972 8191/3965/9967 +f 8191/3965/9967 8196/3970/9972 8197/3972/9973 8192/3967/9968 +f 8192/3967/9968 8197/3972/9973 8198/3973/9974 8193/3968/9969 +f 8193/3968/9969 8198/3973/9974 8199/3974/9975 8194/3969/9970 +f 8155/3930/9931 8154/3931/9930 8175/3952/9951 8200/3975/9976 +f 8201/3978/9977 8202/3977/9978 8203/3976/9979 8184/3959/9960 +f 8204/3980/9980 8205/3979/9981 8199/3974/9975 8206/3981/9982 +f 8158/3932/9934 8157/3933/9933 8207/3982/9983 8195/3971/9971 +f 8200/3975/9976 8175/3952/9951 8178/3953/9954 8208/3983/9984 +f 8209/3984/9985 8201/3978/9977 8184/3959/9960 8183/3958/9959 +f 8206/3981/9982 8199/3974/9975 8198/3973/9974 8210/3985/9986 +f 8172/3947/9948 8158/3932/9934 8195/3971/9971 8190/3966/9966 +f 8208/3983/9984 8178/3953/9954 8180/3955/9956 8211/3986/9987 +f 8212/3987/9988 8209/3984/9985 8183/3958/9959 8189/3964/9965 +f 8210/3985/9986 8198/3973/9974 8197/3972/9973 8213/3988/9989 +f 8168/3943/9944 8172/3947/9948 8190/3966/9966 8185/3961/9961 +f 8211/3986/9987 8180/3955/9956 8182/3957/9958 8214/3989/9990 +f 8215/3990/9991 8212/3987/9988 8189/3964/9965 8194/3969/9970 +f 8213/3988/9989 8197/3972/9973 8196/3970/9972 8216/3991/9992 +f 8164/3939/9940 8168/3943/9944 8185/3961/9961 8176/3951/9952 +f 8214/3989/9990 8182/3957/9958 8184/3959/9960 8203/3976/9979 +f 8205/3979/9981 8215/3990/9991 8194/3969/9970 8199/3974/9975 +f 8216/3991/9992 8196/3970/9972 8195/3971/9971 8207/3982/9983 +f 8154/3931/9930 8164/3939/9940 8176/3951/9952 8175/3952/9951 +f 8217/3994/9993 8218/3993/9994 8219/3992/9995 8220/3995/9996 +f 8220/3995/9996 8219/3992/9995 8221/3996/9997 8222/3997/9998 +f 8222/3997/9998 8221/3996/9997 8223/3998/9999 8224/3999/10000 +f 8224/3999/10000 8223/3998/9999 8225/4000/10001 8226/4001/10002 +f 8218/3993/9994 8227/4003/10003 8228/4002/10004 8219/3992/9995 +f 8219/3992/9995 8228/4002/10004 8229/4004/10005 8221/3996/9997 +f 8221/3996/9997 8229/4004/10005 8230/4005/10006 8223/3998/9999 +f 8223/3998/9999 8230/4005/10006 8231/4006/10007 8225/4000/10001 +f 8227/4003/10003 8232/4008/10008 8233/4007/10009 8228/4002/10004 +f 8228/4002/10004 8233/4007/10009 8234/4009/10010 8229/4004/10005 +f 8229/4004/10005 8234/4009/10010 8235/4010/10011 8230/4005/10006 +f 8230/4005/10006 8235/4010/10011 8236/4011/10012 8231/4006/10007 +f 8232/4008/10008 8237/4013/10013 8238/4012/10014 8233/4007/10009 +f 8233/4007/10009 8238/4012/10014 8239/4014/10015 8234/4009/10010 +f 8234/4009/10010 8239/4014/10015 8240/4015/10016 8235/4010/10011 +f 8235/4010/10011 8240/4015/10016 8241/4016/10017 8236/4011/10012 +f 8202/3977/9978 8201/3978/9977 8217/3994/9993 8242/4017/10018 +f 8243/4020/10019 8244/4019/10020 8245/4018/10021 8226/4001/10002 +f 8246/4022/10022 8247/4021/10023 8241/4016/10017 8248/4023/10024 +f 8205/3979/9981 8204/3980/9980 8249/4024/10025 8237/4013/10013 +f 8242/4017/10018 8217/3994/9993 8220/3995/9996 8250/4025/10026 +f 8251/4026/10027 8243/4020/10019 8226/4001/10002 8225/4000/10001 +f 8248/4023/10024 8241/4016/10017 8240/4015/10016 8252/4027/10028 +f 8215/3990/9991 8205/3979/9981 8237/4013/10013 8232/4008/10008 +f 8250/4025/10026 8220/3995/9996 8222/3997/9998 8253/4028/10029 +f 8254/4029/10030 8251/4026/10027 8225/4000/10001 8231/4006/10007 +f 8252/4027/10028 8240/4015/10016 8239/4014/10015 8255/4030/10031 +f 8212/3987/9988 8215/3990/9991 8232/4008/10008 8227/4003/10003 +f 8253/4028/10029 8222/3997/9998 8224/3999/10000 8256/4031/10032 +f 8257/4032/10033 8254/4029/10030 8231/4006/10007 8236/4011/10012 +f 8255/4030/10031 8239/4014/10015 8238/4012/10014 8258/4033/10034 +f 8209/3984/9985 8212/3987/9988 8227/4003/10003 8218/3993/9994 +f 8256/4031/10032 8224/3999/10000 8226/4001/10002 8245/4018/10021 +f 8247/4021/10023 8257/4032/10033 8236/4011/10012 8241/4016/10017 +f 8258/4033/10034 8238/4012/10014 8237/4013/10013 8249/4024/10025 +f 8201/3978/9977 8209/3984/9985 8218/3993/9994 8217/3994/9993 +f 8259/4036/10035 8260/4035/10036 8261/4034/10037 8262/4037/10038 +f 8262/4037/10038 8261/4034/10037 8263/4038/10039 8264/4039/10040 +f 8264/4039/10040 8263/4038/10039 8265/4040/10041 8266/4041/10042 +f 8266/4041/10042 8265/4040/10041 8267/4042/10043 8268/4043/10044 +f 8260/4035/10036 8269/4045/10045 8270/4044/10046 8261/4034/10037 +f 8261/4034/10037 8270/4044/10046 8271/4046/10047 8263/4038/10039 +f 8263/4038/10039 8271/4046/10047 8272/4047/10048 8265/4040/10041 +f 8265/4040/10041 8272/4047/10048 8273/4048/10049 8267/4042/10043 +f 8269/4045/10045 8274/4050/10050 8275/4049/10051 8270/4044/10046 +f 8270/4044/10046 8275/4049/10051 8276/4051/10052 8271/4046/10047 +f 8271/4046/10047 8276/4051/10052 8277/4052/10053 8272/4047/10048 +f 8272/4047/10048 8277/4052/10053 8278/4053/10054 8273/4048/10049 +f 8274/4050/10050 8279/4055/10055 8280/4054/10056 8275/4049/10051 +f 8275/4049/10051 8280/4054/10056 8281/4056/10057 8276/4051/10052 +f 8276/4051/10052 8281/4056/10057 8282/4057/10058 8277/4052/10053 +f 8277/4052/10053 8282/4057/10058 8283/4058/10059 8278/4053/10054 +f 8244/4019/10020 8243/4020/10019 8259/4036/10035 8284/4059/10060 +f 8285/4062/10061 8286/4061/10062 8287/4060/10063 8268/4043/10044 +f 8288/4064/10064 8289/4063/10065 8283/4058/10059 8290/4065/10066 +f 8247/4021/10023 8246/4022/10022 8291/4066/10067 8279/4055/10055 +f 8284/4059/10060 8259/4036/10035 8262/4037/10038 8292/4067/10068 +f 8293/4068/10069 8285/4062/10061 8268/4043/10044 8267/4042/10043 +f 8290/4065/10066 8283/4058/10059 8282/4057/10058 8294/4069/10070 +f 8257/4032/10033 8247/4021/10023 8279/4055/10055 8274/4050/10050 +f 8292/4067/10068 8262/4037/10038 8264/4039/10040 8295/4070/10071 +f 8296/4071/10072 8293/4068/10069 8267/4042/10043 8273/4048/10049 +f 8294/4069/10070 8282/4057/10058 8281/4056/10057 8297/4072/10073 +f 8254/4029/10030 8257/4032/10033 8274/4050/10050 8269/4045/10045 +f 8295/4070/10071 8264/4039/10040 8266/4041/10042 8298/4073/10074 +f 8299/4074/10075 8296/4071/10072 8273/4048/10049 8278/4053/10054 +f 8297/4072/10073 8281/4056/10057 8280/4054/10056 8300/4075/10076 +f 8251/4026/10027 8254/4029/10030 8269/4045/10045 8260/4035/10036 +f 8298/4073/10074 8266/4041/10042 8268/4043/10044 8287/4060/10063 +f 8289/4063/10065 8299/4074/10075 8278/4053/10054 8283/4058/10059 +f 8300/4075/10076 8280/4054/10056 8279/4055/10055 8291/4066/10067 +f 8243/4020/10019 8251/4026/10027 8260/4035/10036 8259/4036/10035 +f 8301/4078/10077 8302/4077/10078 8303/4076/10079 8304/4079/10080 +f 8304/4079/10080 8303/4076/10079 8305/4080/10081 8306/4081/10082 +f 8306/4081/10082 8305/4080/10081 8307/4082/10083 8308/4083/10084 +f 8308/4083/10084 8307/4082/10083 8309/4084/10085 8310/4085/10086 +f 8302/4077/10078 8311/4087/10087 8312/4086/10088 8303/4076/10079 +f 8303/4076/10079 8312/4086/10088 8313/4088/10089 8305/4080/10081 +f 8305/4080/10081 8313/4088/10089 8314/4089/10090 8307/4082/10083 +f 8307/4082/10083 8314/4089/10090 8315/4090/10091 8309/4084/10085 +f 8311/4087/10087 8316/4092/10092 8317/4091/10093 8312/4086/10088 +f 8312/4086/10088 8317/4091/10093 8318/4093/10094 8313/4088/10089 +f 8313/4088/10089 8318/4093/10094 8319/4094/10095 8314/4089/10090 +f 8314/4089/10090 8319/4094/10095 8320/4095/10096 8315/4090/10091 +f 8316/4092/10092 8321/4097/10097 8322/4096/10098 8317/4091/10093 +f 8317/4091/10093 8322/4096/10098 8323/4098/10099 8318/4093/10094 +f 8318/4093/10094 8323/4098/10099 8324/4099/10100 8319/4094/10095 +f 8319/4094/10095 8324/4099/10100 8325/4100/10101 8320/4095/10096 +f 8326/4102/10102 8327/4101/10103 8301/4078/10077 8328/4103/10104 +f 8329/4106/10105 8330/4105/10106 8331/4104/10107 8310/4085/10086 +f 8155/3930/9931 8332/4107/10108 8325/4100/10101 8156/3929/9932 +f 8333/4108/10109 8151/3927/9927 8153/3928/9929 8321/4097/10097 +f 8328/4103/10104 8301/4078/10077 8304/4079/10080 8334/4109/10110 +f 8335/4110/10111 8329/4106/10105 8310/4085/10086 8309/4084/10085 +f 8156/3929/9932 8325/4100/10101 8324/4099/10100 8171/3946/9947 +f 8336/4111/10112 8333/4108/10109 8321/4097/10097 8316/4092/10092 +f 8334/4109/10110 8304/4079/10080 8306/4081/10082 8337/4112/10113 +f 8338/4113/10114 8335/4110/10111 8309/4084/10085 8315/4090/10091 +f 8171/3946/9947 8324/4099/10100 8323/4098/10099 8167/3942/9943 +f 8339/4114/10115 8336/4111/10112 8316/4092/10092 8311/4087/10087 +f 8337/4112/10113 8306/4081/10082 8308/4083/10084 8340/4115/10116 +f 8341/4116/10117 8338/4113/10114 8315/4090/10091 8320/4095/10096 +f 8167/3942/9943 8323/4098/10099 8322/4096/10098 8163/3938/9939 +f 8342/4117/10118 8339/4114/10115 8311/4087/10087 8302/4077/10078 +f 8340/4115/10116 8308/4083/10084 8310/4085/10086 8331/4104/10107 +f 8332/4107/10108 8341/4116/10117 8320/4095/10096 8325/4100/10101 +f 8163/3938/9939 8322/4096/10098 8321/4097/10097 8153/3928/9929 +f 8327/4101/10103 8342/4117/10118 8302/4077/10078 8301/4078/10077 +f 8343/4120/10119 8344/4119/10120 8345/4118/10121 8346/4121/10122 +f 8346/4121/10122 8345/4118/10121 8347/4122/10123 8348/4123/10124 +f 8348/4123/10124 8347/4122/10123 8349/4124/10125 8350/4125/10126 +f 8350/4125/10126 8349/4124/10125 8351/4126/10127 8352/4127/10128 +f 8344/4119/10120 8353/4129/10129 8354/4128/10130 8345/4118/10121 +f 8345/4118/10121 8354/4128/10130 8355/4130/10131 8347/4122/10123 +f 8347/4122/10123 8355/4130/10131 8356/4131/10132 8349/4124/10125 +f 8349/4124/10125 8356/4131/10132 8357/4132/10133 8351/4126/10127 +f 8353/4129/10129 8358/4134/10134 8359/4133/10135 8354/4128/10130 +f 8354/4128/10130 8359/4133/10135 8360/4135/10136 8355/4130/10131 +f 8355/4130/10131 8360/4135/10136 8361/4136/10137 8356/4131/10132 +f 8356/4131/10132 8361/4136/10137 8362/4137/10138 8357/4132/10133 +f 8358/4134/10134 8363/4139/10139 8364/4138/10140 8359/4133/10135 +f 8359/4133/10135 8364/4138/10140 8365/4140/10141 8360/4135/10136 +f 8360/4135/10136 8365/4140/10141 8366/4141/10142 8361/4136/10137 +f 8361/4136/10137 8366/4141/10142 8367/4142/10143 8362/4137/10138 +f 8330/4105/10106 8329/4106/10105 8343/4120/10119 8368/4143/10144 +f 8369/4146/10145 8370/4145/10146 8371/4144/10147 8352/4127/10128 +f 8202/3977/9978 8372/4147/10148 8367/4142/10143 8203/3976/9979 +f 8332/4107/10108 8155/3930/9931 8200/3975/9976 8363/4139/10139 +f 8368/4143/10144 8343/4120/10119 8346/4121/10122 8373/4148/10149 +f 8374/4149/10150 8369/4146/10145 8352/4127/10128 8351/4126/10127 +f 8203/3976/9979 8367/4142/10143 8366/4141/10142 8214/3989/9990 +f 8341/4116/10117 8332/4107/10108 8363/4139/10139 8358/4134/10134 +f 8373/4148/10149 8346/4121/10122 8348/4123/10124 8375/4150/10151 +f 8376/4151/10152 8374/4149/10150 8351/4126/10127 8357/4132/10133 +f 8214/3989/9990 8366/4141/10142 8365/4140/10141 8211/3986/9987 +f 8338/4113/10114 8341/4116/10117 8358/4134/10134 8353/4129/10129 +f 8375/4150/10151 8348/4123/10124 8350/4125/10126 8377/4152/10153 +f 8378/4153/10154 8376/4151/10152 8357/4132/10133 8362/4137/10138 +f 8211/3986/9987 8365/4140/10141 8364/4138/10140 8208/3983/9984 +f 8335/4110/10111 8338/4113/10114 8353/4129/10129 8344/4119/10120 +f 8377/4152/10153 8350/4125/10126 8352/4127/10128 8371/4144/10147 +f 8372/4147/10148 8378/4153/10154 8362/4137/10138 8367/4142/10143 +f 8208/3983/9984 8364/4138/10140 8363/4139/10139 8200/3975/9976 +f 8329/4106/10105 8335/4110/10111 8344/4119/10120 8343/4120/10119 +f 8379/4156/10155 8380/4155/10156 8381/4154/10157 8382/4157/10158 +f 8382/4157/10158 8381/4154/10157 8383/4158/10159 8384/4159/10160 +f 8384/4159/10160 8383/4158/10159 8385/4160/10161 8386/4161/10162 +f 8386/4161/10162 8385/4160/10161 8387/4162/10163 8388/4163/10164 +f 8380/4155/10156 8389/4165/10165 8390/4164/10166 8381/4154/10157 +f 8381/4154/10157 8390/4164/10166 8391/4166/10167 8383/4158/10159 +f 8383/4158/10159 8391/4166/10167 8392/4167/10168 8385/4160/10161 +f 8385/4160/10161 8392/4167/10168 8393/4168/10169 8387/4162/10163 +f 8389/4165/10165 8394/4170/10170 8395/4169/10171 8390/4164/10166 +f 8390/4164/10166 8395/4169/10171 8396/4171/10172 8391/4166/10167 +f 8391/4166/10167 8396/4171/10172 8397/4172/10173 8392/4167/10168 +f 8392/4167/10168 8397/4172/10173 8398/4173/10174 8393/4168/10169 +f 8394/4170/10170 8399/4175/10175 8400/4174/10176 8395/4169/10171 +f 8395/4169/10171 8400/4174/10176 8401/4176/10177 8396/4171/10172 +f 8396/4171/10172 8401/4176/10177 8402/4177/10178 8397/4172/10173 +f 8397/4172/10173 8402/4177/10178 8403/4178/10179 8398/4173/10174 +f 8370/4145/10146 8369/4146/10145 8379/4156/10155 8404/4179/10180 +f 8405/4182/10181 8406/4181/10182 8407/4180/10183 8388/4163/10164 +f 8244/4019/10020 8408/4183/10184 8403/4178/10179 8245/4018/10021 +f 8372/4147/10148 8202/3977/9978 8242/4017/10018 8399/4175/10175 +f 8404/4179/10180 8379/4156/10155 8382/4157/10158 8409/4184/10185 +f 8410/4185/10186 8405/4182/10181 8388/4163/10164 8387/4162/10163 +f 8245/4018/10021 8403/4178/10179 8402/4177/10178 8256/4031/10032 +f 8378/4153/10154 8372/4147/10148 8399/4175/10175 8394/4170/10170 +f 8409/4184/10185 8382/4157/10158 8384/4159/10160 8411/4186/10187 +f 8412/4187/10188 8410/4185/10186 8387/4162/10163 8393/4168/10169 +f 8256/4031/10032 8402/4177/10178 8401/4176/10177 8253/4028/10029 +f 8376/4151/10152 8378/4153/10154 8394/4170/10170 8389/4165/10165 +f 8411/4186/10187 8384/4159/10160 8386/4161/10162 8413/4188/10189 +f 8414/4189/10190 8412/4187/10188 8393/4168/10169 8398/4173/10174 +f 8253/4028/10029 8401/4176/10177 8400/4174/10176 8250/4025/10026 +f 8374/4149/10150 8376/4151/10152 8389/4165/10165 8380/4155/10156 +f 8413/4188/10189 8386/4161/10162 8388/4163/10164 8407/4180/10183 +f 8408/4183/10184 8414/4189/10190 8398/4173/10174 8403/4178/10179 +f 8250/4025/10026 8400/4174/10176 8399/4175/10175 8242/4017/10018 +f 8369/4146/10145 8374/4149/10150 8380/4155/10156 8379/4156/10155 +f 8415/4192/10191 8416/4191/10192 8417/4190/10193 8418/4193/10194 +f 8418/4193/10194 8417/4190/10193 8419/4194/10195 8420/4195/10196 +f 8420/4195/10196 8419/4194/10195 8421/4196/10197 8422/4197/10198 +f 8422/4197/10198 8421/4196/10197 8423/4198/10199 8424/4199/10200 +f 8416/4191/10192 8425/4201/10201 8426/4200/10202 8417/4190/10193 +f 8417/4190/10193 8426/4200/10202 8427/4202/10203 8419/4194/10195 +f 8419/4194/10195 8427/4202/10203 8428/4203/10204 8421/4196/10197 +f 8421/4196/10197 8428/4203/10204 8429/4204/10205 8423/4198/10199 +f 8425/4201/10201 8430/4206/10206 8431/4205/10207 8426/4200/10202 +f 8426/4200/10202 8431/4205/10207 8432/4207/10208 8427/4202/10203 +f 8427/4202/10203 8432/4207/10208 8433/4208/10209 8428/4203/10204 +f 8428/4203/10204 8433/4208/10209 8434/4209/10210 8429/4204/10205 +f 8430/4206/10206 8435/4211/10211 8436/4210/10212 8431/4205/10207 +f 8431/4205/10207 8436/4210/10212 8437/4212/10213 8432/4207/10208 +f 8432/4207/10208 8437/4212/10213 8438/4213/10214 8433/4208/10209 +f 8433/4208/10209 8438/4213/10214 8439/4214/10215 8434/4209/10210 +f 8406/4181/10182 8405/4182/10181 8415/4192/10191 8440/4215/10216 +f 8441/4218/10217 8442/4217/10218 8443/4216/10219 8424/4199/10200 +f 8286/4061/10062 8444/4219/10220 8439/4214/10215 8287/4060/10063 +f 8408/4183/10184 8244/4019/10020 8284/4059/10060 8435/4211/10211 +f 8440/4215/10216 8415/4192/10191 8418/4193/10194 8445/4220/10221 +f 8446/4221/10222 8441/4218/10217 8424/4199/10200 8423/4198/10199 +f 8287/4060/10063 8439/4214/10215 8438/4213/10214 8298/4073/10074 +f 8414/4189/10190 8408/4183/10184 8435/4211/10211 8430/4206/10206 +f 8445/4220/10221 8418/4193/10194 8420/4195/10196 8447/4222/10223 +f 8448/4223/10224 8446/4221/10222 8423/4198/10199 8429/4204/10205 +f 8298/4073/10074 8438/4213/10214 8437/4212/10213 8295/4070/10071 +f 8412/4187/10188 8414/4189/10190 8430/4206/10206 8425/4201/10201 +f 8447/4222/10223 8420/4195/10196 8422/4197/10198 8449/4224/10225 +f 8450/4225/10226 8448/4223/10224 8429/4204/10205 8434/4209/10210 +f 8295/4070/10071 8437/4212/10213 8436/4210/10212 8292/4067/10068 +f 8410/4185/10186 8412/4187/10188 8425/4201/10201 8416/4191/10192 +f 8449/4224/10225 8422/4197/10198 8424/4199/10200 8443/4216/10219 +f 8444/4219/10220 8450/4225/10226 8434/4209/10210 8439/4214/10215 +f 8292/4067/10068 8436/4210/10212 8435/4211/10211 8284/4059/10060 +f 8405/4182/10181 8410/4185/10186 8416/4191/10192 8415/4192/10191 +s 2 +f 8152/3926/10227 8151/3927/10228 7827/3927/10229 7826/3926/10230 +s 4 +f 8157/3933/10231 8159/3934/10232 7834/3934/10233 7833/3933/10234 +f 8162/3935/10235 8161/3936/10236 7836/3936/10237 7835/3935/10238 +s 2 +f 8161/3936/10239 8160/3937/10240 7837/3937/10241 7836/3936/10242 +s 4 +f 8159/3934/10232 8165/3940/10243 7840/3940/10244 7834/3934/10233 +s 2 +f 8160/3937/10240 8166/3941/10245 7841/3941/10246 7837/3937/10241 +s 4 +f 8165/3940/10243 8169/3944/10247 7844/3944/10248 7840/3940/10244 +s 2 +f 8166/3941/10245 8170/3945/10249 7845/3945/10250 7841/3941/10246 +s 4 +f 8169/3944/10247 8173/3948/10251 7848/3948/10252 7844/3944/10248 +s 2 +f 8170/3945/10249 8174/3949/10253 7849/3949/10254 7845/3945/10250 +s 4 +f 8173/3948/10251 8162/3935/10235 7835/3935/10238 7848/3948/10252 +s 2 +f 8174/3949/10253 8152/3926/10227 7826/3926/10230 7849/3949/10254 +s 4 +f 8204/3980/10255 8206/3981/10256 7881/3981/10257 7880/3980/10258 +f 8207/3982/10259 8157/3933/10231 7833/3933/10234 7882/3982/10260 +f 8206/3981/10256 8210/3985/10261 7885/3985/10262 7881/3981/10257 +f 8210/3985/10261 8213/3988/10263 7888/3988/10264 7885/3985/10262 +f 8213/3988/10263 8216/3991/10265 7891/3991/10266 7888/3988/10264 +f 8216/3991/10265 8207/3982/10259 7882/3982/10260 7891/3991/10266 +f 8246/4022/10267 8248/4023/10268 7923/4023/10269 7922/4022/10270 +f 8249/4024/10271 8204/3980/10255 7880/3980/10258 7924/4024/10272 +f 8248/4023/10268 8252/4027/10273 7927/4027/10274 7923/4023/10269 +f 8252/4027/10273 8255/4030/10275 7930/4030/10276 7927/4027/10274 +f 8255/4030/10275 8258/4033/10277 7933/4033/10278 7930/4030/10276 +f 8258/4033/10277 8249/4024/10271 7924/4024/10272 7933/4033/10278 +f 8286/4061/10279 8285/4062/10280 7962/4062/10281 7961/4061/10282 +f 8288/4064/10283 8290/4065/10284 7965/4065/10285 7964/4064/10286 +f 8289/4063/10287 8288/4064/10283 7964/4064/10286 7963/4063/10288 +f 8291/4066/10289 8246/4022/10267 7922/4022/10270 7966/4066/10290 +f 8285/4062/10280 8293/4068/10291 7968/4068/10292 7962/4062/10281 +f 8290/4065/10284 8294/4069/10293 7969/4069/10294 7965/4065/10285 +f 8293/4068/10291 8296/4071/10295 7971/4071/10296 7968/4068/10292 +f 8294/4069/10293 8297/4072/10297 7972/4072/10298 7969/4069/10294 +f 8296/4071/10295 8299/4074/10299 7974/4074/10300 7971/4071/10296 +f 8297/4072/10297 8300/4075/10301 7975/4075/10302 7972/4072/10298 +f 8299/4074/10299 8289/4063/10287 7963/4063/10288 7974/4074/10300 +f 8300/4075/10301 8291/4066/10289 7966/4066/10290 7975/4075/10302 +f 8326/4102/10303 8328/4103/10304 8003/4103/10305 8002/4102/10306 +s 2 +f 8327/4101/10307 8326/4102/10308 8002/4102/10309 8001/4101/10310 +s 4 +f 8331/4104/10311 8330/4105/10312 8005/4105/10313 8004/4104/10314 +s 2 +f 8151/3927/10228 8333/4108/10315 8008/4108/10316 7827/3927/10229 +s 4 +f 8328/4103/10304 8334/4109/10317 8009/4109/10318 8003/4103/10305 +s 2 +f 8333/4108/10315 8336/4111/10319 8011/4111/10320 8008/4108/10316 +s 4 +f 8334/4109/10317 8337/4112/10321 8012/4112/10322 8009/4109/10318 +s 2 +f 8336/4111/10319 8339/4114/10323 8014/4114/10324 8011/4111/10320 +s 4 +f 8337/4112/10321 8340/4115/10325 8015/4115/10326 8012/4112/10322 +s 2 +f 8339/4114/10323 8342/4117/10327 8017/4117/10328 8014/4114/10324 +s 4 +f 8340/4115/10325 8331/4104/10311 8004/4104/10314 8015/4115/10326 +s 2 +f 8342/4117/10327 8327/4101/10307 8001/4101/10310 8017/4117/10328 +s 4 +f 8330/4105/10312 8368/4143/10329 8043/4143/10330 8005/4105/10313 +f 8371/4144/10331 8370/4145/10332 8045/4145/10333 8044/4144/10334 +f 8368/4143/10329 8373/4148/10335 8048/4148/10336 8043/4143/10330 +f 8373/4148/10335 8375/4150/10337 8050/4150/10338 8048/4148/10336 +f 8375/4150/10337 8377/4152/10339 8052/4152/10340 8050/4150/10338 +f 8377/4152/10339 8371/4144/10331 8044/4144/10334 8052/4152/10340 +f 8370/4145/10332 8404/4179/10341 8079/4179/10342 8045/4145/10333 +f 8407/4180/10343 8406/4181/10344 8081/4181/10345 8080/4180/10346 +f 8404/4179/10341 8409/4184/10347 8084/4184/10348 8079/4179/10342 +f 8409/4184/10347 8411/4186/10349 8086/4186/10350 8084/4184/10348 +f 8411/4186/10349 8413/4188/10351 8088/4188/10352 8086/4186/10350 +f 8413/4188/10351 8407/4180/10343 8080/4180/10346 8088/4188/10352 +f 8406/4181/10344 8440/4215/10353 8115/4215/10354 8081/4181/10345 +f 8443/4216/10355 8442/4217/10356 8117/4217/10357 8116/4216/10358 +f 8442/4217/10356 8441/4218/10359 8118/4218/10360 8117/4217/10357 +f 8444/4219/10361 8286/4061/10279 7961/4061/10282 8119/4219/10362 +f 8440/4215/10353 8445/4220/10363 8120/4220/10364 8115/4215/10354 +f 8441/4218/10359 8446/4221/10365 8121/4221/10366 8118/4218/10360 +f 8445/4220/10363 8447/4222/10367 8122/4222/10368 8120/4220/10364 +f 8446/4221/10365 8448/4223/10369 8123/4223/10370 8121/4221/10366 +f 8447/4222/10367 8449/4224/10371 8124/4224/10372 8122/4222/10368 +f 8448/4223/10369 8450/4225/10373 8125/4225/10374 8123/4223/10370 +f 8449/4224/10371 8443/4216/10355 8116/4216/10358 8124/4224/10372 +f 8450/4225/10373 8444/4219/10361 8119/4219/10362 8125/4225/10374 +# 648 polygons + +# +# object lotu_petal_13 +# + +v 0.2389 0.3266 0.6275 +v 0.2182 0.2829 0.5950 +v 0.1626 0.2725 0.6055 +v 0.1743 0.3152 0.6380 +v 0.2627 0.3734 0.6649 +v 0.1908 0.3658 0.6730 +v 0.2878 0.4252 0.7049 +v 0.2108 0.4212 0.7138 +v 0.3123 0.4841 0.7532 +v 0.2295 0.4802 0.7603 +v 0.3050 0.3352 0.6215 +v 0.2752 0.2939 0.5851 +v 0.3340 0.3800 0.6593 +v 0.3661 0.4302 0.7011 +v 0.3959 0.4922 0.7439 +v 0.3691 0.3528 0.6065 +v 0.3328 0.3159 0.5717 +v 0.4050 0.4021 0.6439 +v 0.4427 0.4586 0.6782 +v 0.4810 0.5167 0.7148 +v 0.4347 0.3778 0.5830 +v 0.3939 0.3407 0.5553 +v 0.4726 0.4250 0.6162 +v 0.5173 0.4765 0.6411 +v 0.5584 0.5413 0.6776 +v 0.1590 0.2395 0.5750 +v 0.1122 0.2355 0.5790 +v 0.1105 0.2705 0.6089 +v 0.1421 0.4717 0.7710 +v 0.1479 0.5423 0.8238 +v 0.2400 0.5507 0.8100 +v 0.5972 0.6098 0.7251 +v 0.6876 0.6326 0.6853 +v 0.6400 0.5719 0.6469 +v 0.4499 0.3665 0.5245 +v 0.3937 0.3326 0.5023 +v 0.3457 0.3090 0.5243 +v 0.1134 0.3120 0.6427 +v 0.3312 0.5527 0.8047 +v 0.5939 0.5043 0.6051 +v 0.2973 0.2821 0.5425 +v 0.1201 0.3579 0.6787 +v 0.4199 0.5593 0.7866 +v 0.5457 0.4470 0.5726 +v 0.2503 0.2632 0.5550 +v 0.1316 0.4103 0.7215 +v 0.5089 0.5857 0.7581 +v 0.5005 0.4028 0.5513 +v 0.2050 0.2495 0.5640 +v 0.3478 0.7020 0.9038 +v 0.3449 0.6280 0.8556 +v 0.2497 0.6252 0.8589 +v 0.2494 0.7048 0.9152 +v 0.3388 0.7862 0.9478 +v 0.2375 0.7894 0.9622 +v 0.3269 0.8845 1.0019 +v 0.2223 0.8839 1.0170 +v 0.3283 0.9957 1.0481 +v 0.2221 0.9937 1.0584 +v 0.4475 0.7062 0.8809 +v 0.4395 0.6311 0.8320 +v 0.4396 0.7953 0.9295 +v 0.4330 0.8918 0.9832 +v 0.4340 1.0009 1.0387 +v 0.5461 0.7296 0.8574 +v 0.5330 0.6579 0.8078 +v 0.5418 0.8131 0.9052 +v 0.5369 0.9133 0.9593 +v 0.5389 1.0213 1.0067 +v 0.6406 0.7552 0.8171 +v 0.6282 0.6792 0.7726 +v 0.6407 0.8386 0.8756 +v 0.6400 0.9360 0.9243 +v 0.6435 1.0436 0.9615 +v 0.1558 0.6194 0.8720 +v 0.1166 0.9874 1.0739 +v 0.1234 1.1105 1.1104 +v 0.2299 1.1122 1.1037 +v 0.6415 1.1585 1.0077 +v 0.7454 1.1702 0.9578 +v 0.7483 1.0559 0.9150 +v 0.7207 0.6995 0.7260 +v 0.1515 0.7002 0.9228 +v 0.3335 1.1203 1.0878 +v 0.7452 0.9477 0.8688 +v 0.1370 0.7844 0.9674 +v 0.4355 1.1274 1.0655 +v 0.7404 0.8544 0.8215 +v 0.1198 0.8796 1.0203 +v 0.5392 1.1418 1.0449 +v 0.7366 0.7756 0.7689 +v 0.3051 1.4225 1.1764 +v 0.3255 1.2612 1.1327 +v 0.2204 1.2558 1.1527 +v 0.2051 1.4229 1.1918 +v 0.2928 1.5945 1.2063 +v 0.1970 1.6021 1.2310 +v 0.2898 1.7739 1.2173 +v 0.1976 1.7851 1.2394 +v 0.2590 1.9473 1.2316 +v 0.1731 1.9560 1.2591 +v 0.4030 1.4332 1.1542 +v 0.4291 1.2729 1.1123 +v 0.3898 1.6107 1.1824 +v 0.3826 1.7847 1.1939 +v 0.3473 1.9472 1.2008 +v 0.5039 1.4417 1.1230 +v 0.5310 1.2807 1.0785 +v 0.4872 1.6157 1.1527 +v 0.4727 1.7925 1.1751 +v 0.4347 1.9575 1.1814 +v 0.6030 1.4541 1.0904 +v 0.6316 1.2968 1.0524 +v 0.5808 1.6246 1.1249 +v 0.5633 1.7953 1.1410 +v 0.5202 1.9582 1.1472 +v 0.1151 1.2511 1.1569 +v 0.0915 1.9514 1.2787 +v 0.0916 2.0998 1.2593 +v 0.1697 2.1043 1.2473 +v 0.4775 2.1005 1.1407 +v 0.5522 2.1006 1.0997 +v 0.6006 1.9627 1.1029 +v 0.7314 1.3059 1.0191 +v 0.1051 1.4160 1.2066 +v 0.2471 2.0982 1.2322 +v 0.6518 1.8029 1.0893 +v 0.1034 1.5991 1.2468 +v 0.3238 2.0921 1.2036 +v 0.6729 1.6335 1.0751 +v 0.1101 1.7804 1.2569 +v 0.4019 2.1004 1.1741 +v 0.6991 1.4598 1.0454 +v 0.2170 2.3444 1.2048 +v 0.2318 2.2305 1.2312 +v 0.1615 2.2293 1.2400 +v 0.1574 2.3426 1.2116 +v 0.2034 2.4514 1.1673 +v 0.1509 2.4468 1.1728 +v 0.1767 2.5355 1.1205 +v 0.1361 2.5377 1.1261 +v 0.1479 2.6121 1.0797 +v 0.1193 2.6140 1.0861 +v 0.2764 2.3379 1.1946 +v 0.3008 2.2199 1.2095 +v 0.2562 2.4449 1.1521 +v 0.2204 2.5333 1.1098 +v 0.1800 2.6087 1.0736 +v 0.3350 2.3360 1.1663 +v 0.3697 2.2230 1.1671 +v 0.3075 2.4375 1.1371 +v 0.2658 2.5283 1.0973 +v 0.2127 2.6000 1.0653 +v 0.3952 2.3313 1.1238 +v 0.4388 2.2214 1.1299 +v 0.3581 2.4319 1.1183 +v 0.3075 2.5179 1.0845 +v 0.2432 2.5906 1.0630 +v 0.0893 2.2251 1.2486 +v 0.0973 2.6172 1.0892 +v 0.0990 2.6841 1.0307 +v 0.1137 2.6830 1.0307 +v 0.1722 2.6584 1.0390 +v 0.1840 2.6442 1.0465 +v 0.2690 2.5811 1.0599 +v 0.5140 2.2190 1.0882 +v 0.0967 2.3420 1.2141 +v 0.1283 2.6809 1.0305 +v 0.3415 2.5065 1.0785 +v 0.1023 2.4444 1.1729 +v 0.1431 2.6768 1.0316 +v 0.4056 2.4195 1.0890 +v 0.1020 2.5362 1.1313 +v 0.1579 2.6691 1.0346 +v 0.4571 2.3253 1.0785 +v -0.1615 0.3272 0.6430 +v -0.1269 0.2953 0.6070 +v -0.1894 0.3146 0.5952 +v -0.2334 0.3495 0.6253 +v -0.1880 0.3705 0.6829 +v -0.2698 0.3922 0.6679 +v -0.2068 0.4188 0.7244 +v -0.2941 0.4366 0.7134 +v -0.2216 0.4741 0.7724 +v -0.3165 0.4852 0.7564 +v -0.0892 0.3130 0.6431 +v -0.0633 0.2786 0.6053 +v -0.1071 0.3587 0.6851 +v -0.1188 0.4142 0.7292 +v -0.1278 0.4687 0.7804 +v -0.0174 0.3075 0.6397 +v -0.0013 0.2689 0.6060 +v -0.0283 0.3561 0.6772 +v -0.0333 0.4138 0.7256 +v -0.0370 0.4695 0.7773 +v 0.0511 0.3111 0.6414 +v 0.0573 0.2699 0.6117 +v 0.0479 0.3565 0.6793 +v 0.0501 0.4093 0.7240 +v 0.0527 0.4744 0.7698 +v -0.1288 0.2826 0.5608 +v -0.1771 0.3115 0.5418 +v -0.2431 0.3351 0.5668 +v -0.4106 0.5032 0.7351 +v -0.4393 0.5596 0.7797 +v -0.3373 0.5452 0.8026 +v 0.0544 0.5452 0.8234 +v 0.0655 0.2343 0.5802 +v -0.3020 0.3701 0.6075 +v -0.2369 0.5349 0.8178 +v 0.0185 0.2341 0.5734 +v -0.3498 0.4098 0.6510 +v -0.1386 0.5285 0.8258 +v -0.0295 0.2436 0.5704 +v -0.3832 0.4512 0.6926 +v -0.0412 0.5350 0.8270 +v -0.0787 0.2629 0.5682 +v -0.2718 0.6819 0.9080 +v -0.2518 0.6049 0.8592 +v -0.3576 0.6127 0.8454 +v -0.3827 0.6872 0.8944 +v -0.2977 0.7659 0.9626 +v -0.4126 0.7708 0.9476 +v -0.3243 0.8606 1.0227 +v -0.4383 0.8631 1.0081 +v -0.3292 0.9626 1.0648 +v -0.4420 0.9662 1.0593 +v -0.1615 0.6782 0.9204 +v -0.1456 0.6014 0.8775 +v -0.1847 0.7650 0.9660 +v -0.2089 0.8556 1.0194 +v -0.2147 0.9609 1.0705 +v -0.0532 0.6892 0.9272 +v -0.0413 0.6133 0.8802 +v -0.0732 0.7715 0.9783 +v -0.0947 0.8621 1.0221 +v -0.1012 0.9680 1.0703 +v 0.0516 0.6973 0.9321 +v 0.0596 0.6172 0.8763 +v 0.0347 0.7840 0.9804 +v 0.0153 0.8775 1.0239 +v 0.0094 0.9867 1.0709 +v -0.4638 0.6270 0.8251 +v -0.5553 0.9738 1.0188 +v -0.5503 1.0899 1.0558 +v -0.4321 1.0835 1.0838 +v 0.0152 1.1044 1.1177 +v -0.4899 0.6992 0.8672 +v -0.3178 1.0818 1.0892 +v -0.5236 0.7807 0.9210 +v -0.2051 1.0772 1.1075 +v -0.5499 0.8697 0.9699 +v -0.0942 1.0905 1.1185 +v -0.3119 1.3888 1.1744 +v -0.3124 1.2220 1.1328 +v -0.4228 1.2219 1.1121 +v -0.4211 1.3849 1.1506 +v -0.2980 1.5648 1.2026 +v -0.3999 1.5578 1.1690 +v -0.2639 1.7438 1.2091 +v -0.3594 1.7328 1.1748 +v -0.2530 1.9132 1.2222 +v -0.3389 1.9010 1.1981 +v -0.2051 1.3946 1.2033 +v -0.2044 1.2246 1.1504 +v -0.1943 1.5776 1.2333 +v -0.1674 1.7589 1.2379 +v -0.1647 1.9281 1.2419 +v -0.0997 1.4033 1.2204 +v -0.0971 1.2363 1.1627 +v -0.0911 1.5840 1.2483 +v -0.0711 1.7653 1.2553 +v -0.0766 1.9358 1.2626 +v 0.0040 1.4169 1.2156 +v 0.0095 1.2492 1.1583 +v 0.0084 1.5952 1.2554 +v 0.0220 1.7763 1.2595 +v 0.0094 1.9468 1.2737 +v -0.5336 1.2256 1.0924 +v -0.4240 1.8951 1.1697 +v -0.3825 2.0348 1.1771 +v -0.3039 2.0501 1.2097 +v 0.0136 2.0955 1.2628 +v -0.5305 1.3833 1.1153 +v -0.2245 2.0598 1.2351 +v -0.5011 1.5586 1.1275 +v -0.1442 2.0744 1.2507 +v -0.4527 1.7342 1.1449 +v -0.0650 2.0841 1.2631 +v -0.1485 2.2976 1.1691 +v -0.1856 2.1863 1.2128 +v -0.2527 2.1704 1.1846 +v -0.2091 2.2822 1.1542 +v -0.1009 2.3992 1.1360 +v -0.1515 2.3835 1.1190 +v -0.0573 2.4955 1.0998 +v -0.0982 2.4787 1.0906 +v -0.0130 2.5807 1.0748 +v -0.0409 2.5629 1.0712 +v -0.0862 2.3160 1.1853 +v -0.1182 2.2017 1.2351 +v -0.0483 2.4168 1.1504 +v -0.0143 2.5110 1.1114 +v 0.0175 2.5957 1.0815 +v -0.0250 2.3269 1.2008 +v -0.0513 2.2112 1.2417 +v 0.0041 2.4300 1.1611 +v 0.0286 2.5265 1.1252 +v 0.0480 2.6085 1.0859 +v 0.0357 2.3384 1.2070 +v 0.0175 2.2243 1.2456 +v 0.0546 2.4401 1.1702 +v 0.0683 2.5353 1.1306 +v 0.0757 2.6160 1.0873 +v -0.3260 2.1534 1.1584 +v -0.0650 2.5465 1.0666 +v -0.0039 2.6362 1.0470 +v 0.0180 2.6489 1.0438 +v 0.0839 2.6830 1.0310 +v -0.2715 2.2705 1.1311 +v 0.0359 2.6606 1.0403 +v -0.2030 2.3701 1.1035 +v 0.0526 2.6710 1.0377 +v -0.1351 2.4639 1.0828 +v 0.0685 2.6794 1.0334 +v 0.1661 0.2594 0.6204 +v 0.2242 0.2691 0.6093 +v 0.2444 0.3139 0.6431 +v 0.1781 0.3027 0.6529 +v 0.2681 0.3587 0.6807 +v 0.1941 0.3552 0.6904 +v 0.2952 0.4120 0.7207 +v 0.2154 0.4079 0.7293 +v 0.3198 0.4727 0.7678 +v 0.2335 0.4697 0.7759 +v 0.2833 0.2778 0.5968 +v 0.3120 0.3206 0.6333 +v 0.3417 0.3651 0.6740 +v 0.3718 0.4176 0.7168 +v 0.4012 0.4800 0.7589 +v 0.3419 0.2980 0.5787 +v 0.3778 0.3377 0.6174 +v 0.4134 0.3889 0.6537 +v 0.4506 0.4438 0.6930 +v 0.4870 0.5049 0.7297 +v 0.4034 0.3223 0.5601 +v 0.4437 0.3603 0.5876 +v 0.4829 0.4098 0.6247 +v 0.5266 0.4637 0.6534 +v 0.5693 0.5309 0.6903 +v 0.1096 0.2228 0.5938 +v 0.1595 0.2244 0.5873 +v 0.1116 0.2572 0.6247 +v 0.2442 0.5408 0.8266 +v 0.1508 0.5329 0.8396 +v 0.1442 0.4612 0.7863 +v 0.6954 0.6175 0.7009 +v 0.6039 0.5976 0.7369 +v 0.6509 0.5578 0.6620 +v 0.3570 0.2917 0.5257 +v 0.4062 0.3144 0.5022 +v 0.4595 0.3483 0.5252 +v 0.1149 0.2989 0.6588 +v 0.3355 0.5427 0.8205 +v 0.6034 0.4924 0.6172 +v 0.3067 0.2644 0.5479 +v 0.1213 0.3446 0.6945 +v 0.4266 0.5477 0.8019 +v 0.5543 0.4317 0.5830 +v 0.2590 0.2461 0.5626 +v 0.1332 0.3980 0.7363 +v 0.5155 0.5752 0.7710 +v 0.5087 0.3863 0.5548 +v 0.2101 0.2343 0.5765 +v 0.2550 0.6155 0.8749 +v 0.3504 0.6172 0.8729 +v 0.3540 0.6901 0.9212 +v 0.2529 0.6940 0.9326 +v 0.3450 0.7782 0.9638 +v 0.2426 0.7801 0.9808 +v 0.3322 0.8768 1.0202 +v 0.2295 0.8748 1.0357 +v 0.3331 0.9900 1.0673 +v 0.2274 0.9858 1.0767 +v 0.4463 0.6188 0.8470 +v 0.4534 0.6962 0.8981 +v 0.4468 0.7860 0.9467 +v 0.4378 0.8842 1.0005 +v 0.4397 0.9958 1.0576 +v 0.5405 0.6456 0.8224 +v 0.5541 0.7181 0.8735 +v 0.5491 0.8068 0.9219 +v 0.5441 0.9070 0.9771 +v 0.5459 1.0165 1.0242 +v 0.6340 0.6665 0.7842 +v 0.6487 0.7447 0.8311 +v 0.6491 0.8297 0.8900 +v 0.6467 0.9297 0.9400 +v 0.6498 1.0353 0.9784 +v 0.1603 0.6098 0.8893 +v 0.2333 1.1053 1.1228 +v 0.1243 1.1054 1.1304 +v 0.1213 0.9794 1.0935 +v 0.7539 1.1642 0.9752 +v 0.6503 1.1514 1.0252 +v 0.7564 1.0481 0.9331 +v 0.7279 0.6904 0.7400 +v 0.1533 0.6889 0.9410 +v 0.3403 1.1137 1.1075 +v 0.7507 0.9419 0.8839 +v 0.1424 0.7735 0.9861 +v 0.4430 1.1249 1.0857 +v 0.7470 0.8459 0.8337 +v 0.1271 0.8705 1.0380 +v 0.5454 1.1378 1.0658 +v 0.7433 0.7629 0.7808 +v 0.2228 1.2498 1.1728 +v 0.3284 1.2550 1.1517 +v 0.3109 1.4161 1.1970 +v 0.2095 1.4174 1.2113 +v 0.2992 1.5917 1.2265 +v 0.2010 1.5990 1.2514 +v 0.2939 1.7725 1.2375 +v 0.2010 1.7855 1.2598 +v 0.2630 1.9490 1.2511 +v 0.1769 1.9590 1.2791 +v 0.4344 1.2673 1.1314 +v 0.4109 1.4305 1.1735 +v 0.3967 1.6081 1.2023 +v 0.3891 1.7824 1.2147 +v 0.3530 1.9472 1.2213 +v 0.5371 1.2762 1.0979 +v 0.5104 1.4381 1.1421 +v 0.4957 1.6132 1.1716 +v 0.4818 1.7910 1.1962 +v 0.4421 1.9596 1.2006 +v 0.6399 1.2922 1.0720 +v 0.6119 1.4507 1.1080 +v 0.5904 1.6253 1.1444 +v 0.5706 1.7940 1.1592 +v 0.5273 1.9597 1.1657 +v 0.1164 1.2459 1.1766 +v 0.1721 2.1089 1.2676 +v 0.0929 2.1046 1.2793 +v 0.0942 1.9537 1.2994 +v 0.5647 2.1043 1.1176 +v 0.4883 2.1049 1.1604 +v 0.6101 1.9660 1.1218 +v 0.7413 1.3001 1.0384 +v 0.1076 1.4146 1.2256 +v 0.2515 2.1014 1.2518 +v 0.6604 1.8033 1.1059 +v 0.1050 1.5982 1.2675 +v 0.3313 2.0950 1.2221 +v 0.6821 1.6309 1.0916 +v 0.1127 1.7813 1.2774 +v 0.4095 2.1058 1.1930 +v 0.7068 1.4563 1.0638 +v 0.1632 2.2368 1.2607 +v 0.2350 2.2341 1.2519 +v 0.2232 2.3537 1.2251 +v 0.1610 2.3504 1.2316 +v 0.2062 2.4595 1.1849 +v 0.1521 2.4531 1.1915 +v 0.1800 2.5470 1.1380 +v 0.1368 2.5476 1.1445 +v 0.1512 2.6245 1.0966 +v 0.1214 2.6275 1.1021 +v 0.3065 2.2242 1.2270 +v 0.2839 2.3450 1.2123 +v 0.2625 2.4542 1.1707 +v 0.2261 2.5451 1.1266 +v 0.1839 2.6206 1.0900 +v 0.3771 2.2293 1.1857 +v 0.3449 2.3424 1.1835 +v 0.3170 2.4464 1.1537 +v 0.2706 2.5380 1.1145 +v 0.2170 2.6123 1.0834 +v 0.4477 2.2276 1.1462 +v 0.4041 2.3383 1.1392 +v 0.3671 2.4416 1.1339 +v 0.3134 2.5298 1.1027 +v 0.2481 2.6039 1.0791 +v 0.0894 2.2329 1.2686 +v 0.1183 2.6938 1.0461 +v 0.1025 2.6960 1.0461 +v 0.0972 2.6288 1.1060 +v 0.1923 2.6568 1.0603 +v 0.1784 2.6693 1.0555 +v 0.2740 2.5939 1.0754 +v 0.5220 2.2235 1.1054 +v 0.0978 2.3489 1.2341 +v 0.1338 2.6911 1.0461 +v 0.3505 2.5182 1.0955 +v 0.1018 2.4531 1.1929 +v 0.1488 2.6870 1.0476 +v 0.4151 2.4296 1.1031 +v 0.1003 2.5459 1.1494 +v 0.1638 2.6794 1.0514 +v 0.4668 2.3355 1.0948 +v -0.1965 0.2968 0.6021 +v -0.1331 0.2775 0.6178 +v -0.1679 0.3103 0.6551 +v -0.2405 0.3323 0.6327 +v -0.1928 0.3564 0.6955 +v -0.2753 0.3757 0.6781 +v -0.2095 0.4043 0.7383 +v -0.3010 0.4202 0.7267 +v -0.2237 0.4608 0.7879 +v -0.3217 0.4696 0.7697 +v -0.0686 0.2615 0.6196 +v -0.0934 0.2981 0.6578 +v -0.1111 0.3463 0.7019 +v -0.1212 0.4020 0.7448 +v -0.1300 0.4543 0.7956 +v -0.0049 0.2539 0.6208 +v -0.0198 0.2952 0.6549 +v -0.0308 0.3451 0.6940 +v -0.0352 0.4010 0.7405 +v -0.0379 0.4567 0.7925 +v 0.0560 0.2575 0.6281 +v 0.0505 0.2978 0.6588 +v 0.0472 0.3434 0.6953 +v 0.0498 0.3995 0.7392 +v 0.0534 0.4635 0.7857 +v -0.1849 0.2927 0.5456 +v -0.1364 0.2647 0.5679 +v -0.2542 0.3161 0.5721 +v -0.3422 0.5328 0.8200 +v -0.4459 0.5471 0.7973 +v -0.4189 0.4895 0.7499 +v 0.0557 0.5335 0.8389 +v 0.0604 0.2213 0.5944 +v -0.3108 0.3527 0.6176 +v -0.2408 0.5227 0.8348 +v 0.0116 0.2200 0.5873 +v -0.3563 0.3945 0.6612 +v -0.1400 0.5179 0.8442 +v -0.0364 0.2294 0.5821 +v -0.3903 0.4347 0.7056 +v -0.0413 0.5254 0.8443 +v -0.0856 0.2470 0.5786 +v -0.3619 0.6005 0.8638 +v -0.2536 0.5937 0.8773 +v -0.2740 0.6719 0.9246 +v -0.3857 0.6766 0.9109 +v -0.2993 0.7563 0.9796 +v -0.4138 0.7621 0.9635 +v -0.3239 0.8513 1.0416 +v -0.4423 0.8532 1.0250 +v -0.3302 0.9532 1.0846 +v -0.4475 0.9584 1.0780 +v -0.1454 0.5894 0.8939 +v -0.1632 0.6679 0.9393 +v -0.1838 0.7540 0.9837 +v -0.2051 0.8455 1.0379 +v -0.2133 0.9523 1.0892 +v -0.0392 0.6018 0.8958 +v -0.0542 0.6778 0.9467 +v -0.0699 0.7618 0.9967 +v -0.0898 0.8528 1.0417 +v -0.0990 0.9617 1.0888 +v 0.0631 0.6073 0.8940 +v 0.0518 0.6871 0.9479 +v 0.0395 0.7730 0.9992 +v 0.0212 0.8697 1.0431 +v 0.0127 0.9772 1.0904 +v -0.4685 0.6153 0.8406 +v -0.4352 1.0766 1.1040 +v -0.5526 1.0830 1.0750 +v -0.5613 0.9675 1.0361 +v 0.0147 1.0968 1.1382 +v -0.4954 0.6887 0.8838 +v -0.3199 1.0737 1.1102 +v -0.5288 0.7707 0.9361 +v -0.2071 1.0724 1.1283 +v -0.5555 0.8629 0.9862 +v -0.0957 1.0837 1.1382 +v -0.4272 1.2181 1.1322 +v -0.3169 1.2177 1.1524 +v -0.3149 1.3871 1.1936 +v -0.4236 1.3827 1.1701 +v -0.3009 1.5630 1.2224 +v -0.4051 1.5576 1.1888 +v -0.2686 1.7444 1.2285 +v -0.3651 1.7351 1.1942 +v -0.2584 1.9165 1.2426 +v -0.3466 1.9028 1.2187 +v -0.2072 1.2224 1.1693 +v -0.2072 1.3944 1.2232 +v -0.1953 1.5786 1.2539 +v -0.1704 1.7604 1.2580 +v -0.1686 1.9313 1.2621 +v -0.0988 1.2314 1.1820 +v -0.1002 1.4003 1.2399 +v -0.0922 1.5828 1.2691 +v -0.0725 1.7660 1.2756 +v -0.0782 1.9385 1.2828 +v 0.0090 1.2450 1.1776 +v 0.0051 1.4125 1.2349 +v 0.0085 1.5938 1.2758 +v 0.0229 1.7763 1.2799 +v 0.0104 1.9491 1.2942 +v -0.5397 1.2180 1.1127 +v -0.3111 2.0544 1.2283 +v -0.3918 2.0399 1.1959 +v -0.4315 1.8973 1.1897 +v 0.0133 2.0993 1.2834 +v -0.5341 1.3797 1.1355 +v -0.2288 2.0640 1.2555 +v -0.5056 1.5547 1.1466 +v -0.1475 2.0802 1.2707 +v -0.4579 1.7324 1.1645 +v -0.0669 2.0883 1.2840 +v -0.2627 2.1786 1.2028 +v -0.1926 2.1954 1.2307 +v -0.1526 2.3082 1.1883 +v -0.2171 2.2911 1.1715 +v -0.1072 2.4089 1.1538 +v -0.1600 2.3945 1.1360 +v -0.0636 2.5068 1.1181 +v -0.1042 2.4881 1.1079 +v -0.0210 2.5906 1.0917 +v -0.0492 2.5749 1.0884 +v -0.1244 2.2076 1.2538 +v -0.0899 2.3258 1.2037 +v -0.0539 2.4273 1.1681 +v -0.0203 2.5211 1.1295 +v 0.0108 2.6070 1.0974 +v -0.0550 2.2179 1.2620 +v -0.0277 2.3359 1.2200 +v -0.0003 2.4401 1.1795 +v 0.0231 2.5345 1.1444 +v 0.0431 2.6215 1.1018 +v 0.0158 2.2295 1.2658 +v 0.0348 2.3472 1.2265 +v 0.0521 2.4512 1.1884 +v 0.0643 2.5439 1.1505 +v 0.0729 2.6285 1.1037 +v -0.3328 2.1606 1.1770 +v 0.0180 2.6563 1.0609 +v -0.0006 2.6393 1.0671 +v -0.0721 2.5575 1.0855 +v 0.0864 2.6948 1.0460 +v -0.2797 2.2785 1.1475 +v 0.0362 2.6700 1.0563 +v -0.2091 2.3787 1.1196 +v 0.0533 2.6804 1.0529 +v -0.1411 2.4724 1.1010 +v 0.0700 2.6897 1.0478 +# 650 vertices + +vn 0.1100 0.9937 0.0194 +vn 0.1696 0.9851 -0.0287 +vn 0.0822 0.9961 0.0336 +vn 0.0682 0.9947 0.0764 +vn 0.0572 0.9977 0.0359 +vn 0.0513 0.9949 0.0872 +vn 0.0259 0.9982 0.0536 +vn 0.0524 0.9969 0.0589 +vn 0.0477 0.9970 0.0607 +vn 0.0375 0.9956 0.0856 +vn 0.1785 0.9805 -0.0819 +vn 0.2577 0.9495 -0.1789 +vn 0.1695 0.9839 -0.0564 +vn 0.1833 0.9829 -0.0161 +vn 0.1945 0.9792 0.0581 +vn 0.3307 0.9211 -0.2054 +vn 0.3560 0.8859 -0.2974 +vn 0.3282 0.9404 -0.0885 +vn 0.3654 0.9280 -0.0721 +vn 0.3687 0.9289 -0.0337 +vn 0.4039 0.8787 -0.2545 +vn 0.4064 0.8165 -0.4100 +vn 0.4097 0.8990 -0.1548 +vn 0.4052 0.9099 -0.0883 +vn 0.3973 0.9146 -0.0750 +vn 0.1140 0.9932 -0.0214 +vn -0.0167 0.9992 0.0356 +vn -0.0215 0.9982 0.0568 +vn -0.0092 0.9956 0.0935 +vn -0.0122 0.9898 0.1419 +vn 0.0291 0.9901 0.1370 +vn 0.3603 0.9322 -0.0333 +vn 0.3703 0.9282 -0.0365 +vn 0.4000 0.9079 -0.1250 +vn 0.4390 0.7531 -0.4901 +vn 0.4287 0.7147 -0.5526 +vn 0.4510 0.6984 -0.5558 +vn -0.0303 0.9959 0.0848 +vn 0.0554 0.9921 0.1124 +vn 0.4298 0.8936 -0.1295 +vn 0.3803 0.8593 -0.3420 +vn -0.0088 0.9977 0.0674 +vn 0.2140 0.9727 0.0902 +vn 0.4357 0.8808 -0.1855 +vn 0.2936 0.9269 -0.2337 +vn 0.0117 0.9985 0.0542 +vn 0.3299 0.9435 0.0308 +vn 0.4335 0.8602 -0.2686 +vn 0.2208 0.9703 -0.0990 +vn 0.0621 0.9741 0.2175 +vn 0.0525 0.9868 0.1531 +vn 0.0187 0.9877 0.1552 +vn 0.0141 0.9781 0.2074 +vn 0.0676 0.9618 0.2654 +vn 0.0118 0.9680 0.2507 +vn 0.0629 0.9546 0.2911 +vn 0.0031 0.9509 0.3095 +vn 0.0358 0.9147 0.4025 +vn 0.0416 0.9285 0.3689 +vn 0.1814 0.9627 0.2008 +vn 0.2026 0.9715 0.1234 +vn 0.1616 0.9517 0.2609 +vn 0.1615 0.9497 0.2681 +vn 0.1359 0.9111 0.3891 +vn 0.2995 0.9420 0.1513 +vn 0.3090 0.9484 0.0712 +vn 0.2455 0.9361 0.2518 +vn 0.2557 0.9218 0.2913 +vn 0.2944 0.8922 0.3426 +vn 0.3789 0.9166 0.1272 +vn 0.3581 0.9313 0.0672 +vn 0.3511 0.9124 0.2105 +vn 0.3326 0.8908 0.3096 +vn 0.3448 0.8725 0.3463 +vn 0.0017 0.9849 0.1731 +vn -0.0198 0.9305 0.3659 +vn -0.0196 0.9065 0.4217 +vn 0.0509 0.9136 0.4034 +vn 0.3251 0.8678 0.3758 +vn 0.3577 0.8691 0.3416 +vn 0.3547 0.8689 0.3452 +vn 0.3885 0.9189 0.0677 +vn 0.0003 0.9743 0.2252 +vn 0.1094 0.9023 0.4171 +vn 0.3964 0.8780 0.2684 +vn 0.0031 0.9657 0.2595 +vn 0.1411 0.8741 0.4649 +vn 0.4028 0.8981 0.1767 +vn -0.0162 0.9562 0.2924 +vn 0.2223 0.8633 0.4531 +vn 0.3964 0.9087 0.1306 +vn 0.1230 0.8436 0.5227 +vn 0.1263 0.8805 0.4569 +vn 0.0408 0.8878 0.4585 +vn 0.0739 0.8590 0.5066 +vn 0.1666 0.7998 0.5768 +vn 0.1279 0.8077 0.5755 +vn 0.1778 0.7489 0.6384 +vn 0.1479 0.7660 0.6256 +vn 0.2445 0.7229 0.6462 +vn 0.1880 0.7293 0.6579 +vn 0.1919 0.8284 0.5262 +vn 0.1930 0.8661 0.4612 +vn 0.1941 0.7882 0.5840 +vn 0.1579 0.7423 0.6512 +vn 0.2109 0.7036 0.6786 +vn 0.2412 0.8200 0.5190 +vn 0.2180 0.8476 0.4837 +vn 0.2285 0.7875 0.5725 +vn 0.2244 0.7341 0.6409 +vn 0.2296 0.6651 0.7106 +vn 0.3062 0.7947 0.5241 +vn 0.2476 0.8335 0.4939 +vn 0.3232 0.7555 0.5698 +vn 0.3619 0.6880 0.6291 +vn 0.3625 0.6080 0.7064 +vn -0.0292 0.8928 0.4495 +vn 0.0129 0.7260 0.6876 +vn 0.0183 0.6633 0.7481 +vn 0.1078 0.6775 0.7276 +vn 0.3798 0.5470 0.7460 +vn 0.4196 0.5243 0.7410 +vn 0.4222 0.5830 0.6942 +vn 0.2796 0.8333 0.4769 +vn 0.0373 0.8805 0.4727 +vn 0.2162 0.6957 0.6850 +vn 0.4376 0.6548 0.6163 +vn 0.0583 0.8167 0.5742 +vn 0.3002 0.6721 0.6769 +vn 0.4048 0.7219 0.5612 +vn 0.0560 0.7824 0.6203 +vn 0.3081 0.6084 0.7314 +vn 0.3380 0.7669 0.5456 +vn 0.1062 0.4872 0.8668 +vn 0.1533 0.6269 0.7639 +vn 0.0558 0.6140 0.7874 +vn 0.0205 0.4917 0.8705 +vn 0.1404 0.3606 0.9221 +vn -0.0113 0.3802 0.9249 +vn 0.1448 0.2822 0.9484 +vn 0.0872 0.3247 0.9418 +vn 0.1767 0.2256 0.9581 +vn 0.1679 0.2364 0.9570 +vn 0.2635 0.4813 0.8360 +vn 0.3549 0.6188 0.7008 +vn 0.2558 0.3390 0.9053 +vn 0.2327 0.2491 0.9401 +vn 0.2457 0.2050 0.9474 +vn 0.4426 0.4768 0.7595 +vn 0.4337 0.5562 0.7089 +vn 0.3069 0.3335 0.8914 +vn 0.2925 0.2380 0.9262 +vn 0.2471 0.2272 0.9420 +vn 0.5221 0.4590 0.7188 +vn 0.4280 0.4903 0.7592 +vn 0.4333 0.3381 0.8354 +vn 0.3036 0.2557 0.9179 +vn 0.2407 0.2321 0.9424 +vn -0.0255 0.5905 0.8066 +vn 0.0147 0.2183 0.9758 +vn -0.0183 0.1058 0.9942 +vn 0.0629 0.1245 0.9902 +vn -0.0016 0.3688 0.9295 +vn -0.4594 0.0222 -0.8880 +vn 0.2498 0.2777 0.9276 +vn 0.4257 0.4676 0.7746 +vn -0.0906 0.4540 0.8864 +vn 0.0925 0.1580 0.9831 +vn 0.3237 0.2617 0.9093 +vn -0.0916 0.3907 0.9160 +vn 0.0999 0.1861 0.9774 +vn 0.5260 0.3858 0.7579 +vn 0.0021 0.3600 0.9329 +vn 0.1203 0.2186 0.9684 +vn 0.5166 0.4288 0.7411 +vn -0.3315 0.9248 -0.1867 +vn -0.3416 0.8761 -0.3403 +vn -0.4527 0.7376 -0.5009 +vn -0.4373 0.8417 -0.3168 +vn -0.3005 0.9512 -0.0694 +vn -0.3703 0.9090 -0.1911 +vn -0.2535 0.9670 -0.0245 +vn -0.3239 0.9408 -0.0998 +vn -0.2371 0.9709 0.0353 +vn -0.3150 0.9490 -0.0111 +vn -0.1645 0.9838 -0.0710 +vn -0.2471 0.9529 -0.1758 +vn -0.1251 0.9918 0.0261 +vn -0.1124 0.9933 0.0284 +vn -0.1139 0.9923 0.0495 +vn -0.1063 0.9937 0.0350 +vn -0.1705 0.9852 -0.0183 +vn -0.0741 0.9952 0.0646 +vn -0.0573 0.9971 0.0505 +vn -0.0193 0.9982 0.0560 +vn -0.0878 0.9927 0.0832 +vn -0.1058 0.9925 0.0612 +vn -0.0772 0.9953 0.0587 +vn -0.0839 0.9928 0.0856 +vn -0.0624 0.9923 0.1069 +vn -0.4532 0.7133 -0.5346 +vn -0.4733 0.5412 -0.6950 +vn -0.4486 0.7241 -0.5239 +vn -0.3494 0.9366 -0.0269 +vn -0.3241 0.9448 0.0480 +vn -0.2976 0.9515 0.0780 +vn -0.0370 0.9922 0.1187 +vn -0.1079 0.9938 0.0256 +vn -0.3954 0.8556 -0.3340 +vn -0.2361 0.9645 0.1181 +vn -0.1981 0.9795 -0.0369 +vn -0.3490 0.9120 -0.2154 +vn -0.1195 0.9861 0.1157 +vn -0.2801 0.9491 -0.1438 +vn -0.3478 0.9314 -0.1069 +vn -0.0278 0.9916 0.1262 +vn -0.3769 0.8626 -0.3374 +vn -0.1926 0.9679 0.1614 +vn -0.2339 0.9574 0.1695 +vn -0.2702 0.9552 0.1208 +vn -0.2703 0.9551 0.1215 +vn -0.1586 0.9735 0.1649 +vn -0.2687 0.9556 0.1206 +vn -0.1546 0.9555 0.2511 +vn -0.2849 0.9345 0.2133 +vn -0.1554 0.8947 0.4187 +vn -0.2779 0.8711 0.4048 +vn -0.1571 0.9629 0.2195 +vn -0.1386 0.9739 0.1797 +vn -0.1344 0.9646 0.2270 +vn -0.0801 0.9641 0.2531 +vn -0.0959 0.9271 0.3624 +vn -0.0725 0.9755 0.2079 +vn -0.0456 0.9845 0.1691 +vn -0.0879 0.9629 0.2550 +vn -0.0681 0.9512 0.3009 +vn -0.0420 0.9395 0.3400 +vn -0.0255 0.9773 0.2101 +vn -0.0213 0.9896 0.1421 +vn -0.0235 0.9620 0.2721 +vn -0.0502 0.9460 0.3204 +vn -0.0529 0.9311 0.3608 +vn -0.3197 0.9419 0.1031 +vn -0.3882 0.8453 0.3672 +vn -0.3004 0.8353 0.4604 +vn -0.2443 0.8317 0.4986 +vn -0.0209 0.9128 0.4079 +vn -0.3339 0.9367 0.1052 +vn -0.1841 0.8561 0.4830 +vn -0.3370 0.9351 0.1096 +vn -0.1783 0.8749 0.4503 +vn -0.3914 0.8956 0.2115 +vn -0.0727 0.9070 0.4147 +vn -0.2975 0.8040 0.5148 +vn -0.2349 0.8566 0.4595 +vn -0.2625 0.8269 0.4974 +vn -0.3236 0.7721 0.5469 +vn -0.3531 0.7045 0.6157 +vn -0.4055 0.6554 0.6372 +vn -0.3685 0.6726 0.6418 +vn -0.3882 0.6765 0.6259 +vn -0.3086 0.7213 0.6201 +vn -0.3567 0.7082 0.6093 +vn -0.2596 0.8271 0.4985 +vn -0.1966 0.8797 0.4330 +vn -0.2803 0.7390 0.6127 +vn -0.2989 0.6949 0.6540 +vn -0.2870 0.7079 0.6453 +vn -0.1141 0.8679 0.4834 +vn -0.0775 0.9012 0.4264 +vn -0.1710 0.7723 0.6119 +vn -0.1774 0.7415 0.6470 +vn -0.2338 0.7063 0.6682 +vn 0.0025 0.8871 0.4616 +vn -0.0301 0.8982 0.4386 +vn -0.0533 0.8012 0.5961 +vn -0.0810 0.7685 0.6347 +vn -0.1500 0.7100 0.6880 +vn -0.2766 0.8241 0.4943 +vn -0.3889 0.6921 0.6081 +vn -0.4536 0.5115 0.7298 +vn -0.4200 0.5130 0.7487 +vn -0.0650 0.6665 0.7427 +vn -0.3850 0.7219 0.5751 +vn -0.3246 0.6094 0.7234 +vn -0.4307 0.6356 0.6407 +vn -0.2446 0.6548 0.7151 +vn -0.3723 0.6975 0.6123 +vn -0.1601 0.6610 0.7331 +vn -0.3750 0.2930 0.8795 +vn -0.4291 0.3285 0.8414 +vn -0.4442 0.3191 0.8372 +vn -0.3893 0.2923 0.8735 +vn -0.4177 0.2331 0.8782 +vn -0.4166 0.2208 0.8819 +vn -0.4089 0.2512 0.8773 +vn -0.3926 0.2711 0.8788 +vn -0.4461 0.1582 0.8809 +vn -0.4710 0.1494 0.8694 +vn -0.3567 0.2916 0.8875 +vn -0.2967 0.4368 0.8492 +vn -0.3677 0.2866 0.8847 +vn -0.4260 0.2367 0.8732 +vn -0.3962 0.1796 0.9004 +vn -0.2653 0.3620 0.8936 +vn -0.1767 0.5094 0.8422 +vn -0.2987 0.3431 0.8905 +vn -0.3419 0.2844 0.8957 +vn -0.2951 0.1824 0.9379 +vn -0.1857 0.4191 0.8888 +vn -0.1299 0.5356 0.8344 +vn -0.1976 0.3837 0.9021 +vn -0.1665 0.3431 0.9244 +vn -0.1788 0.1865 0.9661 +vn -0.4256 0.3621 0.8293 +vn -0.5142 0.0680 0.8550 +vn -0.0291 0.5830 0.8119 +vn -0.0822 0.4744 0.8764 +vn -0.0680 0.1282 0.9894 +vn -0.4177 0.2906 0.8609 +vn -0.2019 0.3022 0.9316 +vn -0.3946 0.2407 0.8868 +vn -0.1153 0.2591 0.9590 +vn -0.3884 0.2726 0.8803 +vn -0.0812 0.1813 0.9801 +vn -0.0819 -0.9964 -0.0237 +vn -0.1605 -0.9865 0.0315 +vn -0.1114 -0.9938 -0.0041 +vn -0.0678 -0.9950 -0.0728 +vn -0.0495 -0.9982 -0.0338 +vn -0.0456 -0.9955 -0.0825 +vn -0.0234 -0.9973 -0.0694 +vn -0.0416 -0.9964 -0.0732 +vn -0.0433 -0.9961 -0.0762 +vn -0.0334 -0.9950 -0.0942 +vn -0.2556 -0.9505 0.1767 +vn -0.1879 -0.9782 0.0886 +vn -0.1927 -0.9779 0.0818 +vn -0.1754 -0.9845 -0.0079 +vn -0.1950 -0.9786 -0.0659 +vn -0.3597 -0.8837 0.2994 +vn -0.3306 -0.9262 0.1814 +vn -0.3452 -0.9315 0.1150 +vn -0.3664 -0.9274 0.0756 +vn -0.3668 -0.9303 0.0036 +vn -0.4134 -0.8142 0.4077 +vn -0.4156 -0.8704 0.2641 +vn -0.4036 -0.9022 0.1522 +vn -0.4109 -0.9063 0.0986 +vn -0.3785 -0.9243 0.0495 +vn 0.0193 -0.9998 -0.0092 +vn -0.1019 -0.9941 0.0374 +vn 0.0176 -0.9990 -0.0417 +vn -0.0242 -0.9905 -0.1355 +vn 0.0104 -0.9905 -0.1373 +vn 0.0115 -0.9954 -0.0955 +vn -0.3318 -0.9430 -0.0266 +vn -0.3441 -0.9389 0.0106 +vn -0.3682 -0.9238 0.1044 +vn -0.4465 -0.7022 0.5545 +vn -0.4231 -0.7479 0.5115 +vn -0.4508 -0.7531 0.4792 +vn 0.0166 -0.9967 -0.0798 +vn -0.0530 -0.9929 -0.1066 +vn -0.4327 -0.8867 0.1626 +vn -0.3820 -0.8514 0.3596 +vn 0.0080 -0.9969 -0.0779 +vn -0.2197 -0.9720 -0.0831 +vn -0.4378 -0.8796 0.1863 +vn -0.2944 -0.9204 0.2573 +vn 0.0027 -0.9972 -0.0742 +vn -0.3404 -0.9400 -0.0245 +vn -0.4452 -0.8396 0.3113 +vn -0.2026 -0.9731 0.1098 +vn -0.0119 -0.9887 -0.1494 +vn -0.0501 -0.9885 -0.1430 +vn -0.0595 -0.9732 -0.2223 +vn -0.0196 -0.9791 -0.2024 +vn -0.0711 -0.9596 -0.2724 +vn -0.0274 -0.9687 -0.2467 +vn -0.0746 -0.9555 -0.2855 +vn -0.0055 -0.9495 -0.3138 +vn -0.0382 -0.9156 -0.4002 +vn -0.0436 -0.9283 -0.3694 +vn -0.2035 -0.9719 -0.1182 +vn -0.1858 -0.9617 -0.2015 +vn -0.1623 -0.9498 -0.2674 +vn -0.1611 -0.9494 -0.2696 +vn -0.1405 -0.9131 -0.3828 +vn -0.3226 -0.9452 -0.0506 +vn -0.3054 -0.9396 -0.1546 +vn -0.2542 -0.9324 -0.2569 +vn -0.2613 -0.9203 -0.2912 +vn -0.2964 -0.8939 -0.3363 +vn -0.3664 -0.9289 -0.0544 +vn -0.3942 -0.9110 -0.1208 +vn -0.3643 -0.9063 -0.2144 +vn -0.3408 -0.8910 -0.3000 +vn -0.3409 -0.8763 -0.3404 +vn -0.0095 -0.9874 -0.1579 +vn -0.0495 -0.9132 -0.4045 +vn 0.0151 -0.9061 -0.4228 +vn 0.0134 -0.9315 -0.3636 +vn -0.3581 -0.8715 -0.3351 +vn -0.3298 -0.8706 -0.3652 +vn -0.3467 -0.8749 -0.3381 +vn -0.3773 -0.9218 -0.0885 +vn 0.0048 -0.9759 -0.2183 +vn -0.1083 -0.9022 -0.4176 +vn -0.4062 -0.8788 -0.2505 +vn -0.0014 -0.9663 -0.2575 +vn -0.1411 -0.8745 -0.4640 +vn -0.4211 -0.8895 -0.1773 +vn 0.0157 -0.9547 -0.2972 +vn -0.2235 -0.8655 -0.4482 +vn -0.4018 -0.9056 -0.1355 +vn -0.0403 -0.8887 -0.4568 +vn -0.1276 -0.8809 -0.4558 +vn -0.1240 -0.8453 -0.5197 +vn -0.0604 -0.8589 -0.5086 +vn -0.1637 -0.7990 -0.5786 +vn -0.1232 -0.8089 -0.5748 +vn -0.1707 -0.7478 -0.6416 +vn -0.1476 -0.7644 -0.6276 +vn -0.2405 -0.7224 -0.6483 +vn -0.1918 -0.7283 -0.6579 +vn -0.1907 -0.8650 -0.4640 +vn -0.1996 -0.8286 -0.5230 +vn -0.1970 -0.7897 -0.5810 +vn -0.1500 -0.7421 -0.6532 +vn -0.2060 -0.7021 -0.6816 +vn -0.2134 -0.8452 -0.4899 +vn -0.2446 -0.8201 -0.5173 +vn -0.2308 -0.7888 -0.5696 +vn -0.2369 -0.7314 -0.6394 +vn -0.2336 -0.6632 -0.7110 +vn -0.2440 -0.8320 -0.4983 +vn -0.3092 -0.7926 -0.5255 +vn -0.3315 -0.7515 -0.5704 +vn -0.3750 -0.6841 -0.6256 +vn -0.3626 -0.6123 -0.7026 +vn 0.0346 -0.8898 -0.4550 +vn -0.1069 -0.6792 -0.7261 +vn -0.0174 -0.6637 -0.7478 +vn -0.0148 -0.7257 -0.6878 +vn -0.4234 -0.5233 -0.7395 +vn -0.3769 -0.5441 -0.7496 +vn -0.4099 -0.5931 -0.6930 +vn -0.2780 -0.8344 -0.4760 +vn -0.0329 -0.8802 -0.4735 +vn -0.2208 -0.6951 -0.6842 +vn -0.4466 -0.6516 -0.6132 +vn -0.0553 -0.8175 -0.5733 +vn -0.2938 -0.6699 -0.6818 +vn -0.4238 -0.7154 -0.5555 +vn -0.0556 -0.7821 -0.6207 +vn -0.2991 -0.6063 -0.7369 +vn -0.3366 -0.7624 -0.5527 +vn -0.0513 -0.6144 -0.7873 +vn -0.1694 -0.6315 -0.7567 +vn -0.1170 -0.4814 -0.8687 +vn -0.0117 -0.4817 -0.8763 +vn -0.1210 -0.3565 -0.9264 +vn -0.0062 -0.3833 -0.9236 +vn -0.1406 -0.2883 -0.9472 +vn -0.0779 -0.3270 -0.9418 +vn -0.1784 -0.2168 -0.9598 +vn -0.1457 -0.2230 -0.9639 +vn -0.3554 -0.6194 -0.7001 +vn -0.2831 -0.4859 -0.8269 +vn -0.2521 -0.3348 -0.9079 +vn -0.2354 -0.2529 -0.9384 +vn -0.2291 -0.2057 -0.9514 +vn -0.4324 -0.5539 -0.7115 +vn -0.4496 -0.4778 -0.7547 +vn -0.3147 -0.3371 -0.8873 +vn -0.2781 -0.2490 -0.9277 +vn -0.2466 -0.2169 -0.9446 +vn -0.4293 -0.4833 -0.7630 +vn -0.5236 -0.4565 -0.7194 +vn -0.4439 -0.3458 -0.8267 +vn -0.2895 -0.2550 -0.9226 +vn -0.2731 -0.1984 -0.9413 +vn 0.0324 -0.5881 -0.8081 +vn -0.0851 -0.1117 -0.9901 +vn 0.0017 -0.0948 -0.9955 +vn -0.0086 -0.2125 -0.9771 +vn 0.5084 -0.7096 -0.4879 +vn -0.0720 -0.3006 -0.9510 +vn -0.2916 -0.2238 -0.9300 +vn -0.4287 -0.4586 -0.7784 +vn 0.0877 -0.4542 -0.8866 +vn -0.0933 -0.1359 -0.9863 +vn -0.3249 -0.2750 -0.9049 +vn 0.0764 -0.3919 -0.9169 +vn -0.0794 -0.1708 -0.9821 +vn -0.5280 -0.3912 -0.7538 +vn -0.0058 -0.3564 -0.9343 +vn -0.0783 -0.2212 -0.9721 +vn -0.5010 -0.4384 -0.7462 +vn 0.4500 -0.7436 0.4945 +vn 0.3468 -0.8722 0.3449 +vn 0.3470 -0.9205 0.1798 +vn 0.4314 -0.8493 0.3042 +vn 0.3092 -0.9489 0.0630 +vn 0.3623 -0.9109 0.1976 +vn 0.2442 -0.9691 0.0342 +vn 0.3181 -0.9416 0.1104 +vn 0.2332 -0.9719 -0.0329 +vn 0.3114 -0.9502 0.0089 +vn 0.2411 -0.9524 0.1865 +vn 0.1588 -0.9856 0.0576 +vn 0.1291 -0.9909 -0.0375 +vn 0.1115 -0.9935 -0.0251 +vn 0.1092 -0.9931 -0.0420 +vn 0.1687 -0.9853 0.0286 +vn 0.1079 -0.9929 -0.0508 +vn 0.0676 -0.9953 -0.0688 +vn 0.0476 -0.9976 -0.0508 +vn 0.0131 -0.9985 -0.0531 +vn 0.0971 -0.9944 -0.0419 +vn 0.0923 -0.9922 -0.0833 +vn 0.0872 -0.9927 -0.0827 +vn 0.0830 -0.9918 -0.0970 +vn 0.0535 -0.9935 -0.1001 +vn 0.4590 -0.5699 0.6816 +vn 0.4461 -0.7137 0.5400 +vn 0.4289 -0.7511 0.5019 +vn 0.2909 -0.9540 -0.0722 +vn 0.3278 -0.9434 -0.0511 +vn 0.3440 -0.9385 0.0279 +vn 0.0314 -0.9931 -0.1127 +vn 0.1076 -0.9942 -0.0022 +vn 0.3869 -0.8680 0.3113 +vn 0.2319 -0.9658 -0.1155 +vn 0.2035 -0.9773 0.0586 +vn 0.3521 -0.9065 0.2328 +vn 0.1135 -0.9865 -0.1183 +vn 0.2831 -0.9385 0.1978 +vn 0.3456 -0.9311 0.1165 +vn 0.0220 -0.9916 -0.1271 +vn 0.3716 -0.8458 0.3829 +vn 0.2725 -0.9527 -0.1346 +vn 0.2285 -0.9576 -0.1753 +vn 0.1983 -0.9650 -0.1717 +vn 0.2732 -0.9520 -0.1377 +vn 0.1664 -0.9729 -0.1605 +vn 0.2688 -0.9555 -0.1213 +vn 0.1572 -0.9573 -0.2426 +vn 0.2914 -0.9350 -0.2021 +vn 0.1554 -0.8985 -0.4106 +vn 0.2903 -0.8702 -0.3980 +vn 0.1311 -0.9760 -0.1740 +vn 0.1656 -0.9613 -0.2204 +vn 0.1411 -0.9635 -0.2274 +vn 0.0824 -0.9637 -0.2539 +vn 0.0871 -0.9293 -0.3590 +vn 0.0380 -0.9863 -0.1608 +vn 0.0629 -0.9782 -0.1980 +vn 0.0915 -0.9612 -0.2603 +vn 0.0687 -0.9503 -0.3035 +vn 0.0483 -0.9376 -0.3442 +vn 0.0261 -0.9895 -0.1421 +vn 0.0240 -0.9797 -0.1992 +vn 0.0211 -0.9630 -0.2686 +vn 0.0452 -0.9467 -0.3189 +vn 0.0570 -0.9310 -0.3606 +vn 0.3312 -0.9362 -0.1177 +vn 0.2510 -0.8304 -0.4974 +vn 0.3048 -0.8374 -0.4537 +vn 0.3996 -0.8434 -0.3591 +vn 0.0233 -0.9110 -0.4117 +vn 0.3274 -0.9378 -0.1155 +vn 0.1841 -0.8543 -0.4860 +vn 0.3351 -0.9353 -0.1136 +vn 0.1729 -0.8752 -0.4519 +vn 0.4037 -0.8908 -0.2085 +vn 0.0743 -0.9069 -0.4148 +vn 0.2571 -0.8268 -0.5003 +vn 0.2294 -0.8538 -0.4673 +vn 0.2967 -0.8029 -0.5170 +vn 0.3171 -0.7734 -0.5489 +vn 0.3500 -0.7079 -0.6134 +vn 0.4057 -0.6559 -0.6366 +vn 0.3668 -0.6751 -0.6400 +vn 0.3851 -0.6818 -0.6219 +vn 0.3019 -0.7251 -0.6190 +vn 0.3561 -0.7076 -0.6103 +vn 0.1951 -0.8766 -0.4398 +vn 0.2601 -0.8269 -0.4986 +vn 0.2827 -0.7382 -0.6125 +vn 0.2995 -0.6951 -0.6536 +vn 0.2829 -0.7099 -0.6450 +vn 0.0815 -0.8986 -0.4312 +vn 0.1154 -0.8690 -0.4812 +vn 0.1705 -0.7734 -0.6105 +vn 0.1779 -0.7403 -0.6483 +vn 0.2304 -0.7085 -0.6671 +vn 0.0325 -0.8951 -0.4446 +vn -0.0055 -0.8884 -0.4590 +vn 0.0528 -0.8020 -0.5949 +vn 0.0809 -0.7679 -0.6354 +vn 0.1493 -0.7102 -0.6880 +vn 0.2644 -0.8296 -0.4917 +vn 0.4166 -0.5165 -0.7481 +vn 0.4445 -0.5189 -0.7302 +vn 0.3932 -0.6885 -0.6094 +vn 0.0605 -0.6679 -0.7418 +vn 0.3782 -0.7224 -0.5788 +vn 0.3239 -0.6077 -0.7251 +vn 0.4378 -0.6307 -0.6407 +vn 0.2469 -0.6508 -0.7180 +vn 0.3715 -0.7011 -0.6086 +vn 0.1595 -0.6626 -0.7318 +vn 0.4440 -0.3227 -0.8359 +vn 0.4196 -0.3368 -0.8429 +vn 0.3734 -0.2915 -0.8807 +vn 0.4028 -0.2797 -0.8715 +vn 0.4116 -0.2399 -0.8792 +vn 0.4333 -0.2026 -0.8782 +vn 0.4189 -0.2384 -0.8762 +vn 0.4082 -0.2612 -0.8747 +vn 0.4208 -0.1525 -0.8942 +vn 0.4669 -0.1208 -0.8760 +vn 0.3014 -0.4351 -0.8485 +vn 0.3483 -0.3010 -0.8877 +vn 0.3678 -0.2877 -0.8843 +vn 0.4164 -0.2401 -0.8769 +vn 0.4015 -0.1417 -0.9048 +vn 0.1823 -0.5057 -0.8432 +vn 0.2653 -0.3626 -0.8934 +vn 0.2985 -0.3453 -0.8897 +vn 0.3436 -0.2812 -0.8960 +vn 0.3023 -0.1487 -0.9415 +vn 0.1258 -0.5382 -0.8334 +vn 0.1817 -0.4217 -0.8884 +vn 0.1981 -0.3833 -0.9021 +vn 0.1562 -0.3423 -0.9265 +vn 0.1661 -0.1722 -0.9709 +vn 0.4403 -0.3447 -0.8291 +vn 0.0520 -0.4724 -0.8799 +vn -0.4532 -0.8177 -0.3549 +vn 0.5095 -0.0998 -0.8547 +vn 0.1035 -0.0895 -0.9906 +vn 0.4340 -0.2724 -0.8587 +vn 0.1590 -0.3048 -0.9391 +vn 0.4397 -0.1850 -0.8789 +vn 0.1097 -0.2355 -0.9657 +vn 0.3755 -0.3058 -0.8749 +vn 0.1532 -0.1130 -0.9817 +vn 0.0105 0.1137 0.9935 +vn 0.0141 -0.0345 0.9993 +vn 0.0164 -0.0156 0.9997 +vn 0.0058 0.1339 0.9910 +vn -0.8363 0.2423 0.4918 +vn -0.7840 0.3329 0.5239 +vn -0.7869 0.3225 0.5261 +vn -0.8393 0.2323 0.4916 +vn -0.4147 0.7534 0.5103 +vn -0.3512 0.7961 0.4928 +vn -0.3546 0.7875 0.5041 +vn -0.4259 0.7395 0.5213 +vn 0.2638 0.5434 0.7969 +vn 0.2164 0.5107 0.8321 +vn 0.2160 0.5330 0.8181 +vn 0.2652 0.5565 0.7874 +vn -0.7544 0.3568 0.5510 +vn -0.7521 0.3486 0.5593 +vn 0.1056 0.4250 0.8990 +vn 0.1099 0.4512 0.8856 +vn -0.6596 0.4109 0.6293 +vn -0.6686 0.3840 0.6368 +vn 0.0407 0.3296 0.9433 +vn 0.0353 0.3731 0.9271 +vn -0.5226 0.6456 0.5568 +vn -0.5382 0.6132 0.5782 +vn 0.0296 0.1215 0.9921 +vn 0.0272 0.1508 0.9882 +vn -0.9374 0.3366 0.0894 +vn -0.9529 0.2732 0.1313 +vn -0.9514 0.2784 0.1320 +vn -0.9362 0.3393 0.0919 +vn -0.9088 0.2527 0.3319 +vn -0.9070 0.2507 0.3383 +vn -0.9678 0.2175 0.1269 +vn -0.9681 0.2164 0.1263 +vn -0.9423 0.3163 0.1100 +vn -0.9432 0.3132 0.1109 +vn -0.9403 0.2889 0.1801 +vn -0.9431 0.2917 0.1595 +vn -0.8267 0.5209 0.2126 +vn -0.8786 0.4662 0.1040 +vn -0.8750 0.4719 0.1079 +vn -0.8275 0.5194 0.2132 +vn -0.9240 0.3780 0.0577 +vn -0.9242 0.3777 0.0573 +vn -0.9026 0.4099 0.1313 +vn -0.9022 0.4106 0.1319 +vn -0.9096 0.3798 0.1683 +vn -0.9083 0.3809 0.1731 +vn -0.9431 0.3261 0.0652 +vn -0.9429 0.3258 0.0692 +vn -0.1063 0.9799 -0.1690 +vn -0.1988 0.9625 -0.1844 +vn -0.1730 0.9701 -0.1704 +vn -0.0720 0.9848 -0.1577 +vn -0.6074 0.7785 0.1583 +vn -0.6542 0.7552 0.0406 +vn -0.6587 0.7509 0.0469 +vn -0.6577 0.7402 0.1398 +vn -0.6954 0.7156 0.0657 +vn -0.7354 0.6773 0.0231 +vn -0.8751 0.4736 0.0991 +vn -0.8739 0.4759 0.0992 +vn -0.2859 0.9419 -0.1762 +vn -0.2590 0.9500 -0.1744 +vn -0.6980 0.7070 0.1137 +vn -0.7025 0.7033 0.1087 +vn -0.4579 0.8804 -0.1234 +vn -0.4251 0.8960 -0.1284 +vn -0.6761 0.7170 0.1699 +vn -0.6748 0.7187 0.1678 +vn -0.6040 0.7947 -0.0603 +vn -0.5969 0.7993 -0.0686 +vn -0.7379 0.6584 0.1484 +vn -0.7387 0.6538 0.1636 +vn 0.3024 0.6823 0.6656 +vn 0.4153 0.6855 0.5979 +vn 0.3810 0.6970 0.6074 +vn 0.3016 0.6833 0.6649 +vn -0.1430 0.3966 0.9068 +vn -0.3045 0.4512 0.8389 +vn -0.2726 0.4354 0.8580 +vn -0.1162 0.3729 0.9205 +vn 0.8273 0.4122 0.3816 +vn 0.8885 0.3081 0.3401 +vn 0.8818 0.3210 0.3456 +vn 0.8210 0.4225 0.3840 +vn -0.0748 -0.0288 0.9968 +vn -0.0580 -0.0331 0.9978 +vn 0.6387 0.5252 0.5624 +vn 0.6199 0.5482 0.5615 +vn -0.0248 0.0481 0.9985 +vn -0.0387 0.0237 0.9990 +vn 0.7367 0.4568 0.4987 +vn 0.7276 0.4679 0.5017 +vn 0.0824 0.1906 0.9782 +vn 0.0894 0.1681 0.9817 +vn 0.8044 0.4224 0.4177 +vn 0.8022 0.4262 0.4182 +vn 0.0478 0.2953 0.9542 +vn 0.0729 0.2711 0.9598 +vn 0.9039 0.2703 0.3316 +vn 0.9024 0.2731 0.3332 +vn 0.9264 0.3561 0.1226 +vn 0.9740 0.2254 -0.0200 +vn 0.9735 0.2276 -0.0207 +vn 0.9224 0.3639 0.1294 +vn 0.8934 0.2709 0.3584 +vn 0.8941 0.2700 0.3575 +vn 0.8957 0.2861 0.3404 +vn 0.8952 0.2861 0.3417 +vn 0.9224 0.3161 0.2221 +vn 0.9210 0.3117 0.2337 +vn 0.9381 0.3329 0.0952 +vn 0.9396 0.3263 0.1038 +vn 0.8565 0.5091 0.0848 +vn 0.7795 0.6130 0.1293 +vn 0.7814 0.6106 0.1287 +vn 0.8630 0.4987 0.0808 +vn 0.9609 0.2740 0.0393 +vn 0.9596 0.2792 0.0353 +vn 0.9316 0.3628 -0.0215 +vn 0.9301 0.3657 -0.0337 +vn 0.9124 0.4094 -0.0063 +vn 0.9147 0.4040 -0.0107 +vn 0.7955 0.6012 0.0752 +vn 0.7961 0.6008 0.0724 +vn 0.6784 0.7345 0.0171 +vn 0.6346 0.6039 -0.4823 +vn 0.6099 0.6068 -0.5098 +vn 0.6697 0.7413 0.0444 +vn 0.5841 0.7627 -0.2776 +vn 0.5416 0.7543 -0.3711 +vn 0.0871 0.9813 -0.1715 +vn 0.1110 0.9778 -0.1776 +vn 0.7347 0.6604 0.1552 +vn 0.7340 0.6622 0.1507 +vn 0.5040 0.8317 -0.2329 +vn 0.5001 0.8275 -0.2551 +vn 0.6996 0.7127 0.0509 +vn 0.6982 0.7136 0.0570 +vn 0.4585 0.8587 -0.2292 +vn 0.4519 0.8592 -0.2401 +vn 0.6778 0.7349 -0.0212 +vn 0.6784 0.7343 -0.0229 +vn 0.3314 0.9226 -0.1972 +vn 0.3380 0.9161 -0.2157 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_13 +s 1 +f 8451/4226/10375 8452/4227/10376 8453/4228/10377 8454/4229/10378 +f 8455/4230/10379 8451/4226/10375 8454/4229/10378 8456/4231/10380 +f 8457/4232/10381 8455/4230/10379 8456/4231/10380 8458/4233/10382 +f 8459/4234/10383 8457/4232/10381 8458/4233/10382 8460/4235/10384 +f 8461/4236/10385 8462/4237/10386 8452/4227/10376 8451/4226/10375 +f 8463/4238/10387 8461/4236/10385 8451/4226/10375 8455/4230/10379 +f 8464/4239/10388 8463/4238/10387 8455/4230/10379 8457/4232/10381 +f 8465/4240/10389 8464/4239/10388 8457/4232/10381 8459/4234/10383 +f 8466/4241/10390 8467/4242/10391 8462/4237/10386 8461/4236/10385 +f 8468/4243/10392 8466/4241/10390 8461/4236/10385 8463/4238/10387 +f 8469/4244/10393 8468/4243/10392 8463/4238/10387 8464/4239/10388 +f 8470/4245/10394 8469/4244/10393 8464/4239/10388 8465/4240/10389 +f 8471/4246/10395 8472/4247/10396 8467/4242/10391 8466/4241/10390 +f 8473/4248/10397 8471/4246/10395 8466/4241/10390 8468/4243/10392 +f 8474/4249/10398 8473/4248/10397 8468/4243/10392 8469/4244/10393 +f 8475/4250/10399 8474/4249/10398 8469/4244/10393 8470/4245/10394 +f 8453/4228/10377 8476/4251/10400 8477/4252/10401 8478/4253/10402 +f 8479/4254/10403 8480/4255/10404 8481/4256/10405 8460/4235/10384 +f 8475/4250/10399 8482/4257/10406 8483/4258/10407 8484/4259/10408 +f 8485/4260/10409 8486/4261/10410 8487/4262/10411 8472/4247/10396 +f 8454/4229/10378 8453/4228/10377 8478/4253/10402 8488/4263/10412 +f 8460/4235/10384 8481/4256/10405 8489/4264/10413 8459/4234/10383 +f 8474/4249/10398 8475/4250/10399 8484/4259/10408 8490/4265/10414 +f 8472/4247/10396 8487/4262/10411 8491/4266/10415 8467/4242/10391 +f 8456/4231/10380 8454/4229/10378 8488/4263/10412 8492/4267/10416 +f 8459/4234/10383 8489/4264/10413 8493/4268/10417 8465/4240/10389 +f 8473/4248/10397 8474/4249/10398 8490/4265/10414 8494/4269/10418 +f 8467/4242/10391 8491/4266/10415 8495/4270/10419 8462/4237/10386 +f 8458/4233/10382 8456/4231/10380 8492/4267/10416 8496/4271/10420 +f 8465/4240/10389 8493/4268/10417 8497/4272/10421 8470/4245/10394 +f 8471/4246/10395 8473/4248/10397 8494/4269/10418 8498/4273/10422 +f 8462/4237/10386 8495/4270/10419 8499/4274/10423 8452/4227/10376 +f 8460/4235/10384 8458/4233/10382 8496/4271/10420 8479/4254/10403 +f 8470/4245/10394 8497/4272/10421 8482/4257/10406 8475/4250/10399 +f 8472/4247/10396 8471/4246/10395 8498/4273/10422 8485/4260/10409 +f 8452/4227/10376 8499/4274/10423 8476/4251/10400 8453/4228/10377 +f 8500/4275/10424 8501/4276/10425 8502/4277/10426 8503/4278/10427 +f 8504/4279/10428 8500/4275/10424 8503/4278/10427 8505/4280/10429 +f 8506/4281/10430 8504/4279/10428 8505/4280/10429 8507/4282/10431 +f 8508/4283/10432 8506/4281/10430 8507/4282/10431 8509/4284/10433 +f 8510/4285/10434 8511/4286/10435 8501/4276/10425 8500/4275/10424 +f 8512/4287/10436 8510/4285/10434 8500/4275/10424 8504/4279/10428 +f 8513/4288/10437 8512/4287/10436 8504/4279/10428 8506/4281/10430 +f 8514/4289/10438 8513/4288/10437 8506/4281/10430 8508/4283/10432 +f 8515/4290/10439 8516/4291/10440 8511/4286/10435 8510/4285/10434 +f 8517/4292/10441 8515/4290/10439 8510/4285/10434 8512/4287/10436 +f 8518/4293/10442 8517/4292/10441 8512/4287/10436 8513/4288/10437 +f 8519/4294/10443 8518/4293/10442 8513/4288/10437 8514/4289/10438 +f 8520/4295/10444 8521/4296/10445 8516/4291/10440 8515/4290/10439 +f 8522/4297/10446 8520/4295/10444 8515/4290/10439 8517/4292/10441 +f 8523/4298/10447 8522/4297/10446 8517/4292/10441 8518/4293/10442 +f 8524/4299/10448 8523/4298/10447 8518/4293/10442 8519/4294/10443 +f 8502/4277/10426 8481/4256/10405 8480/4255/10404 8525/4300/10449 +f 8526/4301/10450 8527/4302/10451 8528/4303/10452 8509/4284/10433 +f 8524/4299/10448 8529/4304/10453 8530/4305/10454 8531/4306/10455 +f 8532/4307/10456 8483/4258/10407 8482/4257/10406 8521/4296/10445 +f 8503/4278/10427 8502/4277/10426 8525/4300/10449 8533/4308/10457 +f 8509/4284/10433 8528/4303/10452 8534/4309/10458 8508/4283/10432 +f 8523/4298/10447 8524/4299/10448 8531/4306/10455 8535/4310/10459 +f 8521/4296/10445 8482/4257/10406 8497/4272/10421 8516/4291/10440 +f 8505/4280/10429 8503/4278/10427 8533/4308/10457 8536/4311/10460 +f 8508/4283/10432 8534/4309/10458 8537/4312/10461 8514/4289/10438 +f 8522/4297/10446 8523/4298/10447 8535/4310/10459 8538/4313/10462 +f 8516/4291/10440 8497/4272/10421 8493/4268/10417 8511/4286/10435 +f 8507/4282/10431 8505/4280/10429 8536/4311/10460 8539/4314/10463 +f 8514/4289/10438 8537/4312/10461 8540/4315/10464 8519/4294/10443 +f 8520/4295/10444 8522/4297/10446 8538/4313/10462 8541/4316/10465 +f 8511/4286/10435 8493/4268/10417 8489/4264/10413 8501/4276/10425 +f 8509/4284/10433 8507/4282/10431 8539/4314/10463 8526/4301/10450 +f 8519/4294/10443 8540/4315/10464 8529/4304/10453 8524/4299/10448 +f 8521/4296/10445 8520/4295/10444 8541/4316/10465 8532/4307/10456 +f 8501/4276/10425 8489/4264/10413 8481/4256/10405 8502/4277/10426 +f 8542/4317/10466 8543/4318/10467 8544/4319/10468 8545/4320/10469 +f 8546/4321/10470 8542/4317/10466 8545/4320/10469 8547/4322/10471 +f 8548/4323/10472 8546/4321/10470 8547/4322/10471 8549/4324/10473 +f 8550/4325/10474 8548/4323/10472 8549/4324/10473 8551/4326/10475 +f 8552/4327/10476 8553/4328/10477 8543/4318/10467 8542/4317/10466 +f 8554/4329/10478 8552/4327/10476 8542/4317/10466 8546/4321/10470 +f 8555/4330/10479 8554/4329/10478 8546/4321/10470 8548/4323/10472 +f 8556/4331/10480 8555/4330/10479 8548/4323/10472 8550/4325/10474 +f 8557/4332/10481 8558/4333/10482 8553/4328/10477 8552/4327/10476 +f 8559/4334/10483 8557/4332/10481 8552/4327/10476 8554/4329/10478 +f 8560/4335/10484 8559/4334/10483 8554/4329/10478 8555/4330/10479 +f 8561/4336/10485 8560/4335/10484 8555/4330/10479 8556/4331/10480 +f 8562/4337/10486 8563/4338/10487 8558/4333/10482 8557/4332/10481 +f 8564/4339/10488 8562/4337/10486 8557/4332/10481 8559/4334/10483 +f 8565/4340/10489 8564/4339/10488 8559/4334/10483 8560/4335/10484 +f 8566/4341/10490 8565/4340/10489 8560/4335/10484 8561/4336/10485 +f 8544/4319/10468 8528/4303/10452 8527/4302/10451 8567/4342/10491 +f 8568/4343/10492 8569/4344/10493 8570/4345/10494 8551/4326/10475 +f 8566/4341/10490 8571/4346/10495 8572/4347/10496 8573/4348/10497 +f 8574/4349/10498 8530/4305/10454 8529/4304/10453 8563/4338/10487 +f 8545/4320/10469 8544/4319/10468 8567/4342/10491 8575/4350/10499 +f 8551/4326/10475 8570/4345/10494 8576/4351/10500 8550/4325/10474 +f 8565/4340/10489 8566/4341/10490 8573/4348/10497 8577/4352/10501 +f 8563/4338/10487 8529/4304/10453 8540/4315/10464 8558/4333/10482 +f 8547/4322/10471 8545/4320/10469 8575/4350/10499 8578/4353/10502 +f 8550/4325/10474 8576/4351/10500 8579/4354/10503 8556/4331/10480 +f 8564/4339/10488 8565/4340/10489 8577/4352/10501 8580/4355/10504 +f 8558/4333/10482 8540/4315/10464 8537/4312/10461 8553/4328/10477 +f 8549/4324/10473 8547/4322/10471 8578/4353/10502 8581/4356/10505 +f 8556/4331/10480 8579/4354/10503 8582/4357/10506 8561/4336/10485 +f 8562/4337/10486 8564/4339/10488 8580/4355/10504 8583/4358/10507 +f 8553/4328/10477 8537/4312/10461 8534/4309/10458 8543/4318/10467 +f 8551/4326/10475 8549/4324/10473 8581/4356/10505 8568/4343/10492 +f 8561/4336/10485 8582/4357/10506 8571/4346/10495 8566/4341/10490 +f 8563/4338/10487 8562/4337/10486 8583/4358/10507 8574/4349/10498 +f 8543/4318/10467 8534/4309/10458 8528/4303/10452 8544/4319/10468 +f 8584/4359/10508 8585/4360/10509 8586/4361/10510 8587/4362/10511 +f 8588/4363/10512 8584/4359/10508 8587/4362/10511 8589/4364/10513 +f 8590/4365/10514 8588/4363/10512 8589/4364/10513 8591/4366/10515 +f 8592/4367/10516 8590/4365/10514 8591/4366/10515 8593/4368/10517 +f 8594/4369/10518 8595/4370/10519 8585/4360/10509 8584/4359/10508 +f 8596/4371/10520 8594/4369/10518 8584/4359/10508 8588/4363/10512 +f 8597/4372/10521 8596/4371/10520 8588/4363/10512 8590/4365/10514 +f 8598/4373/10522 8597/4372/10521 8590/4365/10514 8592/4367/10516 +f 8599/4374/10523 8600/4375/10524 8595/4370/10519 8594/4369/10518 +f 8601/4376/10525 8599/4374/10523 8594/4369/10518 8596/4371/10520 +f 8602/4377/10526 8601/4376/10525 8596/4371/10520 8597/4372/10521 +f 8603/4378/10527 8602/4377/10526 8597/4372/10521 8598/4373/10522 +f 8604/4379/10528 8605/4380/10529 8600/4375/10524 8599/4374/10523 +f 8606/4381/10530 8604/4379/10528 8599/4374/10523 8601/4376/10525 +f 8607/4382/10531 8606/4381/10530 8601/4376/10525 8602/4377/10526 +f 8608/4383/10532 8607/4382/10531 8602/4377/10526 8603/4378/10527 +f 8586/4361/10510 8570/4345/10494 8569/4344/10493 8609/4384/10533 +f 8610/4385/10534 8611/4386/10535 8612/4387/10536 8593/4368/10517 +f 8608/4383/10532 8613/4388/10537 8614/4389/10538 8615/4390/10539 +f 8616/4391/10540 8572/4347/10496 8571/4346/10495 8605/4380/10529 +f 8587/4362/10511 8586/4361/10510 8609/4384/10533 8617/4392/10541 +f 8593/4368/10517 8612/4387/10536 8618/4393/10542 8592/4367/10516 +f 8607/4382/10531 8608/4383/10532 8615/4390/10539 8619/4394/10543 +f 8605/4380/10529 8571/4346/10495 8582/4357/10506 8600/4375/10524 +f 8589/4364/10513 8587/4362/10511 8617/4392/10541 8620/4395/10544 +f 8592/4367/10516 8618/4393/10542 8621/4396/10545 8598/4373/10522 +f 8606/4381/10530 8607/4382/10531 8619/4394/10543 8622/4397/10546 +f 8600/4375/10524 8582/4357/10506 8579/4354/10503 8595/4370/10519 +f 8591/4366/10515 8589/4364/10513 8620/4395/10544 8623/4398/10547 +f 8598/4373/10522 8621/4396/10545 8624/4399/10548 8603/4378/10527 +f 8604/4379/10528 8606/4381/10530 8622/4397/10546 8625/4400/10549 +f 8595/4370/10519 8579/4354/10503 8576/4351/10500 8585/4360/10509 +f 8593/4368/10517 8591/4366/10515 8623/4398/10547 8610/4385/10534 +f 8603/4378/10527 8624/4399/10548 8613/4388/10537 8608/4383/10532 +f 8605/4380/10529 8604/4379/10528 8625/4400/10549 8616/4391/10540 +f 8585/4360/10509 8576/4351/10500 8570/4345/10494 8586/4361/10510 +f 8626/4401/10550 8627/4402/10551 8628/4403/10552 8629/4404/10553 +f 8630/4405/10554 8626/4401/10550 8629/4404/10553 8631/4406/10555 +f 8632/4407/10556 8630/4405/10554 8631/4406/10555 8633/4408/10557 +f 8634/4409/10558 8632/4407/10556 8633/4408/10557 8635/4410/10559 +f 8636/4411/10560 8637/4412/10561 8627/4402/10551 8626/4401/10550 +f 8638/4413/10562 8636/4411/10560 8626/4401/10550 8630/4405/10554 +f 8639/4414/10563 8638/4413/10562 8630/4405/10554 8632/4407/10556 +f 8640/4415/10564 8639/4414/10563 8632/4407/10556 8634/4409/10558 +f 8641/4416/10565 8642/4417/10566 8637/4412/10561 8636/4411/10560 +f 8643/4418/10567 8641/4416/10565 8636/4411/10560 8638/4413/10562 +f 8644/4419/10568 8643/4418/10567 8638/4413/10562 8639/4414/10563 +f 8645/4420/10569 8644/4419/10568 8639/4414/10563 8640/4415/10564 +f 8646/4421/10570 8647/4422/10571 8642/4417/10566 8641/4416/10565 +f 8648/4423/10572 8646/4421/10570 8641/4416/10565 8643/4418/10567 +f 8649/4424/10573 8648/4423/10572 8643/4418/10567 8644/4419/10568 +f 8650/4425/10574 8649/4424/10573 8644/4419/10568 8645/4420/10569 +f 8628/4403/10552 8651/4426/10575 8652/4427/10576 8653/4428/10577 +f 8654/4429/10578 8655/4430/10579 8656/4431/10580 8635/4410/10559 +f 8650/4425/10574 8657/4432/10581 8480/4255/10404 8479/4254/10403 +f 8478/4253/10402 8477/4252/10401 8658/4433/10582 8647/4422/10571 +f 8629/4404/10553 8628/4403/10552 8653/4428/10577 8659/4434/10583 +f 8635/4410/10559 8656/4431/10580 8660/4435/10584 8634/4409/10558 +f 8649/4424/10573 8650/4425/10574 8479/4254/10403 8496/4271/10420 +f 8647/4422/10571 8658/4433/10582 8661/4436/10585 8642/4417/10566 +f 8631/4406/10555 8629/4404/10553 8659/4434/10583 8662/4437/10586 +f 8634/4409/10558 8660/4435/10584 8663/4438/10587 8640/4415/10564 +f 8648/4423/10572 8649/4424/10573 8496/4271/10420 8492/4267/10416 +f 8642/4417/10566 8661/4436/10585 8664/4439/10588 8637/4412/10561 +f 8633/4408/10557 8631/4406/10555 8662/4437/10586 8665/4440/10589 +f 8640/4415/10564 8663/4438/10587 8666/4441/10590 8645/4420/10569 +f 8646/4421/10570 8648/4423/10572 8492/4267/10416 8488/4263/10412 +f 8637/4412/10561 8664/4439/10588 8667/4442/10591 8627/4402/10551 +f 8635/4410/10559 8633/4408/10557 8665/4440/10589 8654/4429/10578 +f 8645/4420/10569 8666/4441/10590 8657/4432/10581 8650/4425/10574 +f 8647/4422/10571 8646/4421/10570 8488/4263/10412 8478/4253/10402 +f 8627/4402/10551 8667/4442/10591 8651/4426/10575 8628/4403/10552 +f 8668/4443/10592 8669/4444/10593 8670/4445/10594 8671/4446/10595 +f 8672/4447/10596 8668/4443/10592 8671/4446/10595 8673/4448/10597 +f 8674/4449/10598 8672/4447/10596 8673/4448/10597 8675/4450/10599 +f 8676/4451/10600 8674/4449/10598 8675/4450/10599 8677/4452/10601 +f 8678/4453/10602 8679/4454/10603 8669/4444/10593 8668/4443/10592 +f 8680/4455/10604 8678/4453/10602 8668/4443/10592 8672/4447/10596 +f 8681/4456/10605 8680/4455/10604 8672/4447/10596 8674/4449/10598 +f 8682/4457/10606 8681/4456/10605 8674/4449/10598 8676/4451/10600 +f 8683/4458/10607 8684/4459/10608 8679/4454/10603 8678/4453/10602 +f 8685/4460/10609 8683/4458/10607 8678/4453/10602 8680/4455/10604 +f 8686/4461/10610 8685/4460/10609 8680/4455/10604 8681/4456/10605 +f 8687/4462/10611 8686/4461/10610 8681/4456/10605 8682/4457/10606 +f 8688/4463/10612 8689/4464/10613 8684/4459/10608 8683/4458/10607 +f 8690/4465/10614 8688/4463/10612 8683/4458/10607 8685/4460/10609 +f 8691/4466/10615 8690/4465/10614 8685/4460/10609 8686/4461/10610 +f 8692/4467/10616 8691/4466/10615 8686/4461/10610 8687/4462/10611 +f 8670/4445/10594 8656/4431/10580 8655/4430/10579 8693/4468/10617 +f 8694/4469/10618 8695/4470/10619 8696/4471/10620 8677/4452/10601 +f 8692/4467/10616 8697/4472/10621 8527/4302/10451 8526/4301/10450 +f 8525/4300/10449 8480/4255/10404 8657/4432/10581 8689/4464/10613 +f 8671/4446/10595 8670/4445/10594 8693/4468/10617 8698/4473/10622 +f 8677/4452/10601 8696/4471/10620 8699/4474/10623 8676/4451/10600 +f 8691/4466/10615 8692/4467/10616 8526/4301/10450 8539/4314/10463 +f 8689/4464/10613 8657/4432/10581 8666/4441/10590 8684/4459/10608 +f 8673/4448/10597 8671/4446/10595 8698/4473/10622 8700/4475/10624 +f 8676/4451/10600 8699/4474/10623 8701/4476/10625 8682/4457/10606 +f 8690/4465/10614 8691/4466/10615 8539/4314/10463 8536/4311/10460 +f 8684/4459/10608 8666/4441/10590 8663/4438/10587 8679/4454/10603 +f 8675/4450/10599 8673/4448/10597 8700/4475/10624 8702/4477/10626 +f 8682/4457/10606 8701/4476/10625 8703/4478/10627 8687/4462/10611 +f 8688/4463/10612 8690/4465/10614 8536/4311/10460 8533/4308/10457 +f 8679/4454/10603 8663/4438/10587 8660/4435/10584 8669/4444/10593 +f 8677/4452/10601 8675/4450/10599 8702/4477/10626 8694/4469/10618 +f 8687/4462/10611 8703/4478/10627 8697/4472/10621 8692/4467/10616 +f 8689/4464/10613 8688/4463/10612 8533/4308/10457 8525/4300/10449 +f 8669/4444/10593 8660/4435/10584 8656/4431/10580 8670/4445/10594 +f 8704/4479/10628 8705/4480/10629 8706/4481/10630 8707/4482/10631 +f 8708/4483/10632 8704/4479/10628 8707/4482/10631 8709/4484/10633 +f 8710/4485/10634 8708/4483/10632 8709/4484/10633 8711/4486/10635 +f 8712/4487/10636 8710/4485/10634 8711/4486/10635 8713/4488/10637 +f 8714/4489/10638 8715/4490/10639 8705/4480/10629 8704/4479/10628 +f 8716/4491/10640 8714/4489/10638 8704/4479/10628 8708/4483/10632 +f 8717/4492/10641 8716/4491/10640 8708/4483/10632 8710/4485/10634 +f 8718/4493/10642 8717/4492/10641 8710/4485/10634 8712/4487/10636 +f 8719/4494/10643 8720/4495/10644 8715/4490/10639 8714/4489/10638 +f 8721/4496/10645 8719/4494/10643 8714/4489/10638 8716/4491/10640 +f 8722/4497/10646 8721/4496/10645 8716/4491/10640 8717/4492/10641 +f 8723/4498/10647 8722/4497/10646 8717/4492/10641 8718/4493/10642 +f 8724/4499/10648 8725/4500/10649 8720/4495/10644 8719/4494/10643 +f 8726/4501/10650 8724/4499/10648 8719/4494/10643 8721/4496/10645 +f 8727/4502/10651 8726/4501/10650 8721/4496/10645 8722/4497/10646 +f 8728/4503/10652 8727/4502/10651 8722/4497/10646 8723/4498/10647 +f 8706/4481/10630 8696/4471/10620 8695/4470/10619 8729/4504/10653 +f 8730/4505/10654 8731/4506/10655 8732/4507/10656 8713/4488/10637 +f 8728/4503/10652 8733/4508/10657 8569/4344/10493 8568/4343/10492 +f 8567/4342/10491 8527/4302/10451 8697/4472/10621 8725/4500/10649 +f 8707/4482/10631 8706/4481/10630 8729/4504/10653 8734/4509/10658 +f 8713/4488/10637 8732/4507/10656 8735/4510/10659 8712/4487/10636 +f 8727/4502/10651 8728/4503/10652 8568/4343/10492 8581/4356/10505 +f 8725/4500/10649 8697/4472/10621 8703/4478/10627 8720/4495/10644 +f 8709/4484/10633 8707/4482/10631 8734/4509/10658 8736/4511/10660 +f 8712/4487/10636 8735/4510/10659 8737/4512/10661 8718/4493/10642 +f 8726/4501/10650 8727/4502/10651 8581/4356/10505 8578/4353/10502 +f 8720/4495/10644 8703/4478/10627 8701/4476/10625 8715/4490/10639 +f 8711/4486/10635 8709/4484/10633 8736/4511/10660 8738/4513/10662 +f 8718/4493/10642 8737/4512/10661 8739/4514/10663 8723/4498/10647 +f 8724/4499/10648 8726/4501/10650 8578/4353/10502 8575/4350/10499 +f 8715/4490/10639 8701/4476/10625 8699/4474/10623 8705/4480/10629 +f 8713/4488/10637 8711/4486/10635 8738/4513/10662 8730/4505/10654 +f 8723/4498/10647 8739/4514/10663 8733/4508/10657 8728/4503/10652 +f 8725/4500/10649 8724/4499/10648 8575/4350/10499 8567/4342/10491 +f 8705/4480/10629 8699/4474/10623 8696/4471/10620 8706/4481/10630 +f 8740/4515/10664 8741/4516/10665 8742/4517/10666 8743/4518/10667 +f 8744/4519/10668 8740/4515/10664 8743/4518/10667 8745/4520/10669 +f 8746/4521/10670 8744/4519/10668 8745/4520/10669 8747/4522/10671 +f 8748/4523/10672 8746/4521/10670 8747/4522/10671 8749/4524/10673 +f 8750/4525/10674 8751/4526/10675 8741/4516/10665 8740/4515/10664 +f 8752/4527/10676 8750/4525/10674 8740/4515/10664 8744/4519/10668 +f 8753/4528/10677 8752/4527/10676 8744/4519/10668 8746/4521/10670 +f 8754/4529/10678 8753/4528/10677 8746/4521/10670 8748/4523/10672 +f 8755/4530/10679 8756/4531/10680 8751/4526/10675 8750/4525/10674 +f 8757/4532/10681 8755/4530/10679 8750/4525/10674 8752/4527/10676 +f 8758/4533/10682 8757/4532/10681 8752/4527/10676 8753/4528/10677 +f 8759/4534/10683 8758/4533/10682 8753/4528/10677 8754/4529/10678 +f 8760/4535/10684 8761/4536/10685 8756/4531/10680 8755/4530/10679 +f 8762/4537/10686 8760/4535/10684 8755/4530/10679 8757/4532/10681 +f 8763/4538/10687 8762/4537/10686 8757/4532/10681 8758/4533/10682 +f 8764/4539/10688 8763/4538/10687 8758/4533/10682 8759/4534/10683 +f 8742/4517/10666 8732/4507/10656 8731/4506/10655 8765/4540/10689 +f 8766/4541/10690 8767/4542/10691 8768/4543/10692 8749/4524/10673 +f 8764/4539/10688 8769/4544/10693 8611/4386/10535 8610/4385/10534 +f 8609/4384/10533 8569/4344/10493 8733/4508/10657 8761/4536/10685 +f 8743/4518/10667 8742/4517/10666 8765/4540/10689 8770/4545/10694 +f 8749/4524/10673 8768/4543/10692 8771/4546/10695 8748/4523/10672 +f 8763/4538/10687 8764/4539/10688 8610/4385/10534 8623/4398/10547 +f 8761/4536/10685 8733/4508/10657 8739/4514/10663 8756/4531/10680 +f 8745/4520/10669 8743/4518/10667 8770/4545/10694 8772/4547/10696 +f 8748/4523/10672 8771/4546/10695 8773/4548/10697 8754/4529/10678 +f 8762/4537/10686 8763/4538/10687 8623/4398/10547 8620/4395/10544 +f 8756/4531/10680 8739/4514/10663 8737/4512/10661 8751/4526/10675 +f 8747/4522/10671 8745/4520/10669 8772/4547/10696 8774/4549/10698 +f 8754/4529/10678 8773/4548/10697 8775/4550/10699 8759/4534/10683 +f 8760/4535/10684 8762/4537/10686 8620/4395/10544 8617/4392/10541 +f 8751/4526/10675 8737/4512/10661 8735/4510/10659 8741/4516/10665 +f 8749/4524/10673 8747/4522/10671 8774/4549/10698 8766/4541/10690 +f 8759/4534/10683 8775/4550/10699 8769/4544/10693 8764/4539/10688 +f 8761/4536/10685 8760/4535/10684 8617/4392/10541 8609/4384/10533 +f 8741/4516/10665 8735/4510/10659 8732/4507/10656 8742/4517/10666 +f 8776/4228/10700 8777/4227/10701 8778/4226/10702 8779/4229/10703 +f 8779/4229/10703 8778/4226/10702 8780/4230/10704 8781/4231/10705 +f 8781/4231/10705 8780/4230/10704 8782/4232/10706 8783/4233/10707 +f 8783/4233/10707 8782/4232/10706 8784/4234/10708 8785/4235/10709 +f 8777/4227/10701 8786/4237/10710 8787/4236/10711 8778/4226/10702 +f 8778/4226/10702 8787/4236/10711 8788/4238/10712 8780/4230/10704 +f 8780/4230/10704 8788/4238/10712 8789/4239/10713 8782/4232/10706 +f 8782/4232/10706 8789/4239/10713 8790/4240/10714 8784/4234/10708 +f 8786/4237/10710 8791/4242/10715 8792/4241/10716 8787/4236/10711 +f 8787/4236/10711 8792/4241/10716 8793/4243/10717 8788/4238/10712 +f 8788/4238/10712 8793/4243/10717 8794/4244/10718 8789/4239/10713 +f 8789/4239/10713 8794/4244/10718 8795/4245/10719 8790/4240/10714 +f 8791/4242/10715 8796/4247/10720 8797/4246/10721 8792/4241/10716 +f 8792/4241/10716 8797/4246/10721 8798/4248/10722 8793/4243/10717 +f 8793/4243/10717 8798/4248/10722 8799/4249/10723 8794/4244/10718 +f 8794/4244/10718 8799/4249/10723 8800/4250/10724 8795/4245/10719 +f 8801/4252/10725 8802/4251/10726 8776/4228/10700 8803/4253/10727 +f 8804/4256/10728 8805/4255/10729 8806/4254/10730 8785/4235/10709 +f 8807/4258/10731 8808/4257/10732 8800/4250/10724 8809/4259/10733 +f 8810/4262/10734 8811/4261/10735 8812/4260/10736 8796/4247/10720 +f 8803/4253/10727 8776/4228/10700 8779/4229/10703 8813/4263/10737 +f 8814/4264/10738 8804/4256/10728 8785/4235/10709 8784/4234/10708 +f 8809/4259/10733 8800/4250/10724 8799/4249/10723 8815/4265/10739 +f 8816/4266/10740 8810/4262/10734 8796/4247/10720 8791/4242/10715 +f 8813/4263/10737 8779/4229/10703 8781/4231/10705 8817/4267/10741 +f 8818/4268/10742 8814/4264/10738 8784/4234/10708 8790/4240/10714 +f 8815/4265/10739 8799/4249/10723 8798/4248/10722 8819/4269/10743 +f 8820/4270/10744 8816/4266/10740 8791/4242/10715 8786/4237/10710 +f 8817/4267/10741 8781/4231/10705 8783/4233/10707 8821/4271/10745 +f 8822/4272/10746 8818/4268/10742 8790/4240/10714 8795/4245/10719 +f 8819/4269/10743 8798/4248/10722 8797/4246/10721 8823/4273/10747 +f 8824/4274/10748 8820/4270/10744 8786/4237/10710 8777/4227/10701 +f 8821/4271/10745 8783/4233/10707 8785/4235/10709 8806/4254/10730 +f 8808/4257/10732 8822/4272/10746 8795/4245/10719 8800/4250/10724 +f 8823/4273/10747 8797/4246/10721 8796/4247/10720 8812/4260/10736 +f 8802/4251/10726 8824/4274/10748 8777/4227/10701 8776/4228/10700 +f 8825/4277/10749 8826/4276/10750 8827/4275/10751 8828/4278/10752 +f 8828/4278/10752 8827/4275/10751 8829/4279/10753 8830/4280/10754 +f 8830/4280/10754 8829/4279/10753 8831/4281/10755 8832/4282/10756 +f 8832/4282/10756 8831/4281/10755 8833/4283/10757 8834/4284/10758 +f 8826/4276/10750 8835/4286/10759 8836/4285/10760 8827/4275/10751 +f 8827/4275/10751 8836/4285/10760 8837/4287/10761 8829/4279/10753 +f 8829/4279/10753 8837/4287/10761 8838/4288/10762 8831/4281/10755 +f 8831/4281/10755 8838/4288/10762 8839/4289/10763 8833/4283/10757 +f 8835/4286/10759 8840/4291/10764 8841/4290/10765 8836/4285/10760 +f 8836/4285/10760 8841/4290/10765 8842/4292/10766 8837/4287/10761 +f 8837/4287/10761 8842/4292/10766 8843/4293/10767 8838/4288/10762 +f 8838/4288/10762 8843/4293/10767 8844/4294/10768 8839/4289/10763 +f 8840/4291/10764 8845/4296/10769 8846/4295/10770 8841/4290/10765 +f 8841/4290/10765 8846/4295/10770 8847/4297/10771 8842/4292/10766 +f 8842/4292/10766 8847/4297/10771 8848/4298/10772 8843/4293/10767 +f 8843/4293/10767 8848/4298/10772 8849/4299/10773 8844/4294/10768 +f 8805/4255/10729 8804/4256/10728 8825/4277/10749 8850/4300/10774 +f 8851/4303/10775 8852/4302/10776 8853/4301/10777 8834/4284/10758 +f 8854/4305/10778 8855/4304/10779 8849/4299/10773 8856/4306/10780 +f 8808/4257/10732 8807/4258/10731 8857/4307/10781 8845/4296/10769 +f 8850/4300/10774 8825/4277/10749 8828/4278/10752 8858/4308/10782 +f 8859/4309/10783 8851/4303/10775 8834/4284/10758 8833/4283/10757 +f 8856/4306/10780 8849/4299/10773 8848/4298/10772 8860/4310/10784 +f 8822/4272/10746 8808/4257/10732 8845/4296/10769 8840/4291/10764 +f 8858/4308/10782 8828/4278/10752 8830/4280/10754 8861/4311/10785 +f 8862/4312/10786 8859/4309/10783 8833/4283/10757 8839/4289/10763 +f 8860/4310/10784 8848/4298/10772 8847/4297/10771 8863/4313/10787 +f 8818/4268/10742 8822/4272/10746 8840/4291/10764 8835/4286/10759 +f 8861/4311/10785 8830/4280/10754 8832/4282/10756 8864/4314/10788 +f 8865/4315/10789 8862/4312/10786 8839/4289/10763 8844/4294/10768 +f 8863/4313/10787 8847/4297/10771 8846/4295/10770 8866/4316/10790 +f 8814/4264/10738 8818/4268/10742 8835/4286/10759 8826/4276/10750 +f 8864/4314/10788 8832/4282/10756 8834/4284/10758 8853/4301/10777 +f 8855/4304/10779 8865/4315/10789 8844/4294/10768 8849/4299/10773 +f 8866/4316/10790 8846/4295/10770 8845/4296/10769 8857/4307/10781 +f 8804/4256/10728 8814/4264/10738 8826/4276/10750 8825/4277/10749 +f 8867/4319/10791 8868/4318/10792 8869/4317/10793 8870/4320/10794 +f 8870/4320/10794 8869/4317/10793 8871/4321/10795 8872/4322/10796 +f 8872/4322/10796 8871/4321/10795 8873/4323/10797 8874/4324/10798 +f 8874/4324/10798 8873/4323/10797 8875/4325/10799 8876/4326/10800 +f 8868/4318/10792 8877/4328/10801 8878/4327/10802 8869/4317/10793 +f 8869/4317/10793 8878/4327/10802 8879/4329/10803 8871/4321/10795 +f 8871/4321/10795 8879/4329/10803 8880/4330/10804 8873/4323/10797 +f 8873/4323/10797 8880/4330/10804 8881/4331/10805 8875/4325/10799 +f 8877/4328/10801 8882/4333/10806 8883/4332/10807 8878/4327/10802 +f 8878/4327/10802 8883/4332/10807 8884/4334/10808 8879/4329/10803 +f 8879/4329/10803 8884/4334/10808 8885/4335/10809 8880/4330/10804 +f 8880/4330/10804 8885/4335/10809 8886/4336/10810 8881/4331/10805 +f 8882/4333/10806 8887/4338/10811 8888/4337/10812 8883/4332/10807 +f 8883/4332/10807 8888/4337/10812 8889/4339/10813 8884/4334/10808 +f 8884/4334/10808 8889/4339/10813 8890/4340/10814 8885/4335/10809 +f 8885/4335/10809 8890/4340/10814 8891/4341/10815 8886/4336/10810 +f 8852/4302/10776 8851/4303/10775 8867/4319/10791 8892/4342/10816 +f 8893/4345/10817 8894/4344/10818 8895/4343/10819 8876/4326/10800 +f 8896/4347/10820 8897/4346/10821 8891/4341/10815 8898/4348/10822 +f 8855/4304/10779 8854/4305/10778 8899/4349/10823 8887/4338/10811 +f 8892/4342/10816 8867/4319/10791 8870/4320/10794 8900/4350/10824 +f 8901/4351/10825 8893/4345/10817 8876/4326/10800 8875/4325/10799 +f 8898/4348/10822 8891/4341/10815 8890/4340/10814 8902/4352/10826 +f 8865/4315/10789 8855/4304/10779 8887/4338/10811 8882/4333/10806 +f 8900/4350/10824 8870/4320/10794 8872/4322/10796 8903/4353/10827 +f 8904/4354/10828 8901/4351/10825 8875/4325/10799 8881/4331/10805 +f 8902/4352/10826 8890/4340/10814 8889/4339/10813 8905/4355/10829 +f 8862/4312/10786 8865/4315/10789 8882/4333/10806 8877/4328/10801 +f 8903/4353/10827 8872/4322/10796 8874/4324/10798 8906/4356/10830 +f 8907/4357/10831 8904/4354/10828 8881/4331/10805 8886/4336/10810 +f 8905/4355/10829 8889/4339/10813 8888/4337/10812 8908/4358/10832 +f 8859/4309/10783 8862/4312/10786 8877/4328/10801 8868/4318/10792 +f 8906/4356/10830 8874/4324/10798 8876/4326/10800 8895/4343/10819 +f 8897/4346/10821 8907/4357/10831 8886/4336/10810 8891/4341/10815 +f 8908/4358/10832 8888/4337/10812 8887/4338/10811 8899/4349/10823 +f 8851/4303/10775 8859/4309/10783 8868/4318/10792 8867/4319/10791 +f 8909/4361/10833 8910/4360/10834 8911/4359/10835 8912/4362/10836 +f 8912/4362/10836 8911/4359/10835 8913/4363/10837 8914/4364/10838 +f 8914/4364/10838 8913/4363/10837 8915/4365/10839 8916/4366/10840 +f 8916/4366/10840 8915/4365/10839 8917/4367/10841 8918/4368/10842 +f 8910/4360/10834 8919/4370/10843 8920/4369/10844 8911/4359/10835 +f 8911/4359/10835 8920/4369/10844 8921/4371/10845 8913/4363/10837 +f 8913/4363/10837 8921/4371/10845 8922/4372/10846 8915/4365/10839 +f 8915/4365/10839 8922/4372/10846 8923/4373/10847 8917/4367/10841 +f 8919/4370/10843 8924/4375/10848 8925/4374/10849 8920/4369/10844 +f 8920/4369/10844 8925/4374/10849 8926/4376/10850 8921/4371/10845 +f 8921/4371/10845 8926/4376/10850 8927/4377/10851 8922/4372/10846 +f 8922/4372/10846 8927/4377/10851 8928/4378/10852 8923/4373/10847 +f 8924/4375/10848 8929/4380/10853 8930/4379/10854 8925/4374/10849 +f 8925/4374/10849 8930/4379/10854 8931/4381/10855 8926/4376/10850 +f 8926/4376/10850 8931/4381/10855 8932/4382/10856 8927/4377/10851 +f 8927/4377/10851 8932/4382/10856 8933/4383/10857 8928/4378/10852 +f 8894/4344/10818 8893/4345/10817 8909/4361/10833 8934/4384/10858 +f 8935/4387/10859 8936/4386/10860 8937/4385/10861 8918/4368/10842 +f 8938/4389/10862 8939/4388/10863 8933/4383/10857 8940/4390/10864 +f 8897/4346/10821 8896/4347/10820 8941/4391/10865 8929/4380/10853 +f 8934/4384/10858 8909/4361/10833 8912/4362/10836 8942/4392/10866 +f 8943/4393/10867 8935/4387/10859 8918/4368/10842 8917/4367/10841 +f 8940/4390/10864 8933/4383/10857 8932/4382/10856 8944/4394/10868 +f 8907/4357/10831 8897/4346/10821 8929/4380/10853 8924/4375/10848 +f 8942/4392/10866 8912/4362/10836 8914/4364/10838 8945/4395/10869 +f 8946/4396/10870 8943/4393/10867 8917/4367/10841 8923/4373/10847 +f 8944/4394/10868 8932/4382/10856 8931/4381/10855 8947/4397/10871 +f 8904/4354/10828 8907/4357/10831 8924/4375/10848 8919/4370/10843 +f 8945/4395/10869 8914/4364/10838 8916/4366/10840 8948/4398/10872 +f 8949/4399/10873 8946/4396/10870 8923/4373/10847 8928/4378/10852 +f 8947/4397/10871 8931/4381/10855 8930/4379/10854 8950/4400/10874 +f 8901/4351/10825 8904/4354/10828 8919/4370/10843 8910/4360/10834 +f 8948/4398/10872 8916/4366/10840 8918/4368/10842 8937/4385/10861 +f 8939/4388/10863 8949/4399/10873 8928/4378/10852 8933/4383/10857 +f 8950/4400/10874 8930/4379/10854 8929/4380/10853 8941/4391/10865 +f 8893/4345/10817 8901/4351/10825 8910/4360/10834 8909/4361/10833 +f 8951/4403/10875 8952/4402/10876 8953/4401/10877 8954/4404/10878 +f 8954/4404/10878 8953/4401/10877 8955/4405/10879 8956/4406/10880 +f 8956/4406/10880 8955/4405/10879 8957/4407/10881 8958/4408/10882 +f 8958/4408/10882 8957/4407/10881 8959/4409/10883 8960/4410/10884 +f 8952/4402/10876 8961/4412/10885 8962/4411/10886 8953/4401/10877 +f 8953/4401/10877 8962/4411/10886 8963/4413/10887 8955/4405/10879 +f 8955/4405/10879 8963/4413/10887 8964/4414/10888 8957/4407/10881 +f 8957/4407/10881 8964/4414/10888 8965/4415/10889 8959/4409/10883 +f 8961/4412/10885 8966/4417/10890 8967/4416/10891 8962/4411/10886 +f 8962/4411/10886 8967/4416/10891 8968/4418/10892 8963/4413/10887 +f 8963/4413/10887 8968/4418/10892 8969/4419/10893 8964/4414/10888 +f 8964/4414/10888 8969/4419/10893 8970/4420/10894 8965/4415/10889 +f 8966/4417/10890 8971/4422/10895 8972/4421/10896 8967/4416/10891 +f 8967/4416/10891 8972/4421/10896 8973/4423/10897 8968/4418/10892 +f 8968/4418/10892 8973/4423/10897 8974/4424/10898 8969/4419/10893 +f 8969/4419/10893 8974/4424/10898 8975/4425/10899 8970/4420/10894 +f 8976/4427/10900 8977/4426/10901 8951/4403/10875 8978/4428/10902 +f 8979/4431/10903 8980/4430/10904 8981/4429/10905 8960/4410/10884 +f 8805/4255/10729 8982/4432/10906 8975/4425/10899 8806/4254/10730 +f 8983/4433/10907 8801/4252/10725 8803/4253/10727 8971/4422/10895 +f 8978/4428/10902 8951/4403/10875 8954/4404/10878 8984/4434/10908 +f 8985/4435/10909 8979/4431/10903 8960/4410/10884 8959/4409/10883 +f 8806/4254/10730 8975/4425/10899 8974/4424/10898 8821/4271/10745 +f 8986/4436/10910 8983/4433/10907 8971/4422/10895 8966/4417/10890 +f 8984/4434/10908 8954/4404/10878 8956/4406/10880 8987/4437/10911 +f 8988/4438/10912 8985/4435/10909 8959/4409/10883 8965/4415/10889 +f 8821/4271/10745 8974/4424/10898 8973/4423/10897 8817/4267/10741 +f 8989/4439/10913 8986/4436/10910 8966/4417/10890 8961/4412/10885 +f 8987/4437/10911 8956/4406/10880 8958/4408/10882 8990/4440/10914 +f 8991/4441/10915 8988/4438/10912 8965/4415/10889 8970/4420/10894 +f 8817/4267/10741 8973/4423/10897 8972/4421/10896 8813/4263/10737 +f 8992/4442/10916 8989/4439/10913 8961/4412/10885 8952/4402/10876 +f 8990/4440/10914 8958/4408/10882 8960/4410/10884 8981/4429/10905 +f 8982/4432/10906 8991/4441/10915 8970/4420/10894 8975/4425/10899 +f 8813/4263/10737 8972/4421/10896 8971/4422/10895 8803/4253/10727 +f 8977/4426/10901 8992/4442/10916 8952/4402/10876 8951/4403/10875 +f 8993/4445/10917 8994/4444/10918 8995/4443/10919 8996/4446/10920 +f 8996/4446/10920 8995/4443/10919 8997/4447/10921 8998/4448/10922 +f 8998/4448/10922 8997/4447/10921 8999/4449/10923 9000/4450/10924 +f 9000/4450/10924 8999/4449/10923 9001/4451/10925 9002/4452/10926 +f 8994/4444/10918 9003/4454/10927 9004/4453/10928 8995/4443/10919 +f 8995/4443/10919 9004/4453/10928 9005/4455/10929 8997/4447/10921 +f 8997/4447/10921 9005/4455/10929 9006/4456/10930 8999/4449/10923 +f 8999/4449/10923 9006/4456/10930 9007/4457/10931 9001/4451/10925 +f 9003/4454/10927 9008/4459/10932 9009/4458/10933 9004/4453/10928 +f 9004/4453/10928 9009/4458/10933 9010/4460/10934 9005/4455/10929 +f 9005/4455/10929 9010/4460/10934 9011/4461/10935 9006/4456/10930 +f 9006/4456/10930 9011/4461/10935 9012/4462/10936 9007/4457/10931 +f 9008/4459/10932 9013/4464/10937 9014/4463/10938 9009/4458/10933 +f 9009/4458/10933 9014/4463/10938 9015/4465/10939 9010/4460/10934 +f 9010/4460/10934 9015/4465/10939 9016/4466/10940 9011/4461/10935 +f 9011/4461/10935 9016/4466/10940 9017/4467/10941 9012/4462/10936 +f 8980/4430/10904 8979/4431/10903 8993/4445/10917 9018/4468/10942 +f 9019/4471/10943 9020/4470/10944 9021/4469/10945 9002/4452/10926 +f 8852/4302/10776 9022/4472/10946 9017/4467/10941 8853/4301/10777 +f 8982/4432/10906 8805/4255/10729 8850/4300/10774 9013/4464/10937 +f 9018/4468/10942 8993/4445/10917 8996/4446/10920 9023/4473/10947 +f 9024/4474/10948 9019/4471/10943 9002/4452/10926 9001/4451/10925 +f 8853/4301/10777 9017/4467/10941 9016/4466/10940 8864/4314/10788 +f 8991/4441/10915 8982/4432/10906 9013/4464/10937 9008/4459/10932 +f 9023/4473/10947 8996/4446/10920 8998/4448/10922 9025/4475/10949 +f 9026/4476/10950 9024/4474/10948 9001/4451/10925 9007/4457/10931 +f 8864/4314/10788 9016/4466/10940 9015/4465/10939 8861/4311/10785 +f 8988/4438/10912 8991/4441/10915 9008/4459/10932 9003/4454/10927 +f 9025/4475/10949 8998/4448/10922 9000/4450/10924 9027/4477/10951 +f 9028/4478/10952 9026/4476/10950 9007/4457/10931 9012/4462/10936 +f 8861/4311/10785 9015/4465/10939 9014/4463/10938 8858/4308/10782 +f 8985/4435/10909 8988/4438/10912 9003/4454/10927 8994/4444/10918 +f 9027/4477/10951 9000/4450/10924 9002/4452/10926 9021/4469/10945 +f 9022/4472/10946 9028/4478/10952 9012/4462/10936 9017/4467/10941 +f 8858/4308/10782 9014/4463/10938 9013/4464/10937 8850/4300/10774 +f 8979/4431/10903 8985/4435/10909 8994/4444/10918 8993/4445/10917 +f 9029/4481/10953 9030/4480/10954 9031/4479/10955 9032/4482/10956 +f 9032/4482/10956 9031/4479/10955 9033/4483/10957 9034/4484/10958 +f 9034/4484/10958 9033/4483/10957 9035/4485/10959 9036/4486/10960 +f 9036/4486/10960 9035/4485/10959 9037/4487/10961 9038/4488/10962 +f 9030/4480/10954 9039/4490/10963 9040/4489/10964 9031/4479/10955 +f 9031/4479/10955 9040/4489/10964 9041/4491/10965 9033/4483/10957 +f 9033/4483/10957 9041/4491/10965 9042/4492/10966 9035/4485/10959 +f 9035/4485/10959 9042/4492/10966 9043/4493/10967 9037/4487/10961 +f 9039/4490/10963 9044/4495/10968 9045/4494/10969 9040/4489/10964 +f 9040/4489/10964 9045/4494/10969 9046/4496/10970 9041/4491/10965 +f 9041/4491/10965 9046/4496/10970 9047/4497/10971 9042/4492/10966 +f 9042/4492/10966 9047/4497/10971 9048/4498/10972 9043/4493/10967 +f 9044/4495/10968 9049/4500/10973 9050/4499/10974 9045/4494/10969 +f 9045/4494/10969 9050/4499/10974 9051/4501/10975 9046/4496/10970 +f 9046/4496/10970 9051/4501/10975 9052/4502/10976 9047/4497/10971 +f 9047/4497/10971 9052/4502/10976 9053/4503/10977 9048/4498/10972 +f 9020/4470/10944 9019/4471/10943 9029/4481/10953 9054/4504/10978 +f 9055/4507/10979 9056/4506/10980 9057/4505/10981 9038/4488/10962 +f 8894/4344/10818 9058/4508/10982 9053/4503/10977 8895/4343/10819 +f 9022/4472/10946 8852/4302/10776 8892/4342/10816 9049/4500/10973 +f 9054/4504/10978 9029/4481/10953 9032/4482/10956 9059/4509/10983 +f 9060/4510/10984 9055/4507/10979 9038/4488/10962 9037/4487/10961 +f 8895/4343/10819 9053/4503/10977 9052/4502/10976 8906/4356/10830 +f 9028/4478/10952 9022/4472/10946 9049/4500/10973 9044/4495/10968 +f 9059/4509/10983 9032/4482/10956 9034/4484/10958 9061/4511/10985 +f 9062/4512/10986 9060/4510/10984 9037/4487/10961 9043/4493/10967 +f 8906/4356/10830 9052/4502/10976 9051/4501/10975 8903/4353/10827 +f 9026/4476/10950 9028/4478/10952 9044/4495/10968 9039/4490/10963 +f 9061/4511/10985 9034/4484/10958 9036/4486/10960 9063/4513/10987 +f 9064/4514/10988 9062/4512/10986 9043/4493/10967 9048/4498/10972 +f 8903/4353/10827 9051/4501/10975 9050/4499/10974 8900/4350/10824 +f 9024/4474/10948 9026/4476/10950 9039/4490/10963 9030/4480/10954 +f 9063/4513/10987 9036/4486/10960 9038/4488/10962 9057/4505/10981 +f 9058/4508/10982 9064/4514/10988 9048/4498/10972 9053/4503/10977 +f 8900/4350/10824 9050/4499/10974 9049/4500/10973 8892/4342/10816 +f 9019/4471/10943 9024/4474/10948 9030/4480/10954 9029/4481/10953 +f 9065/4517/10989 9066/4516/10990 9067/4515/10991 9068/4518/10992 +f 9068/4518/10992 9067/4515/10991 9069/4519/10993 9070/4520/10994 +f 9070/4520/10994 9069/4519/10993 9071/4521/10995 9072/4522/10996 +f 9072/4522/10996 9071/4521/10995 9073/4523/10997 9074/4524/10998 +f 9066/4516/10990 9075/4526/10999 9076/4525/11000 9067/4515/10991 +f 9067/4515/10991 9076/4525/11000 9077/4527/11001 9069/4519/10993 +f 9069/4519/10993 9077/4527/11001 9078/4528/11002 9071/4521/10995 +f 9071/4521/10995 9078/4528/11002 9079/4529/11003 9073/4523/10997 +f 9075/4526/10999 9080/4531/11004 9081/4530/11005 9076/4525/11000 +f 9076/4525/11000 9081/4530/11005 9082/4532/11006 9077/4527/11001 +f 9077/4527/11001 9082/4532/11006 9083/4533/11007 9078/4528/11002 +f 9078/4528/11002 9083/4533/11007 9084/4534/11008 9079/4529/11003 +f 9080/4531/11004 9085/4536/11009 9086/4535/11010 9081/4530/11005 +f 9081/4530/11005 9086/4535/11010 9087/4537/11011 9082/4532/11006 +f 9082/4532/11006 9087/4537/11011 9088/4538/11012 9083/4533/11007 +f 9083/4533/11007 9088/4538/11012 9089/4539/11013 9084/4534/11008 +f 9056/4506/10980 9055/4507/10979 9065/4517/10989 9090/4540/11014 +f 9091/4543/11015 9092/4542/11016 9093/4541/11017 9074/4524/10998 +f 8936/4386/10860 9094/4544/11018 9089/4539/11013 8937/4385/10861 +f 9058/4508/10982 8894/4344/10818 8934/4384/10858 9085/4536/11009 +f 9090/4540/11014 9065/4517/10989 9068/4518/10992 9095/4545/11019 +f 9096/4546/11020 9091/4543/11015 9074/4524/10998 9073/4523/10997 +f 8937/4385/10861 9089/4539/11013 9088/4538/11012 8948/4398/10872 +f 9064/4514/10988 9058/4508/10982 9085/4536/11009 9080/4531/11004 +f 9095/4545/11019 9068/4518/10992 9070/4520/10994 9097/4547/11021 +f 9098/4548/11022 9096/4546/11020 9073/4523/10997 9079/4529/11003 +f 8948/4398/10872 9088/4538/11012 9087/4537/11011 8945/4395/10869 +f 9062/4512/10986 9064/4514/10988 9080/4531/11004 9075/4526/10999 +f 9097/4547/11021 9070/4520/10994 9072/4522/10996 9099/4549/11023 +f 9100/4550/11024 9098/4548/11022 9079/4529/11003 9084/4534/11008 +f 8945/4395/10869 9087/4537/11011 9086/4535/11010 8942/4392/10866 +f 9060/4510/10984 9062/4512/10986 9075/4526/10999 9066/4516/10990 +f 9099/4549/11023 9072/4522/10996 9074/4524/10998 9093/4541/11017 +f 9094/4544/11018 9100/4550/11024 9084/4534/11008 9089/4539/11013 +f 8942/4392/10866 9086/4535/11010 9085/4536/11009 8934/4384/10858 +f 9055/4507/10979 9060/4510/10984 9066/4516/10990 9065/4517/10989 +s 2 +f 8802/4251/11025 8801/4252/11026 8477/4252/11027 8476/4251/11028 +s 4 +f 8807/4258/11029 8809/4259/11030 8484/4259/11031 8483/4258/11032 +f 8812/4260/11033 8811/4261/11034 8486/4261/11035 8485/4260/11036 +s 2 +f 8811/4261/11037 8810/4262/11038 8487/4262/11039 8486/4261/11040 +s 4 +f 8809/4259/11030 8815/4265/11041 8490/4265/11042 8484/4259/11031 +s 2 +f 8810/4262/11038 8816/4266/11043 8491/4266/11044 8487/4262/11039 +s 4 +f 8815/4265/11041 8819/4269/11045 8494/4269/11046 8490/4265/11042 +s 2 +f 8816/4266/11043 8820/4270/11047 8495/4270/11048 8491/4266/11044 +s 4 +f 8819/4269/11045 8823/4273/11049 8498/4273/11050 8494/4269/11046 +s 2 +f 8820/4270/11047 8824/4274/11051 8499/4274/11052 8495/4270/11048 +s 4 +f 8823/4273/11049 8812/4260/11033 8485/4260/11036 8498/4273/11050 +s 2 +f 8824/4274/11051 8802/4251/11025 8476/4251/11028 8499/4274/11052 +s 4 +f 8854/4305/11053 8856/4306/11054 8531/4306/11055 8530/4305/11056 +f 8857/4307/11057 8807/4258/11029 8483/4258/11032 8532/4307/11058 +f 8856/4306/11054 8860/4310/11059 8535/4310/11060 8531/4306/11055 +f 8860/4310/11059 8863/4313/11061 8538/4313/11062 8535/4310/11060 +f 8863/4313/11061 8866/4316/11063 8541/4316/11064 8538/4313/11062 +f 8866/4316/11063 8857/4307/11057 8532/4307/11058 8541/4316/11064 +f 8896/4347/11065 8898/4348/11066 8573/4348/11067 8572/4347/11068 +f 8899/4349/11069 8854/4305/11053 8530/4305/11056 8574/4349/11070 +f 8898/4348/11066 8902/4352/11071 8577/4352/11072 8573/4348/11067 +f 8902/4352/11071 8905/4355/11073 8580/4355/11074 8577/4352/11072 +f 8905/4355/11073 8908/4358/11075 8583/4358/11076 8580/4355/11074 +f 8908/4358/11075 8899/4349/11069 8574/4349/11070 8583/4358/11076 +f 8936/4386/11077 8935/4387/11078 8612/4387/11079 8611/4386/11080 +f 8938/4389/11081 8940/4390/11082 8615/4390/11083 8614/4389/11084 +f 8939/4388/11085 8938/4389/11081 8614/4389/11084 8613/4388/11086 +f 8941/4391/11087 8896/4347/11065 8572/4347/11068 8616/4391/11088 +f 8935/4387/11078 8943/4393/11089 8618/4393/11090 8612/4387/11079 +f 8940/4390/11082 8944/4394/11091 8619/4394/11092 8615/4390/11083 +f 8943/4393/11089 8946/4396/11093 8621/4396/11094 8618/4393/11090 +f 8944/4394/11091 8947/4397/11095 8622/4397/11096 8619/4394/11092 +f 8946/4396/11093 8949/4399/11097 8624/4399/11098 8621/4396/11094 +f 8947/4397/11095 8950/4400/11099 8625/4400/11100 8622/4397/11096 +f 8949/4399/11097 8939/4388/11085 8613/4388/11086 8624/4399/11098 +f 8950/4400/11099 8941/4391/11087 8616/4391/11088 8625/4400/11100 +f 8976/4427/11101 8978/4428/11102 8653/4428/11103 8652/4427/11104 +s 2 +f 8977/4426/11105 8976/4427/11106 8652/4427/11107 8651/4426/11108 +s 4 +f 8981/4429/11109 8980/4430/11110 8655/4430/11111 8654/4429/11112 +s 2 +f 8801/4252/11026 8983/4433/11113 8658/4433/11114 8477/4252/11027 +s 4 +f 8978/4428/11102 8984/4434/11115 8659/4434/11116 8653/4428/11103 +s 2 +f 8983/4433/11113 8986/4436/11117 8661/4436/11118 8658/4433/11114 +s 4 +f 8984/4434/11115 8987/4437/11119 8662/4437/11120 8659/4434/11116 +s 2 +f 8986/4436/11117 8989/4439/11121 8664/4439/11122 8661/4436/11118 +s 4 +f 8987/4437/11119 8990/4440/11123 8665/4440/11124 8662/4437/11120 +s 2 +f 8989/4439/11121 8992/4442/11125 8667/4442/11126 8664/4439/11122 +s 4 +f 8990/4440/11123 8981/4429/11109 8654/4429/11112 8665/4440/11124 +s 2 +f 8992/4442/11125 8977/4426/11105 8651/4426/11108 8667/4442/11126 +s 4 +f 8980/4430/11110 9018/4468/11127 8693/4468/11128 8655/4430/11111 +f 9021/4469/11129 9020/4470/11130 8695/4470/11131 8694/4469/11132 +f 9018/4468/11127 9023/4473/11133 8698/4473/11134 8693/4468/11128 +f 9023/4473/11133 9025/4475/11135 8700/4475/11136 8698/4473/11134 +f 9025/4475/11135 9027/4477/11137 8702/4477/11138 8700/4475/11136 +f 9027/4477/11137 9021/4469/11129 8694/4469/11132 8702/4477/11138 +f 9020/4470/11130 9054/4504/11139 8729/4504/11140 8695/4470/11131 +f 9057/4505/11141 9056/4506/11142 8731/4506/11143 8730/4505/11144 +f 9054/4504/11139 9059/4509/11145 8734/4509/11146 8729/4504/11140 +f 9059/4509/11145 9061/4511/11147 8736/4511/11148 8734/4509/11146 +f 9061/4511/11147 9063/4513/11149 8738/4513/11150 8736/4511/11148 +f 9063/4513/11149 9057/4505/11141 8730/4505/11144 8738/4513/11150 +f 9056/4506/11142 9090/4540/11151 8765/4540/11152 8731/4506/11143 +f 9093/4541/11153 9092/4542/11154 8767/4542/11155 8766/4541/11156 +f 9092/4542/11154 9091/4543/11157 8768/4543/11158 8767/4542/11155 +f 9094/4544/11159 8936/4386/11077 8611/4386/11080 8769/4544/11160 +f 9090/4540/11151 9095/4545/11161 8770/4545/11162 8765/4540/11152 +f 9091/4543/11157 9096/4546/11163 8771/4546/11164 8768/4543/11158 +f 9095/4545/11161 9097/4547/11165 8772/4547/11166 8770/4545/11162 +f 9096/4546/11163 9098/4548/11167 8773/4548/11168 8771/4546/11164 +f 9097/4547/11165 9099/4549/11169 8774/4549/11170 8772/4547/11166 +f 9098/4548/11167 9100/4550/11171 8775/4550/11172 8773/4548/11168 +f 9099/4549/11169 9093/4541/11153 8766/4541/11156 8774/4549/11170 +f 9100/4550/11171 9094/4544/11159 8769/4544/11160 8775/4550/11172 +# 648 polygons + +# +# object lotu_petal_14 +# + +v 0.4244 0.3212 -0.3394 +v 0.4062 0.2868 -0.3087 +v 0.4444 0.2745 -0.2640 +v 0.4655 0.3116 -0.2858 +v 0.4469 0.3673 -0.3730 +v 0.4949 0.3572 -0.3170 +v 0.4685 0.4229 -0.4051 +v 0.5234 0.4079 -0.3458 +v 0.4916 0.4790 -0.4454 +v 0.5543 0.4660 -0.3816 +v 0.3775 0.3364 -0.3913 +v 0.3666 0.2966 -0.3518 +v 0.3907 0.3868 -0.4305 +v 0.4080 0.4429 -0.4684 +v 0.4253 0.4994 -0.5055 +v 0.3197 0.3644 -0.4456 +v 0.3202 0.3206 -0.3967 +v 0.3283 0.4136 -0.4918 +v 0.3403 0.4667 -0.5337 +v 0.3656 0.5202 -0.5692 +v 0.2616 0.3891 -0.4916 +v 0.2681 0.3475 -0.4359 +v 0.2627 0.4311 -0.5416 +v 0.2794 0.4773 -0.5881 +v 0.3043 0.5382 -0.6312 +v 0.4223 0.2436 -0.2443 +v 0.4504 0.2331 -0.2067 +v 0.4754 0.2654 -0.2205 +v 0.6034 0.4557 -0.3157 +v 0.6392 0.5182 -0.3391 +v 0.5847 0.5269 -0.4159 +v 0.3247 0.6029 -0.6699 +v 0.2484 0.6128 -0.7291 +v 0.2364 0.5501 -0.6834 +v 0.2152 0.3779 -0.4678 +v 0.2340 0.3421 -0.4013 +v 0.2817 0.3076 -0.3779 +v 0.5066 0.3016 -0.2395 +v 0.5171 0.5363 -0.4824 +v 0.2184 0.4970 -0.6332 +v 0.3218 0.2840 -0.3465 +v 0.5381 0.3476 -0.2620 +v 0.4566 0.5604 -0.5462 +v 0.2039 0.4516 -0.5796 +v 0.3565 0.2675 -0.3128 +v 0.5709 0.4030 -0.2820 +v 0.3935 0.5872 -0.6055 +v 0.2011 0.4125 -0.5253 +v 0.3925 0.2552 -0.2804 +v 0.5870 0.6867 -0.5290 +v 0.5488 0.6076 -0.5079 +v 0.6144 0.5982 -0.4355 +v 0.6511 0.6840 -0.4582 +v 0.6246 0.7782 -0.5557 +v 0.6966 0.7801 -0.4835 +v 0.6585 0.8756 -0.5738 +v 0.7274 0.8833 -0.4985 +v 0.6878 0.9899 -0.6011 +v 0.7606 0.9910 -0.5235 +v 0.5162 0.7015 -0.6061 +v 0.4918 0.6277 -0.5830 +v 0.5516 0.7888 -0.6345 +v 0.5818 0.8808 -0.6517 +v 0.6203 0.9849 -0.6771 +v 0.4425 0.7202 -0.6810 +v 0.4161 0.6513 -0.6448 +v 0.4714 0.8027 -0.7115 +v 0.5015 0.8997 -0.7297 +v 0.5494 1.0030 -0.7482 +v 0.3716 0.7450 -0.7515 +v 0.3412 0.6749 -0.7080 +v 0.3920 0.8264 -0.7791 +v 0.4278 0.9179 -0.8005 +v 0.4746 1.0221 -0.8191 +v 0.6804 0.5936 -0.3610 +v 0.8354 0.9871 -0.4412 +v 0.8791 1.1093 -0.4618 +v 0.8121 1.1120 -0.5431 +v 0.5143 1.1381 -0.8539 +v 0.4307 1.1540 -0.9228 +v 0.3867 1.0362 -0.8951 +v 0.2713 0.6858 -0.7682 +v 0.7113 0.6796 -0.3838 +v 0.7430 1.1102 -0.6256 +v 0.3523 0.9330 -0.8737 +v 0.7536 0.7747 -0.4104 +v 0.6652 1.1039 -0.7015 +v 0.3174 0.8375 -0.8386 +v 0.7875 0.8785 -0.4251 +v 0.5938 1.1189 -0.7722 +v 0.2973 0.7594 -0.8092 +v 0.8396 1.4138 -0.6480 +v 0.7961 1.2467 -0.6336 +v 0.8638 1.2595 -0.5626 +v 0.9058 1.4209 -0.5765 +v 0.8791 1.5939 -0.6677 +v 0.9435 1.5995 -0.5986 +v 0.8951 1.7744 -0.6672 +v 0.9681 1.7831 -0.5980 +v 0.9137 1.9471 -0.6353 +v 0.9744 1.9557 -0.5746 +v 0.7595 1.4153 -0.7222 +v 0.7232 1.2483 -0.7085 +v 0.7979 1.5947 -0.7313 +v 0.8323 1.7726 -0.7270 +v 0.8490 1.9410 -0.6931 +v 0.6869 1.4222 -0.7957 +v 0.6335 1.2578 -0.7915 +v 0.7231 1.5997 -0.7908 +v 0.7673 1.7751 -0.7922 +v 0.7801 1.9401 -0.7477 +v 0.6043 1.4352 -0.8570 +v 0.5447 1.2791 -0.8677 +v 0.6503 1.6057 -0.8466 +v 0.6998 1.7790 -0.8399 +v 0.7082 1.9415 -0.7989 +v 0.9290 1.2587 -0.4846 +v 1.0333 1.9469 -0.5130 +v 1.0168 2.0962 -0.4826 +v 0.9684 2.1057 -0.5520 +v 0.7207 2.0792 -0.7554 +v 0.6498 2.0775 -0.7930 +v 0.6327 1.9436 -0.8425 +v 0.4635 1.2928 -0.9298 +v 0.9634 1.4229 -0.5024 +v 0.9139 2.0961 -0.6077 +v 0.6186 1.7871 -0.8807 +v 1.0055 1.5971 -0.5189 +v 0.8575 2.0898 -0.6603 +v 0.5758 1.6185 -0.9107 +v 1.0279 1.7762 -0.5230 +v 0.7917 2.0867 -0.7087 +v 0.5209 1.4484 -0.9275 +v 0.8898 2.3498 -0.5581 +v 0.9106 2.2273 -0.5827 +v 0.9523 2.2327 -0.5304 +v 0.9190 2.3505 -0.5112 +v 0.8497 2.4501 -0.5031 +v 0.8766 2.4521 -0.4627 +v 0.8186 2.5345 -0.4445 +v 0.8458 2.5367 -0.4113 +v 0.7994 2.6091 -0.3902 +v 0.8189 2.6105 -0.3680 +v 0.8496 2.3426 -0.6012 +v 0.8597 2.2197 -0.6329 +v 0.8165 2.4447 -0.5444 +v 0.7877 2.5304 -0.4793 +v 0.7752 2.6079 -0.4138 +v 0.8019 2.3268 -0.6390 +v 0.8045 2.2096 -0.6761 +v 0.7822 2.4345 -0.5776 +v 0.7590 2.5245 -0.5109 +v 0.7526 2.5999 -0.4382 +v 0.7500 2.3181 -0.6742 +v 0.7436 2.2008 -0.7247 +v 0.7481 2.4267 -0.6100 +v 0.7319 2.5178 -0.5404 +v 0.7347 2.5900 -0.4632 +v 0.9903 2.2278 -0.4687 +v 0.8296 2.6127 -0.3511 +v 0.7877 2.6734 -0.3158 +v 0.7791 2.6724 -0.3283 +v 0.7512 2.6506 -0.3836 +v 0.7507 2.6399 -0.3976 +v 0.7219 2.5803 -0.4840 +v 0.6797 2.1947 -0.7574 +v 0.9419 2.3478 -0.4569 +v 0.7707 2.6702 -0.3415 +v 0.7100 2.5042 -0.5648 +v 0.9025 2.4478 -0.4208 +v 0.7623 2.6654 -0.3554 +v 0.7113 2.4105 -0.6409 +v 0.8709 2.5357 -0.3813 +v 0.7556 2.6585 -0.3694 +v 0.6994 2.3021 -0.7099 +v 0.6083 0.3300 -0.0008 +v 0.5619 0.2992 -0.0088 +v 0.5787 0.3109 0.0487 +v 0.6317 0.3444 0.0666 +v 0.6560 0.3663 0.0035 +v 0.6808 0.3831 0.0822 +v 0.7043 0.4083 0.0111 +v 0.7303 0.4270 0.0974 +v 0.7519 0.4606 0.0127 +v 0.7820 0.4914 0.1064 +v 0.5933 0.3159 -0.0686 +v 0.5490 0.2817 -0.0663 +v 0.6386 0.3568 -0.0706 +v 0.6864 0.3991 -0.0720 +v 0.7262 0.4564 -0.0759 +v 0.5721 0.3083 -0.1284 +v 0.5302 0.2723 -0.1231 +v 0.6153 0.3454 -0.1390 +v 0.6543 0.3955 -0.1474 +v 0.6992 0.4596 -0.1597 +v 0.5397 0.3027 -0.1869 +v 0.5029 0.2666 -0.1768 +v 0.5794 0.3431 -0.2027 +v 0.6170 0.3905 -0.2161 +v 0.6512 0.4516 -0.2386 +v 0.5212 0.2838 0.0274 +v 0.5328 0.3072 0.0827 +v 0.5913 0.3308 0.1123 +v 0.8080 0.5062 0.2003 +v 0.8689 0.5730 0.1948 +v 0.8391 0.5558 0.1008 +v 0.6864 0.5175 -0.2543 +v 0.4779 0.2315 -0.1674 +v 0.6423 0.3614 0.1380 +v 0.8091 0.5250 0.0095 +v 0.4968 0.2368 -0.1247 +v 0.6952 0.4068 0.1663 +v 0.7751 0.5195 -0.0853 +v 0.5069 0.2440 -0.0777 +v 0.7534 0.4522 0.1878 +v 0.7367 0.5233 -0.1748 +v 0.5135 0.2660 -0.0265 +v 0.9095 0.6906 -0.0135 +v 0.8529 0.6039 -0.0081 +v 0.8952 0.6275 0.0928 +v 0.9473 0.7079 0.0950 +v 0.9570 0.7839 -0.0200 +v 0.9953 0.7958 0.0904 +v 1.0057 0.8759 -0.0400 +v 1.0349 0.8895 0.0669 +v 1.0453 0.9774 -0.0633 +v 1.0773 0.9899 0.0490 +v 0.8621 0.6723 -0.1206 +v 0.8165 0.5930 -0.0988 +v 0.9058 0.7668 -0.1329 +v 0.9580 0.8669 -0.1458 +v 1.0023 0.9765 -0.1738 +v 0.8186 0.6758 -0.2164 +v 0.7775 0.5937 -0.1890 +v 0.8671 0.7690 -0.2382 +v 0.9111 0.8730 -0.2465 +v 0.9462 0.9827 -0.2701 +v 0.7664 0.6741 -0.3062 +v 0.7279 0.5913 -0.2764 +v 0.8102 0.7688 -0.3300 +v 0.8484 0.8709 -0.3389 +v 0.8960 0.9843 -0.3583 +v 0.9279 0.6441 0.2012 +v 1.1052 0.9984 0.1633 +v 1.1618 1.1090 0.1429 +v 1.1237 1.1039 0.0250 +v 0.9402 1.1016 -0.3761 +v 0.9743 0.7223 0.2025 +v 1.0833 1.0916 -0.0859 +v 1.0201 0.8110 0.1971 +v 1.0454 1.0967 -0.1927 +v 1.0562 0.9017 0.1803 +v 0.9957 1.1003 -0.2854 +v 1.1441 1.3918 -0.1217 +v 1.1221 1.2317 -0.1068 +v 1.1603 1.2439 -0.0026 +v 1.1704 1.3997 -0.0164 +v 1.1595 1.5678 -0.1538 +v 1.1888 1.5692 -0.0571 +v 1.1775 1.7470 -0.1676 +v 1.2029 1.7426 -0.0706 +v 1.1515 1.9164 -0.1908 +v 1.1814 1.9061 -0.1019 +v 1.1114 1.4048 -0.2240 +v 1.0844 1.2402 -0.2123 +v 1.1283 1.5807 -0.2516 +v 1.1517 1.7580 -0.2648 +v 1.1293 1.9261 -0.2813 +v 1.0720 1.4085 -0.3238 +v 1.0368 1.2457 -0.3107 +v 1.0923 1.5847 -0.3506 +v 1.1192 1.7625 -0.3586 +v 1.1050 1.9329 -0.3656 +v 1.0228 1.4143 -0.4181 +v 0.9791 1.2469 -0.4042 +v 1.0528 1.5910 -0.4388 +v 1.0780 1.7713 -0.4487 +v 1.0791 1.9411 -0.4418 +v 1.1879 1.2451 0.1074 +v 1.2048 1.9097 -0.0115 +v 1.1634 2.0488 -0.0289 +v 1.1555 2.0497 -0.1147 +v 1.0574 2.0897 -0.4152 +v 1.2057 1.4068 0.0900 +v 1.1338 2.0637 -0.1956 +v 1.2164 1.5778 0.0431 +v 1.1154 2.0752 -0.2713 +v 1.2253 1.7494 0.0256 +v 1.0844 2.0830 -0.3453 +v 1.0459 2.3143 -0.2248 +v 1.0933 2.1944 -0.2006 +v 1.1120 2.1779 -0.1279 +v 1.0673 2.2960 -0.1596 +v 0.9983 2.4149 -0.2325 +v 1.0193 2.4026 -0.1821 +v 0.9436 2.5072 -0.2318 +v 0.9604 2.4927 -0.1928 +v 0.8840 2.5932 -0.2469 +v 0.8986 2.5773 -0.2198 +v 1.0258 2.3239 -0.2843 +v 1.0713 2.2072 -0.2713 +v 0.9739 2.4272 -0.2848 +v 0.9252 2.5231 -0.2738 +v 0.8700 2.6007 -0.2771 +v 0.9958 2.3335 -0.3434 +v 1.0420 2.2140 -0.3367 +v 0.9548 2.4365 -0.3339 +v 0.9074 2.5302 -0.3142 +v 0.8527 2.6072 -0.3069 +v 0.9647 2.3387 -0.4021 +v 1.0120 2.2197 -0.4031 +v 0.9303 2.4384 -0.3777 +v 0.8897 2.5354 -0.3507 +v 0.8390 2.6125 -0.3326 +v 1.1227 2.1697 -0.0492 +v 0.9131 2.5593 -0.1965 +v 0.8509 2.6400 -0.2417 +v 0.8366 2.6465 -0.2573 +v 0.7955 2.6719 -0.3038 +v 1.0841 2.2800 -0.0897 +v 0.8241 2.6544 -0.2690 +v 1.0322 2.3870 -0.1332 +v 0.8124 2.6613 -0.2804 +v 0.9750 2.4807 -0.1589 +v 0.8031 2.6675 -0.2920 +v 0.4539 0.2578 -0.2755 +v 0.4143 0.2697 -0.3202 +v 0.4347 0.3062 -0.3518 +v 0.4768 0.2989 -0.2989 +v 0.4556 0.3547 -0.3844 +v 0.5040 0.3428 -0.3283 +v 0.4788 0.4108 -0.4179 +v 0.5362 0.3950 -0.3575 +v 0.5032 0.4631 -0.4575 +v 0.5666 0.4523 -0.3929 +v 0.3710 0.2796 -0.3656 +v 0.3818 0.3242 -0.4045 +v 0.3952 0.3749 -0.4418 +v 0.4154 0.4294 -0.4795 +v 0.4344 0.4860 -0.5188 +v 0.3201 0.3045 -0.4087 +v 0.3206 0.3503 -0.4568 +v 0.3307 0.4012 -0.5045 +v 0.3468 0.4505 -0.5479 +v 0.3745 0.5073 -0.5837 +v 0.2633 0.3315 -0.4468 +v 0.2608 0.3720 -0.5042 +v 0.2640 0.4137 -0.5562 +v 0.2849 0.4638 -0.6040 +v 0.3133 0.5259 -0.6452 +v 0.4633 0.2191 -0.2199 +v 0.4335 0.2289 -0.2555 +v 0.4866 0.2496 -0.2318 +v 0.5967 0.5126 -0.4282 +v 0.6537 0.5082 -0.3485 +v 0.6178 0.4422 -0.3243 +v 0.2565 0.6018 -0.7458 +v 0.3363 0.5914 -0.6845 +v 0.2433 0.5355 -0.6976 +v 0.2751 0.2910 -0.3869 +v 0.2255 0.3263 -0.4100 +v 0.2080 0.3600 -0.4761 +v 0.5173 0.2884 -0.2486 +v 0.5281 0.5243 -0.4959 +v 0.2234 0.4815 -0.6482 +v 0.3221 0.2669 -0.3583 +v 0.5498 0.3352 -0.2708 +v 0.4674 0.5466 -0.5587 +v 0.2043 0.4332 -0.5948 +v 0.3620 0.2514 -0.3261 +v 0.5855 0.3888 -0.2932 +v 0.4035 0.5734 -0.6191 +v 0.1997 0.3952 -0.5395 +v 0.4003 0.2406 -0.2939 +v 0.6266 0.5886 -0.4491 +v 0.5626 0.5967 -0.5220 +v 0.6005 0.6773 -0.5430 +v 0.6651 0.6771 -0.4733 +v 0.6389 0.7686 -0.5697 +v 0.7113 0.7720 -0.4994 +v 0.6735 0.8690 -0.5870 +v 0.7422 0.8767 -0.5127 +v 0.7030 0.9818 -0.6141 +v 0.7747 0.9822 -0.5371 +v 0.5026 0.6161 -0.5958 +v 0.5290 0.6911 -0.6203 +v 0.5637 0.7785 -0.6477 +v 0.5943 0.8712 -0.6649 +v 0.6355 0.9770 -0.6908 +v 0.4271 0.6375 -0.6587 +v 0.4530 0.7087 -0.6953 +v 0.4843 0.7943 -0.7260 +v 0.5150 0.8914 -0.7443 +v 0.5625 0.9952 -0.7635 +v 0.3539 0.6614 -0.7238 +v 0.3841 0.7324 -0.7659 +v 0.4054 0.8176 -0.7943 +v 0.4403 0.9113 -0.8154 +v 0.4863 1.0156 -0.8343 +v 0.6958 0.5853 -0.3721 +v 0.8251 1.1070 -0.5565 +v 0.8947 1.1059 -0.4746 +v 0.8493 0.9777 -0.4550 +v 0.4419 1.1496 -0.9387 +v 0.5284 1.1338 -0.8681 +v 0.3977 1.0280 -0.9106 +v 0.2817 0.6745 -0.7830 +v 0.7267 0.6722 -0.3959 +v 0.7538 1.1013 -0.6386 +v 0.3647 0.9250 -0.8885 +v 0.7683 0.7686 -0.4238 +v 0.6791 1.0988 -0.7192 +v 0.3326 0.8267 -0.8551 +v 0.8038 0.8689 -0.4387 +v 0.6097 1.1141 -0.7861 +v 0.3101 0.7477 -0.8255 +v 0.8795 1.2527 -0.5779 +v 0.8097 1.2418 -0.6495 +v 0.8523 1.4108 -0.6612 +v 0.9210 1.4150 -0.5888 +v 0.8909 1.5898 -0.6837 +v 0.9597 1.5965 -0.6113 +v 0.9108 1.7712 -0.6832 +v 0.9802 1.7810 -0.6097 +v 0.9291 1.9460 -0.6498 +v 0.9900 1.9557 -0.5897 +v 0.7359 1.2438 -0.7232 +v 0.7760 1.4131 -0.7379 +v 0.8104 1.5917 -0.7472 +v 0.8485 1.7709 -0.7427 +v 0.8633 1.9422 -0.7100 +v 0.6448 1.2543 -0.8038 +v 0.7001 1.4223 -0.8103 +v 0.7394 1.6017 -0.8068 +v 0.7842 1.7774 -0.8082 +v 0.7934 1.9423 -0.7629 +v 0.5577 1.2753 -0.8835 +v 0.6161 1.4337 -0.8733 +v 0.6653 1.6069 -0.8626 +v 0.7130 1.7824 -0.8594 +v 0.7196 1.9480 -0.8155 +v 0.9465 1.2530 -0.4994 +v 0.9847 2.1080 -0.5620 +v 1.0335 2.1005 -0.4926 +v 1.0488 1.9500 -0.5226 +v 0.6640 2.0844 -0.8109 +v 0.7341 2.0859 -0.7736 +v 0.6439 1.9471 -0.8594 +v 0.4776 1.2866 -0.9463 +v 0.9795 1.4166 -0.5153 +v 0.9281 2.0974 -0.6233 +v 0.6291 1.7888 -0.8985 +v 1.0210 1.5939 -0.5308 +v 0.8699 2.0928 -0.6770 +v 0.5892 1.6176 -0.9260 +v 1.0439 1.7775 -0.5349 +v 0.8036 2.0897 -0.7253 +v 0.5340 1.4444 -0.9434 +v 0.9688 2.2391 -0.5429 +v 0.9240 2.2314 -0.5973 +v 0.9038 2.3547 -0.5717 +v 0.9368 2.3575 -0.5197 +v 0.8630 2.4620 -0.5139 +v 0.8935 2.4631 -0.4720 +v 0.8320 2.5450 -0.4547 +v 0.8593 2.5486 -0.4196 +v 0.8099 2.6212 -0.4004 +v 0.8315 2.6224 -0.3784 +v 0.8731 2.2256 -0.6487 +v 0.8614 2.3485 -0.6154 +v 0.8290 2.4559 -0.5556 +v 0.8013 2.5412 -0.4916 +v 0.7861 2.6191 -0.4257 +v 0.8165 2.2164 -0.6927 +v 0.8132 2.3324 -0.6534 +v 0.7942 2.4421 -0.5930 +v 0.7715 2.5342 -0.5239 +v 0.7633 2.6116 -0.4491 +v 0.7565 2.2083 -0.7423 +v 0.7651 2.3254 -0.6904 +v 0.7583 2.4319 -0.6242 +v 0.7444 2.5268 -0.5540 +v 0.7439 2.6037 -0.4742 +v 1.0066 2.2308 -0.4769 +v 0.7932 2.6872 -0.3367 +v 0.8020 2.6878 -0.3228 +v 0.8444 2.6255 -0.3593 +v 0.7576 2.6556 -0.4105 +v 0.7610 2.6664 -0.3955 +v 0.7331 2.5916 -0.4964 +v 0.6931 2.2021 -0.7755 +v 0.9595 2.3529 -0.4665 +v 0.7843 2.6853 -0.3509 +v 0.7207 2.5149 -0.5790 +v 0.9186 2.4579 -0.4273 +v 0.7744 2.6800 -0.3657 +v 0.7207 2.4170 -0.6569 +v 0.8846 2.5468 -0.3874 +v 0.7668 2.6732 -0.3807 +v 0.7127 2.3111 -0.7273 +v 0.5867 0.2927 0.0505 +v 0.5719 0.2812 -0.0117 +v 0.6217 0.3127 -0.0037 +v 0.6446 0.3270 0.0658 +v 0.6703 0.3486 -0.0011 +v 0.6947 0.3646 0.0805 +v 0.7197 0.3928 0.0071 +v 0.7469 0.4135 0.0948 +v 0.7683 0.4461 0.0101 +v 0.7966 0.4791 0.1049 +v 0.5610 0.2662 -0.0725 +v 0.6078 0.2999 -0.0742 +v 0.6534 0.3402 -0.0782 +v 0.7017 0.3849 -0.0780 +v 0.7430 0.4423 -0.0802 +v 0.5440 0.2574 -0.1299 +v 0.5859 0.2923 -0.1361 +v 0.6289 0.3299 -0.1470 +v 0.6694 0.3856 -0.1574 +v 0.7154 0.4474 -0.1663 +v 0.5158 0.2523 -0.1855 +v 0.5516 0.2863 -0.1952 +v 0.5929 0.3270 -0.2121 +v 0.6315 0.3797 -0.2271 +v 0.6664 0.4397 -0.2476 +v 0.5372 0.2881 0.0882 +v 0.5277 0.2656 0.0300 +v 0.5994 0.3117 0.1145 +v 0.8542 0.5428 0.0985 +v 0.8827 0.5611 0.1943 +v 0.8236 0.4935 0.1976 +v 0.7024 0.5060 -0.2639 +v 0.4899 0.2181 -0.1778 +v 0.6526 0.3447 0.1368 +v 0.8248 0.5148 0.0050 +v 0.5122 0.2221 -0.1320 +v 0.7084 0.3911 0.1642 +v 0.7916 0.5085 -0.0893 +v 0.5202 0.2304 -0.0816 +v 0.7658 0.4378 0.1872 +v 0.7537 0.5105 -0.1815 +v 0.5240 0.2499 -0.0279 +v 0.9099 0.6161 0.0931 +v 0.8707 0.5956 -0.0135 +v 0.9251 0.6841 -0.0167 +v 0.9652 0.6990 0.0898 +v 0.9729 0.7743 -0.0221 +v 1.0135 0.7852 0.0876 +v 1.0224 0.8653 -0.0459 +v 1.0549 0.8808 0.0618 +v 1.0629 0.9679 -0.0664 +v 1.0961 0.9802 0.0458 +v 0.8344 0.5823 -0.1069 +v 0.8781 0.6670 -0.1262 +v 0.9217 0.7583 -0.1355 +v 0.9751 0.8610 -0.1528 +v 1.0188 0.9687 -0.1786 +v 0.7927 0.5850 -0.1971 +v 0.8363 0.6688 -0.2248 +v 0.8824 0.7621 -0.2466 +v 0.9278 0.8675 -0.2556 +v 0.9622 0.9739 -0.2814 +v 0.7429 0.5813 -0.2840 +v 0.7817 0.6654 -0.3138 +v 0.8254 0.7620 -0.3422 +v 0.8644 0.8653 -0.3513 +v 0.9134 0.9768 -0.3711 +v 0.9448 0.6341 0.1996 +v 1.1411 1.0982 0.0208 +v 1.1796 1.1019 0.1392 +v 1.1242 0.9885 0.1610 +v 0.9554 1.0941 -0.3880 +v 0.9908 0.7128 0.2002 +v 1.1019 1.0826 -0.0924 +v 1.0398 0.8023 0.1951 +v 1.0618 1.0902 -0.1989 +v 1.0742 0.8908 0.1793 +v 1.0114 1.0946 -0.2969 +v 1.1789 1.2377 -0.0086 +v 1.1413 1.2260 -0.1150 +v 1.1643 1.3874 -0.1271 +v 1.1900 1.3937 -0.0224 +v 1.1800 1.5677 -0.1622 +v 1.2077 1.5664 -0.0637 +v 1.1969 1.7478 -0.1725 +v 1.2232 1.7421 -0.0746 +v 1.1711 1.9183 -0.1955 +v 1.2013 1.9080 -0.1035 +v 1.1019 1.2347 -0.2183 +v 1.1311 1.3995 -0.2321 +v 1.1481 1.5771 -0.2579 +v 1.1725 1.7564 -0.2703 +v 1.1497 1.9259 -0.2843 +v 1.0533 1.2394 -0.3206 +v 1.0905 1.4039 -0.3299 +v 1.1110 1.5794 -0.3569 +v 1.1368 1.7593 -0.3653 +v 1.1253 1.9314 -0.3746 +v 0.9960 1.2445 -0.4144 +v 1.0400 1.4086 -0.4278 +v 1.0707 1.5890 -0.4492 +v 1.0959 1.7691 -0.4559 +v 1.0979 1.9404 -0.4515 +v 1.2082 1.2397 0.1037 +v 1.1747 2.0552 -0.1166 +v 1.1827 2.0512 -0.0304 +v 1.2249 1.9124 -0.0110 +v 1.0747 2.0921 -0.4255 +v 1.2246 1.4025 0.0850 +v 1.1538 2.0681 -0.1995 +v 1.2360 1.5737 0.0390 +v 1.1348 2.0757 -0.2782 +v 1.2449 1.7498 0.0221 +v 1.1041 2.0842 -0.3531 +v 1.1308 2.1817 -0.1303 +v 1.1121 2.1989 -0.2037 +v 1.0644 2.3219 -0.2261 +v 1.0867 2.3034 -0.1591 +v 1.0151 2.4258 -0.2302 +v 1.0373 2.4118 -0.1782 +v 0.9607 2.5160 -0.2303 +v 0.9780 2.5027 -0.1903 +v 0.8995 2.6053 -0.2493 +v 0.9141 2.5890 -0.2218 +v 1.0892 2.2091 -0.2744 +v 1.0433 2.3319 -0.2895 +v 0.9913 2.4375 -0.2851 +v 0.9424 2.5325 -0.2736 +v 0.8841 2.6154 -0.2804 +v 1.0592 2.2176 -0.3433 +v 1.0110 2.3402 -0.3485 +v 0.9710 2.4457 -0.3368 +v 0.9239 2.5387 -0.3166 +v 0.8670 2.6217 -0.3105 +v 1.0318 2.2240 -0.4091 +v 0.9832 2.3445 -0.4080 +v 0.9473 2.4491 -0.3851 +v 0.9055 2.5421 -0.3558 +v 0.8538 2.6259 -0.3376 +v 1.1425 2.1738 -0.0505 +v 0.8527 2.6576 -0.2647 +v 0.8658 2.6464 -0.2527 +v 0.9291 2.5707 -0.2005 +v 0.8116 2.6864 -0.3093 +v 1.1035 2.2886 -0.0898 +v 0.8399 2.6679 -0.2759 +v 1.0503 2.3940 -0.1305 +v 0.8294 2.6759 -0.2865 +v 0.9921 2.4901 -0.1579 +v 0.8204 2.6821 -0.2972 +# 650 vertices + +vn 0.1759 0.9842 -0.0217 +vn 0.1941 0.9788 -0.0649 +vn 0.1382 0.9904 0.0052 +vn 0.1346 0.9909 0.0089 +vn 0.1941 0.9796 0.0526 +vn 0.1413 0.9895 0.0317 +vn 0.2189 0.9734 0.0680 +vn 0.1298 0.9895 0.0635 +vn 0.2436 0.9695 0.0266 +vn 0.1359 0.9887 0.0632 +vn 0.2796 0.9591 -0.0443 +vn 0.2856 0.9425 -0.1733 +vn 0.2756 0.9605 0.0383 +vn 0.2566 0.9634 0.0778 +vn 0.2661 0.9627 0.0485 +vn 0.3678 0.9201 -0.1346 +vn 0.3952 0.8806 -0.2614 +vn 0.3158 0.9483 -0.0324 +vn 0.2624 0.9644 0.0320 +vn 0.2436 0.9670 0.0743 +vn 0.4177 0.8604 -0.2918 +vn 0.4626 0.7747 -0.4311 +vn 0.3710 0.9078 -0.1956 +vn 0.3068 0.9493 -0.0689 +vn 0.2663 0.9618 0.0635 +vn 0.1723 0.9843 -0.0392 +vn 0.0618 0.9979 0.0171 +vn 0.0330 0.9993 0.0160 +vn 0.0357 0.9951 0.0920 +vn -0.0075 0.9816 0.1908 +vn 0.1184 0.9757 0.1843 +vn 0.2633 0.9529 0.1503 +vn 0.2920 0.9490 0.1188 +vn 0.3146 0.9491 0.0155 +vn 0.4698 0.6483 -0.5991 +vn 0.4769 0.4460 -0.7574 +vn 0.4629 0.7398 -0.4883 +vn 0.0410 0.9992 -0.0035 +vn 0.2158 0.9700 0.1120 +vn 0.3727 0.9128 -0.1669 +vn 0.3638 0.8837 -0.2945 +vn 0.0460 0.9960 0.0767 +vn 0.2991 0.9538 0.0281 +vn 0.4103 0.8659 -0.2861 +vn 0.3113 0.9088 -0.2778 +vn 0.0609 0.9952 0.0769 +vn 0.2855 0.9542 0.0899 +vn 0.4438 0.7998 -0.4041 +vn 0.2171 0.9717 -0.0937 +vn 0.1470 0.9548 0.2583 +vn 0.1498 0.9589 0.2411 +vn 0.1171 0.9574 0.2638 +vn 0.1041 0.9566 0.2723 +vn 0.1508 0.9377 0.3131 +vn 0.1002 0.9376 0.3329 +vn 0.1316 0.9174 0.3755 +vn 0.0944 0.9150 0.3922 +vn 0.1079 0.9322 0.3456 +vn 0.1142 0.9348 0.3364 +vn 0.1899 0.9451 0.2659 +vn 0.2316 0.9560 0.1799 +vn 0.1939 0.9299 0.3127 +vn 0.1980 0.9193 0.3400 +vn 0.1654 0.9278 0.3344 +vn 0.2625 0.9436 0.2020 +vn 0.3225 0.9431 0.0811 +vn 0.2603 0.9193 0.2953 +vn 0.2362 0.9108 0.3387 +vn 0.2327 0.9219 0.3097 +vn 0.2913 0.9390 0.1830 +vn 0.2884 0.9507 0.1140 +vn 0.2887 0.9149 0.2821 +vn 0.2469 0.9149 0.3194 +vn 0.2601 0.9184 0.2981 +vn 0.0057 0.9663 0.2573 +vn 0.0703 0.9361 0.3445 +vn 0.0561 0.9229 0.3810 +vn 0.0848 0.9248 0.3708 +vn 0.2585 0.8823 0.3934 +vn 0.2902 0.8711 0.3962 +vn 0.2562 0.9124 0.3191 +vn 0.2646 0.9536 0.1435 +vn 0.0367 0.9598 0.2782 +vn 0.1181 0.9261 0.3584 +vn 0.2403 0.9193 0.3117 +vn 0.0476 0.9405 0.3365 +vn 0.1784 0.9138 0.3649 +vn 0.3015 0.9203 0.2494 +vn 0.0627 0.9270 0.3698 +vn 0.2199 0.8973 0.3829 +vn 0.3044 0.9348 0.1829 +vn 0.1731 0.8589 0.4819 +vn 0.1357 0.8870 0.4414 +vn 0.0976 0.8950 0.4353 +vn 0.0876 0.8708 0.4837 +vn 0.2098 0.8161 0.5385 +vn 0.1045 0.8297 0.5484 +vn 0.2119 0.7235 0.6570 +vn 0.1448 0.7390 0.6579 +vn 0.2289 0.6493 0.7253 +vn 0.1751 0.6597 0.7308 +vn 0.2038 0.8358 0.5098 +vn 0.1894 0.8729 0.4497 +vn 0.2804 0.8074 0.5191 +vn 0.2189 0.7183 0.6605 +vn 0.2808 0.6316 0.7226 +vn 0.2637 0.8135 0.5183 +vn 0.2617 0.8563 0.4452 +vn 0.2988 0.7940 0.5295 +vn 0.2820 0.7059 0.6498 +vn 0.3233 0.5881 0.7414 +vn 0.3028 0.8011 0.5162 +vn 0.2939 0.8306 0.4729 +vn 0.3122 0.7690 0.5578 +vn 0.4130 0.6626 0.6249 +vn 0.3957 0.5334 0.7476 +vn 0.0354 0.8933 0.4481 +vn 0.0596 0.6640 0.7454 +vn -0.0307 0.5712 0.8202 +vn 0.1055 0.6042 0.7898 +vn 0.4348 0.5479 0.7147 +vn 0.4652 0.5111 0.7227 +vn 0.4396 0.5123 0.7377 +vn 0.3198 0.8199 0.4748 +vn 0.0355 0.8731 0.4863 +vn 0.2185 0.6179 0.7553 +vn 0.4509 0.6411 0.6210 +vn 0.0102 0.8366 0.5477 +vn 0.2919 0.6049 0.7409 +vn 0.2697 0.7661 0.5835 +vn 0.0416 0.7649 0.6428 +vn 0.3600 0.5868 0.7253 +vn 0.2878 0.8083 0.5137 +vn 0.1101 0.3849 0.9164 +vn 0.1697 0.5682 0.8052 +vn 0.0240 0.5379 0.8426 +vn -0.0728 0.3637 0.9287 +vn 0.0995 0.2155 0.9714 +vn -0.0071 0.2632 0.9647 +vn 0.1544 0.2023 0.9671 +vn 0.1045 0.2475 0.9632 +vn 0.1797 0.1497 0.9723 +vn 0.1133 0.1639 0.9799 +vn 0.2981 0.3811 0.8752 +vn 0.2841 0.5588 0.7791 +vn 0.2362 0.1896 0.9530 +vn 0.2081 0.1592 0.9651 +vn 0.2522 0.1094 0.9615 +vn 0.3874 0.3837 0.8383 +vn 0.3396 0.5365 0.7725 +vn 0.3083 0.2050 0.9289 +vn 0.2425 0.1446 0.9593 +vn 0.2700 0.1069 0.9569 +vn 0.4145 0.3628 0.8346 +vn 0.4141 0.5119 0.7526 +vn 0.3678 0.2077 0.9064 +vn 0.3258 0.1118 0.9388 +vn 0.2495 0.1253 0.9602 +vn -0.1566 0.4654 0.8712 +vn 0.0057 0.1557 0.9878 +vn 0.0114 0.0921 0.9957 +vn 0.0927 0.0868 0.9919 +vn 0.0910 0.2185 0.9716 +vn -0.5337 0.2703 -0.8013 +vn 0.2599 0.1238 0.9577 +vn 0.4925 0.5000 0.7124 +vn -0.1925 0.3524 0.9158 +vn 0.1416 0.0840 0.9864 +vn 0.3928 0.1081 0.9132 +vn -0.0686 0.3253 0.9431 +vn 0.2028 0.0756 0.9763 +vn 0.4246 0.2337 0.8747 +vn 0.0317 0.2812 0.9591 +vn 0.2276 0.0746 0.9709 +vn 0.4476 0.3717 0.8133 +vn -0.3626 0.8979 -0.2496 +vn -0.4088 0.8440 -0.3473 +vn -0.3940 0.8012 -0.4503 +vn -0.3985 0.8667 -0.3001 +vn -0.3537 0.9188 -0.1750 +vn -0.4211 0.8841 -0.2027 +vn -0.3597 0.9307 -0.0661 +vn -0.4312 0.8966 -0.1005 +vn -0.3486 0.9373 0.0023 +vn -0.4098 0.9119 -0.0199 +vn -0.3618 0.9128 -0.1896 +vn -0.4138 0.8816 -0.2271 +vn -0.3274 0.9383 -0.1115 +vn -0.2966 0.9550 0.0042 +vn -0.2704 0.9578 0.0972 +vn -0.2212 0.9669 -0.1271 +vn -0.2656 0.9613 -0.0731 +vn -0.2203 0.9750 -0.0290 +vn -0.1895 0.9781 0.0860 +vn -0.1694 0.9721 0.1623 +vn -0.1055 0.9933 -0.0466 +vn -0.1345 0.9908 0.0171 +vn -0.0442 0.9990 0.0093 +vn -0.0479 0.9935 0.1035 +vn -0.0851 0.9801 0.1791 +vn -0.4356 0.7644 -0.4753 +vn -0.4342 0.6682 -0.6042 +vn -0.4229 0.7720 -0.4745 +vn -0.3577 0.9330 -0.0389 +vn -0.3506 0.9364 0.0148 +vn -0.3713 0.9281 0.0290 +vn -0.0917 0.9753 0.2008 +vn -0.1289 0.9883 0.0813 +vn -0.4530 0.8354 -0.3113 +vn -0.3486 0.9338 0.0810 +vn -0.2845 0.9586 0.0149 +vn -0.4574 0.8543 -0.2469 +vn -0.2200 0.9661 0.1350 +vn -0.4395 0.8859 -0.1486 +vn -0.4094 0.9066 -0.1028 +vn -0.1363 0.9741 0.1805 +vn -0.5076 0.7903 -0.3433 +vn -0.2799 0.9354 0.2163 +vn -0.2985 0.9410 0.1594 +vn -0.3310 0.9376 0.1061 +vn -0.3411 0.9190 0.1979 +vn -0.2651 0.9339 0.2399 +vn -0.3560 0.9027 0.2418 +vn -0.2789 0.9215 0.2704 +vn -0.3852 0.8779 0.2844 +vn -0.2879 0.8975 0.3342 +vn -0.3540 0.8882 0.2930 +vn -0.2109 0.9520 0.2219 +vn -0.2181 0.9563 0.1948 +vn -0.2216 0.9338 0.2809 +vn -0.1700 0.9438 0.2835 +vn -0.1424 0.9326 0.3317 +vn -0.1199 0.9677 0.2218 +vn -0.1401 0.9677 0.2096 +vn -0.1280 0.9435 0.3056 +vn -0.1045 0.9318 0.3475 +vn -0.0774 0.9329 0.3517 +vn -0.0332 0.9701 0.2403 +vn -0.0781 0.9730 0.2174 +vn -0.0193 0.9447 0.3273 +vn -0.0030 0.9334 0.3589 +vn -0.0211 0.9352 0.3535 +vn -0.3595 0.9255 0.1195 +vn -0.3432 0.9068 0.2449 +vn -0.3013 0.8941 0.3314 +vn -0.2935 0.8881 0.3537 +vn -0.0191 0.9229 0.3846 +vn -0.3852 0.9005 0.2019 +vn -0.2649 0.8838 0.3856 +vn -0.4052 0.8772 0.2574 +vn -0.1724 0.9004 0.3995 +vn -0.4061 0.8719 0.2737 +vn -0.0733 0.9200 0.3850 +vn -0.3026 0.7737 0.5567 +vn -0.2542 0.8403 0.4788 +vn -0.3103 0.8040 0.5072 +vn -0.3193 0.7659 0.5581 +vn -0.2924 0.7775 0.5568 +vn -0.3143 0.7691 0.5565 +vn -0.3284 0.6812 0.6543 +vn -0.3375 0.6798 0.6511 +vn -0.3160 0.6068 0.7293 +vn -0.3019 0.6136 0.7296 +vn -0.2421 0.8016 0.5466 +vn -0.1948 0.8553 0.4801 +vn -0.2556 0.7916 0.5551 +vn -0.2945 0.7033 0.6471 +vn -0.3192 0.5961 0.7368 +vn -0.1618 0.8346 0.5266 +vn -0.0952 0.8833 0.4591 +vn -0.2006 0.8083 0.5536 +vn -0.2163 0.7430 0.6334 +vn -0.2802 0.5995 0.7497 +vn -0.0431 0.8668 0.4969 +vn -0.0282 0.8930 0.4491 +vn -0.1028 0.8268 0.5529 +vn -0.0833 0.7712 0.6311 +vn -0.1388 0.6357 0.7594 +vn -0.3350 0.7898 0.5138 +vn -0.3455 0.5839 0.7346 +vn -0.4476 0.4003 0.7996 +vn -0.3869 0.4691 0.7939 +vn -0.1654 0.5205 0.8377 +vn -0.2916 0.7835 0.5487 +vn -0.3415 0.5153 0.7861 +vn -0.3374 0.7494 0.5697 +vn -0.2825 0.5282 0.8007 +vn -0.3541 0.6745 0.6478 +vn -0.2188 0.5217 0.8246 +vn -0.3041 0.3806 0.8733 +vn -0.3367 0.4250 0.8402 +vn -0.4010 0.3957 0.8262 +vn -0.3539 0.3889 0.8506 +vn -0.2412 0.3251 0.9144 +vn -0.3280 0.2848 0.9007 +vn -0.2996 0.2031 0.9322 +vn -0.3092 0.1948 0.9309 +vn -0.3044 0.0776 0.9494 +vn -0.3887 0.0273 0.9210 +vn -0.2225 0.4042 0.8872 +vn -0.2483 0.4488 0.8585 +vn -0.2349 0.3165 0.9191 +vn -0.2527 0.2221 0.9417 +vn -0.1898 0.1414 0.9716 +vn -0.1293 0.4417 0.8878 +vn -0.1722 0.4598 0.8711 +vn -0.1590 0.3480 0.9239 +vn -0.1896 0.2367 0.9529 +vn -0.1573 0.1439 0.9770 +vn -0.1648 0.4055 0.8991 +vn -0.2226 0.4209 0.8794 +vn -0.0748 0.3748 0.9241 +vn -0.0888 0.2669 0.9596 +vn -0.1162 0.1424 0.9830 +vn -0.4287 0.3926 0.8137 +vn -0.3932 0.0527 0.9179 +vn 0.0797 0.5360 0.8405 +vn 0.0409 0.4264 0.9036 +vn -0.1110 0.0908 0.9897 +vn -0.3829 0.4111 0.8273 +vn -0.0590 0.2198 0.9738 +vn -0.3928 0.2743 0.8778 +vn -0.1743 0.0793 0.9815 +vn -0.2968 0.2471 0.9224 +vn -0.1828 0.0779 0.9801 +vn -0.1461 -0.9893 -0.0030 +vn -0.2048 -0.9762 0.0709 +vn -0.1955 -0.9807 0.0037 +vn -0.1216 -0.9920 -0.0326 +vn -0.2122 -0.9755 -0.0573 +vn -0.1406 -0.9897 -0.0269 +vn -0.2351 -0.9714 -0.0334 +vn -0.1374 -0.9895 -0.0456 +vn -0.2451 -0.9693 -0.0202 +vn -0.1322 -0.9890 -0.0656 +vn -0.3041 -0.9386 0.1630 +vn -0.3044 -0.9524 0.0160 +vn -0.2852 -0.9580 -0.0286 +vn -0.2538 -0.9659 -0.0504 +vn -0.2726 -0.9617 -0.0273 +vn -0.4144 -0.8715 0.2622 +vn -0.3584 -0.9270 0.1108 +vn -0.2974 -0.9530 0.0585 +vn -0.2543 -0.9671 -0.0018 +vn -0.2406 -0.9678 -0.0738 +vn -0.4589 -0.7644 0.4529 +vn -0.3954 -0.8665 0.3048 +vn -0.3452 -0.9197 0.1872 +vn -0.3019 -0.9512 0.0634 +vn -0.2684 -0.9614 -0.0605 +vn -0.0483 -0.9985 -0.0266 +vn -0.1914 -0.9798 0.0584 +vn -0.0188 -0.9988 -0.0456 +vn -0.1127 -0.9764 -0.1841 +vn 0.0081 -0.9804 -0.1969 +vn -0.0267 -0.9935 -0.1110 +vn -0.2935 -0.9490 -0.1151 +vn -0.2667 -0.9549 -0.1305 +vn -0.3089 -0.9509 -0.0195 +vn -0.4718 -0.7115 0.5208 +vn -0.4671 -0.4380 0.7681 +vn -0.4588 -0.6509 0.6048 +vn -0.0394 -0.9990 -0.0216 +vn -0.2175 -0.9691 -0.1166 +vn -0.3671 -0.9178 0.1509 +vn -0.3848 -0.8707 0.3062 +vn -0.0670 -0.9965 -0.0495 +vn -0.2952 -0.9549 -0.0336 +vn -0.4011 -0.8743 0.2733 +vn -0.3123 -0.9037 0.2930 +vn -0.0620 -0.9957 -0.0693 +vn -0.2808 -0.9563 -0.0819 +vn -0.4276 -0.7993 0.4222 +vn -0.2180 -0.9697 0.1100 +vn -0.1074 -0.9579 -0.2662 +vn -0.1533 -0.9594 -0.2368 +vn -0.1451 -0.9546 -0.2601 +vn -0.1023 -0.9595 -0.2626 +vn -0.1603 -0.9365 -0.3118 +vn -0.0952 -0.9373 -0.3351 +vn -0.1360 -0.9158 -0.3778 +vn -0.1009 -0.9141 -0.3928 +vn -0.1037 -0.9310 -0.3501 +vn -0.1179 -0.9305 -0.3468 +vn -0.2344 -0.9561 -0.1760 +vn -0.1946 -0.9450 -0.2628 +vn -0.1961 -0.9287 -0.3147 +vn -0.1980 -0.9201 -0.3379 +vn -0.1659 -0.9297 -0.3288 +vn -0.3065 -0.9475 -0.0911 +vn -0.2550 -0.9441 -0.2090 +vn -0.2561 -0.9195 -0.2980 +vn -0.2371 -0.9111 -0.3372 +vn -0.2382 -0.9208 -0.3090 +vn -0.2914 -0.9510 -0.1036 +vn -0.2768 -0.9409 -0.1951 +vn -0.2733 -0.9150 -0.2968 +vn -0.2470 -0.9126 -0.3259 +vn -0.2654 -0.9162 -0.3001 +vn -0.0027 -0.9664 -0.2570 +vn -0.0913 -0.9251 -0.3685 +vn -0.0638 -0.9242 -0.3764 +vn -0.0750 -0.9329 -0.3523 +vn -0.2915 -0.8737 -0.3894 +vn -0.2624 -0.8821 -0.3911 +vn -0.2531 -0.9115 -0.3243 +vn -0.2864 -0.9512 -0.1153 +vn -0.0224 -0.9601 -0.2787 +vn -0.1082 -0.9252 -0.3637 +vn -0.2320 -0.9163 -0.3264 +vn -0.0378 -0.9429 -0.3309 +vn -0.1761 -0.9097 -0.3762 +vn -0.2800 -0.9208 -0.2714 +vn -0.0608 -0.9284 -0.3667 +vn -0.2261 -0.8917 -0.3922 +vn -0.3021 -0.9371 -0.1749 +vn -0.1097 -0.8952 -0.4319 +vn -0.1449 -0.8890 -0.4344 +vn -0.1673 -0.8562 -0.4888 +vn -0.1019 -0.8673 -0.4872 +vn -0.2140 -0.8211 -0.5292 +vn -0.0999 -0.8272 -0.5530 +vn -0.1891 -0.7281 -0.6588 +vn -0.1344 -0.7426 -0.6562 +vn -0.2207 -0.6543 -0.7233 +vn -0.1618 -0.6631 -0.7309 +vn -0.2028 -0.8719 -0.4458 +vn -0.2020 -0.8368 -0.5088 +vn -0.2696 -0.8110 -0.5193 +vn -0.2162 -0.7218 -0.6574 +vn -0.2835 -0.6281 -0.7246 +vn -0.2574 -0.8523 -0.4553 +vn -0.2764 -0.8169 -0.5063 +vn -0.2973 -0.7970 -0.5258 +vn -0.2726 -0.7041 -0.6557 +vn -0.3241 -0.5871 -0.7418 +vn -0.2759 -0.8332 -0.4792 +vn -0.2942 -0.8056 -0.5142 +vn -0.3220 -0.7700 -0.5508 +vn -0.4220 -0.6563 -0.6255 +vn -0.3939 -0.5353 -0.7472 +vn -0.0237 -0.8931 -0.4493 +vn -0.0959 -0.6063 -0.7894 +vn 0.0272 -0.5720 -0.8198 +vn -0.0532 -0.6622 -0.7475 +vn -0.4657 -0.5197 -0.7163 +vn -0.4209 -0.5588 -0.7146 +vn -0.4494 -0.5101 -0.7334 +vn -0.3086 -0.8242 -0.4749 +vn -0.0320 -0.8702 -0.4917 +vn -0.2084 -0.6170 -0.7588 +vn -0.4748 -0.6319 -0.6126 +vn -0.0124 -0.8331 -0.5529 +vn -0.2938 -0.6045 -0.7404 +vn -0.2787 -0.7643 -0.5815 +vn -0.0486 -0.7633 -0.6443 +vn -0.3498 -0.5913 -0.7266 +vn -0.2781 -0.8091 -0.5178 +vn -0.0168 -0.5384 -0.8426 +vn -0.1701 -0.5680 -0.8053 +vn -0.1259 -0.3903 -0.9120 +vn 0.0709 -0.3692 -0.9266 +vn -0.1141 -0.2187 -0.9691 +vn 0.0148 -0.2598 -0.9655 +vn -0.1391 -0.1944 -0.9710 +vn -0.0861 -0.2413 -0.9666 +vn -0.1896 -0.1622 -0.9684 +vn -0.1423 -0.1828 -0.9728 +vn -0.2787 -0.5524 -0.7856 +vn -0.3009 -0.3806 -0.8744 +vn -0.2382 -0.1963 -0.9512 +vn -0.2066 -0.1522 -0.9665 +vn -0.2473 -0.1224 -0.9612 +vn -0.3278 -0.5387 -0.7761 +vn -0.3668 -0.3801 -0.8491 +vn -0.3302 -0.2078 -0.9207 +vn -0.2508 -0.1401 -0.9578 +vn -0.2613 -0.1290 -0.9566 +vn -0.4005 -0.5185 -0.7555 +vn -0.3831 -0.3583 -0.8514 +vn -0.3710 -0.2147 -0.9035 +vn -0.3141 -0.1262 -0.9410 +vn -0.2185 -0.1641 -0.9619 +vn 0.1567 -0.4700 -0.8687 +vn -0.0605 -0.1013 -0.9930 +vn -0.0034 -0.1052 -0.9944 +vn -0.0031 -0.1760 -0.9844 +vn 0.2649 -0.5989 -0.7557 +vn -0.0776 -0.2586 -0.9629 +vn -0.2387 -0.1409 -0.9608 +vn -0.4866 -0.5015 -0.7153 +vn 0.1977 -0.3608 -0.9114 +vn -0.1429 -0.1103 -0.9836 +vn -0.3626 -0.1439 -0.9208 +vn 0.0798 -0.3194 -0.9443 +vn -0.2125 -0.1081 -0.9712 +vn -0.3984 -0.2270 -0.8887 +vn -0.0055 -0.2795 -0.9601 +vn -0.1946 -0.1231 -0.9731 +vn -0.4381 -0.3653 -0.8214 +vn 0.3880 -0.7968 0.4632 +vn 0.4002 -0.8412 0.3637 +vn 0.3597 -0.8929 0.2710 +vn 0.4004 -0.8588 0.3197 +vn 0.3509 -0.9200 0.1747 +vn 0.4336 -0.8761 0.2107 +vn 0.3596 -0.9313 0.0573 +vn 0.4498 -0.8892 0.0832 +vn 0.3617 -0.9321 -0.0179 +vn 0.4152 -0.9096 0.0142 +vn 0.4048 -0.8819 0.2416 +vn 0.3512 -0.9136 0.2049 +vn 0.3154 -0.9439 0.0981 +vn 0.2854 -0.9583 -0.0129 +vn 0.2718 -0.9570 -0.1017 +vn 0.2737 -0.9585 0.0800 +vn 0.2202 -0.9657 0.1373 +vn 0.2179 -0.9759 0.0133 +vn 0.1793 -0.9791 -0.0959 +vn 0.1642 -0.9746 -0.1522 +vn 0.1240 -0.9921 -0.0186 +vn 0.0791 -0.9951 0.0593 +vn 0.0336 -0.9994 -0.0074 +vn 0.0609 -0.9911 -0.1183 +vn 0.0839 -0.9808 -0.1759 +vn 0.4230 -0.6805 0.5983 +vn 0.4249 -0.7630 0.4871 +vn 0.4236 -0.7699 0.4773 +vn 0.3749 -0.9265 -0.0327 +vn 0.3590 -0.9331 -0.0218 +vn 0.3559 -0.9337 0.0392 +vn 0.0849 -0.9748 -0.2062 +vn 0.1214 -0.9896 -0.0777 +vn 0.4709 -0.8148 0.3381 +vn 0.3550 -0.9308 -0.0868 +vn 0.2881 -0.9573 -0.0245 +vn 0.4788 -0.8420 0.2487 +vn 0.2285 -0.9633 -0.1411 +vn 0.4572 -0.8751 0.1588 +vn 0.4188 -0.9023 0.1021 +vn 0.1441 -0.9701 -0.1952 +vn 0.4893 -0.7980 0.3518 +vn 0.3302 -0.9379 -0.1059 +vn 0.3088 -0.9350 -0.1745 +vn 0.2726 -0.9365 -0.2207 +vn 0.3293 -0.9250 -0.1895 +vn 0.2509 -0.9407 -0.2283 +vn 0.3485 -0.9083 -0.2316 +vn 0.2631 -0.9281 -0.2636 +vn 0.3816 -0.8793 -0.2850 +vn 0.2772 -0.9011 -0.3336 +vn 0.3550 -0.8850 -0.3014 +vn 0.2178 -0.9550 -0.2012 +vn 0.2278 -0.9421 -0.2460 +vn 0.2244 -0.9355 -0.2727 +vn 0.1679 -0.9461 -0.2770 +vn 0.1508 -0.9299 -0.3354 +vn 0.1295 -0.9681 -0.2147 +vn 0.1248 -0.9656 -0.2283 +vn 0.1401 -0.9415 -0.3065 +vn 0.1120 -0.9352 -0.3360 +vn 0.0937 -0.9309 -0.3531 +vn 0.0850 -0.9687 -0.2330 +vn 0.0369 -0.9708 -0.2372 +vn 0.0253 -0.9470 -0.3204 +vn 0.0158 -0.9360 -0.3516 +vn 0.0219 -0.9351 -0.3536 +vn 0.3564 -0.9277 -0.1114 +vn 0.3012 -0.8838 -0.3580 +vn 0.2954 -0.8953 -0.3336 +vn 0.3416 -0.9056 -0.2514 +vn 0.0229 -0.9202 -0.3908 +vn 0.3915 -0.8997 -0.1932 +vn 0.2594 -0.8870 -0.3820 +vn 0.4070 -0.8794 -0.2471 +vn 0.1681 -0.9024 -0.3968 +vn 0.4146 -0.8668 -0.2771 +vn 0.0828 -0.9176 -0.3888 +vn 0.3113 -0.8081 -0.5001 +vn 0.2520 -0.8426 -0.4759 +vn 0.3068 -0.7728 -0.5556 +vn 0.3246 -0.7635 -0.5583 +vn 0.2961 -0.7747 -0.5588 +vn 0.3203 -0.7654 -0.5582 +vn 0.3334 -0.6762 -0.6569 +vn 0.3381 -0.6789 -0.6517 +vn 0.3195 -0.6061 -0.7284 +vn 0.3073 -0.6097 -0.7307 +vn 0.1853 -0.8605 -0.4746 +vn 0.2346 -0.8058 -0.5438 +vn 0.2478 -0.7927 -0.5569 +vn 0.2914 -0.7042 -0.6475 +vn 0.3273 -0.5921 -0.7364 +vn 0.0985 -0.8835 -0.4579 +vn 0.1579 -0.8368 -0.5243 +vn 0.1986 -0.8069 -0.5563 +vn 0.2055 -0.7502 -0.6285 +vn 0.2760 -0.6048 -0.7470 +vn 0.0439 -0.8907 -0.4525 +vn 0.0493 -0.8665 -0.4968 +vn 0.1009 -0.8258 -0.5549 +vn 0.0874 -0.7701 -0.6319 +vn 0.1212 -0.6441 -0.7553 +vn 0.3300 -0.7960 -0.5075 +vn 0.3951 -0.4609 -0.7947 +vn 0.4522 -0.3949 -0.7997 +vn 0.3476 -0.5812 -0.7358 +vn 0.1545 -0.5224 -0.8386 +vn 0.2995 -0.7782 -0.5520 +vn 0.3419 -0.5107 -0.7888 +vn 0.3372 -0.7508 -0.5680 +vn 0.2813 -0.5265 -0.8023 +vn 0.3602 -0.6687 -0.6505 +vn 0.2205 -0.5182 -0.8264 +vn 0.3987 -0.4005 -0.8250 +vn 0.3315 -0.4260 -0.8418 +vn 0.3040 -0.3791 -0.8740 +vn 0.3474 -0.3932 -0.8513 +vn 0.2511 -0.3120 -0.9163 +vn 0.3363 -0.2714 -0.9018 +vn 0.2966 -0.2099 -0.9317 +vn 0.3068 -0.1971 -0.9312 +vn 0.3159 -0.0862 -0.9449 +vn 0.3991 -0.0127 -0.9168 +vn 0.2429 -0.4498 -0.8594 +vn 0.2041 -0.4181 -0.8852 +vn 0.2346 -0.3119 -0.9207 +vn 0.2564 -0.2238 -0.9403 +vn 0.1993 -0.1584 -0.9671 +vn 0.1945 -0.4426 -0.8754 +vn 0.1379 -0.4423 -0.8862 +vn 0.1759 -0.3411 -0.9234 +vn 0.1790 -0.2494 -0.9517 +vn 0.1565 -0.1687 -0.9732 +vn 0.2176 -0.4239 -0.8792 +vn 0.1825 -0.4018 -0.8974 +vn 0.0916 -0.3651 -0.9265 +vn 0.1002 -0.2714 -0.9572 +vn 0.1312 -0.1607 -0.9783 +vn 0.4193 -0.4068 -0.8116 +vn -0.0606 -0.4756 -0.8776 +vn -0.1297 -0.6010 -0.7886 +vn 0.3837 -0.0694 -0.9208 +vn 0.0633 -0.1238 -0.9903 +vn 0.3789 -0.4131 -0.8281 +vn 0.1460 -0.1781 -0.9731 +vn 0.4083 -0.2492 -0.8782 +vn 0.1814 -0.1054 -0.9777 +vn 0.3048 -0.2480 -0.9196 +vn 0.1344 -0.1263 -0.9828 +vn -0.0673 0.0040 0.9977 +vn -0.0255 -0.0750 0.9969 +vn -0.0232 -0.0687 0.9974 +vn -0.0709 0.0263 0.9971 +vn -0.8582 0.3372 0.3871 +vn -0.8242 0.3392 0.4534 +vn -0.8261 0.3287 0.4577 +vn -0.8598 0.3231 0.3955 +vn -0.2671 0.8348 0.4815 +vn -0.2009 0.8688 0.4527 +vn -0.2041 0.8617 0.4646 +vn -0.2760 0.8138 0.5115 +vn 0.3958 0.5501 0.7353 +vn 0.3151 0.5381 0.7818 +vn 0.3165 0.5746 0.7548 +vn 0.3990 0.5579 0.7277 +vn -0.7881 0.4376 0.4329 +vn -0.7929 0.4121 0.4488 +vn 0.1393 0.3395 0.9302 +vn 0.1422 0.3995 0.9056 +vn -0.6591 0.5911 0.4650 +vn -0.6642 0.5703 0.4834 +vn 0.0732 0.1494 0.9861 +vn 0.0711 0.1940 0.9784 +vn -0.4870 0.6543 0.5786 +vn -0.4796 0.6219 0.6191 +vn 0.0108 0.0520 0.9986 +vn 0.0051 0.0775 0.9970 +vn -0.9418 0.3103 0.1293 +vn -0.9527 0.2720 0.1355 +vn -0.9509 0.2778 0.1362 +vn -0.9428 0.3076 0.1285 +vn -0.9247 0.2324 0.3014 +vn -0.9278 0.2175 0.3032 +vn -0.9694 0.1896 0.1558 +vn -0.9678 0.1967 0.1572 +vn -0.9672 0.1355 0.2147 +vn -0.9677 0.1320 0.2146 +vn -0.9442 0.1881 0.2704 +vn -0.9460 0.1783 0.2707 +vn -0.8817 0.4688 0.0528 +vn -0.8896 0.4379 0.1296 +vn -0.8909 0.4362 0.1266 +vn -0.8832 0.4656 0.0560 +vn -0.9656 0.2580 0.0341 +vn -0.9658 0.2579 0.0281 +vn -0.8794 0.4541 0.1432 +vn -0.8764 0.4585 0.1472 +vn -0.9435 0.3311 -0.0141 +vn -0.9411 0.3381 -0.0103 +vn -0.9463 0.3225 -0.0209 +vn -0.9456 0.3247 -0.0202 +vn -0.0150 0.9969 -0.0774 +vn -0.1133 0.9903 -0.0806 +vn -0.1216 0.9891 -0.0833 +vn -0.0243 0.9965 -0.0803 +vn -0.5567 0.7978 0.2314 +vn -0.6950 0.7190 0.0031 +vn -0.6889 0.7246 0.0163 +vn -0.5911 0.7754 0.2223 +vn -0.5446 0.8237 0.1579 +vn -0.6172 0.7782 0.1158 +vn -0.8543 0.5163 0.0594 +vn -0.8531 0.5182 0.0612 +vn -0.1964 0.9784 -0.0641 +vn -0.2182 0.9733 -0.0712 +vn -0.7865 0.6099 0.0974 +vn -0.7840 0.6139 0.0916 +vn -0.3199 0.9470 -0.0296 +vn -0.3487 0.9364 -0.0390 +vn -0.8158 0.5621 0.1362 +vn -0.8152 0.5615 0.1416 +vn -0.4294 0.9024 0.0358 +vn -0.4737 0.8806 0.0124 +vn -0.8478 0.5267 0.0617 +vn -0.8462 0.5288 0.0655 +vn 0.4577 0.7283 0.5100 +vn 0.5536 0.5764 0.6010 +vn 0.5302 0.6084 0.5906 +vn 0.4323 0.7561 0.4914 +vn -0.3307 0.4434 0.8331 +vn -0.3498 0.5529 0.7562 +vn -0.3286 0.5392 0.7754 +vn -0.2878 0.4273 0.8571 +vn 0.8637 0.3183 0.3908 +vn 0.8366 0.4062 0.3677 +vn 0.8379 0.4038 0.3674 +vn 0.8593 0.3192 0.3997 +vn 0.0033 -0.0418 0.9991 +vn 0.0067 -0.0480 0.9988 +vn 0.6369 0.4024 0.6576 +vn 0.6205 0.4272 0.6576 +vn -0.0476 -0.0384 0.9981 +vn -0.0531 -0.0468 0.9975 +vn 0.6898 0.3345 0.6421 +vn 0.6891 0.3368 0.6416 +vn -0.1098 0.0346 0.9933 +vn -0.0532 0.0201 0.9984 +vn 0.7323 0.3896 0.5585 +vn 0.7306 0.3939 0.5577 +vn -0.2181 0.2336 0.9476 +vn -0.1715 0.2040 0.9638 +vn 0.8564 0.3522 0.3775 +vn 0.8525 0.3570 0.3817 +vn 0.9030 0.3918 0.1762 +vn 0.9259 0.3654 0.0956 +vn 0.9255 0.3665 0.0952 +vn 0.9004 0.3969 0.1785 +vn 0.8876 0.3408 0.3100 +vn 0.8874 0.3413 0.3099 +vn 0.8875 0.3997 0.2293 +vn 0.8890 0.3961 0.2296 +vn 0.8807 0.4354 0.1867 +vn 0.8800 0.4362 0.1880 +vn 0.9128 0.3934 0.1098 +vn 0.9129 0.3914 0.1160 +vn 0.7856 0.5623 0.2582 +vn 0.8371 0.5116 0.1938 +vn 0.8350 0.5146 0.1945 +vn 0.7887 0.5575 0.2591 +vn 0.9344 0.3521 0.0546 +vn 0.9329 0.3568 0.0481 +vn 0.9158 0.3940 0.0785 +vn 0.9183 0.3865 0.0852 +vn 0.8884 0.4406 0.1291 +vn 0.8927 0.4339 0.1219 +vn 0.7933 0.5886 0.1557 +vn 0.7918 0.5943 0.1409 +vn 0.6834 0.7295 0.0287 +vn 0.5433 0.7605 -0.3556 +vn 0.4960 0.7648 -0.4112 +vn 0.6782 0.7321 0.0632 +vn 0.4946 0.8586 -0.1345 +vn 0.4196 0.8757 -0.2388 +vn 0.1194 0.9907 -0.0658 +vn 0.1020 0.9919 -0.0762 +vn 0.6948 0.6929 0.1925 +vn 0.7003 0.6904 0.1816 +vn 0.4582 0.8867 -0.0623 +vn 0.4245 0.8992 -0.1061 +vn 0.6579 0.6824 0.3186 +vn 0.6647 0.6738 0.3227 +vn 0.3753 0.9260 -0.0409 +vn 0.3540 0.9330 -0.0641 +vn 0.6824 0.6813 0.2651 +vn 0.6733 0.6863 0.2752 +vn 0.2590 0.9646 -0.0494 +vn 0.2430 0.9680 -0.0631 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_14 +s 1 +f 9101/4551/11173 9102/4552/11174 9103/4553/11175 9104/4554/11176 +f 9105/4555/11177 9101/4551/11173 9104/4554/11176 9106/4556/11178 +f 9107/4557/11179 9105/4555/11177 9106/4556/11178 9108/4558/11180 +f 9109/4559/11181 9107/4557/11179 9108/4558/11180 9110/4560/11182 +f 9111/4561/11183 9112/4562/11184 9102/4552/11174 9101/4551/11173 +f 9113/4563/11185 9111/4561/11183 9101/4551/11173 9105/4555/11177 +f 9114/4564/11186 9113/4563/11185 9105/4555/11177 9107/4557/11179 +f 9115/4565/11187 9114/4564/11186 9107/4557/11179 9109/4559/11181 +f 9116/4566/11188 9117/4567/11189 9112/4562/11184 9111/4561/11183 +f 9118/4568/11190 9116/4566/11188 9111/4561/11183 9113/4563/11185 +f 9119/4569/11191 9118/4568/11190 9113/4563/11185 9114/4564/11186 +f 9120/4570/11192 9119/4569/11191 9114/4564/11186 9115/4565/11187 +f 9121/4571/11193 9122/4572/11194 9117/4567/11189 9116/4566/11188 +f 9123/4573/11195 9121/4571/11193 9116/4566/11188 9118/4568/11190 +f 9124/4574/11196 9123/4573/11195 9118/4568/11190 9119/4569/11191 +f 9125/4575/11197 9124/4574/11196 9119/4569/11191 9120/4570/11192 +f 9103/4553/11175 9126/4576/11198 9127/4577/11199 9128/4578/11200 +f 9129/4579/11201 9130/4580/11202 9131/4581/11203 9110/4560/11182 +f 9125/4575/11197 9132/4582/11204 9133/4583/11205 9134/4584/11206 +f 9135/4585/11207 9136/4586/11208 9137/4587/11209 9122/4572/11194 +f 9104/4554/11176 9103/4553/11175 9128/4578/11200 9138/4588/11210 +f 9110/4560/11182 9131/4581/11203 9139/4589/11211 9109/4559/11181 +f 9124/4574/11196 9125/4575/11197 9134/4584/11206 9140/4590/11212 +f 9122/4572/11194 9137/4587/11209 9141/4591/11213 9117/4567/11189 +f 9106/4556/11178 9104/4554/11176 9138/4588/11210 9142/4592/11214 +f 9109/4559/11181 9139/4589/11211 9143/4593/11215 9115/4565/11187 +f 9123/4573/11195 9124/4574/11196 9140/4590/11212 9144/4594/11216 +f 9117/4567/11189 9141/4591/11213 9145/4595/11217 9112/4562/11184 +f 9108/4558/11180 9106/4556/11178 9142/4592/11214 9146/4596/11218 +f 9115/4565/11187 9143/4593/11215 9147/4597/11219 9120/4570/11192 +f 9121/4571/11193 9123/4573/11195 9144/4594/11216 9148/4598/11220 +f 9112/4562/11184 9145/4595/11217 9149/4599/11221 9102/4552/11174 +f 9110/4560/11182 9108/4558/11180 9146/4596/11218 9129/4579/11201 +f 9120/4570/11192 9147/4597/11219 9132/4582/11204 9125/4575/11197 +f 9122/4572/11194 9121/4571/11193 9148/4598/11220 9135/4585/11207 +f 9102/4552/11174 9149/4599/11221 9126/4576/11198 9103/4553/11175 +f 9150/4600/11222 9151/4601/11223 9152/4602/11224 9153/4603/11225 +f 9154/4604/11226 9150/4600/11222 9153/4603/11225 9155/4605/11227 +f 9156/4606/11228 9154/4604/11226 9155/4605/11227 9157/4607/11229 +f 9158/4608/11230 9156/4606/11228 9157/4607/11229 9159/4609/11231 +f 9160/4610/11232 9161/4611/11233 9151/4601/11223 9150/4600/11222 +f 9162/4612/11234 9160/4610/11232 9150/4600/11222 9154/4604/11226 +f 9163/4613/11235 9162/4612/11234 9154/4604/11226 9156/4606/11228 +f 9164/4614/11236 9163/4613/11235 9156/4606/11228 9158/4608/11230 +f 9165/4615/11237 9166/4616/11238 9161/4611/11233 9160/4610/11232 +f 9167/4617/11239 9165/4615/11237 9160/4610/11232 9162/4612/11234 +f 9168/4618/11240 9167/4617/11239 9162/4612/11234 9163/4613/11235 +f 9169/4619/11241 9168/4618/11240 9163/4613/11235 9164/4614/11236 +f 9170/4620/11242 9171/4621/11243 9166/4616/11238 9165/4615/11237 +f 9172/4622/11244 9170/4620/11242 9165/4615/11237 9167/4617/11239 +f 9173/4623/11245 9172/4622/11244 9167/4617/11239 9168/4618/11240 +f 9174/4624/11246 9173/4623/11245 9168/4618/11240 9169/4619/11241 +f 9152/4602/11224 9131/4581/11203 9130/4580/11202 9175/4625/11247 +f 9176/4626/11248 9177/4627/11249 9178/4628/11250 9159/4609/11231 +f 9174/4624/11246 9179/4629/11251 9180/4630/11252 9181/4631/11253 +f 9182/4632/11254 9133/4583/11205 9132/4582/11204 9171/4621/11243 +f 9153/4603/11225 9152/4602/11224 9175/4625/11247 9183/4633/11255 +f 9159/4609/11231 9178/4628/11250 9184/4634/11256 9158/4608/11230 +f 9173/4623/11245 9174/4624/11246 9181/4631/11253 9185/4635/11257 +f 9171/4621/11243 9132/4582/11204 9147/4597/11219 9166/4616/11238 +f 9155/4605/11227 9153/4603/11225 9183/4633/11255 9186/4636/11258 +f 9158/4608/11230 9184/4634/11256 9187/4637/11259 9164/4614/11236 +f 9172/4622/11244 9173/4623/11245 9185/4635/11257 9188/4638/11260 +f 9166/4616/11238 9147/4597/11219 9143/4593/11215 9161/4611/11233 +f 9157/4607/11229 9155/4605/11227 9186/4636/11258 9189/4639/11261 +f 9164/4614/11236 9187/4637/11259 9190/4640/11262 9169/4619/11241 +f 9170/4620/11242 9172/4622/11244 9188/4638/11260 9191/4641/11263 +f 9161/4611/11233 9143/4593/11215 9139/4589/11211 9151/4601/11223 +f 9159/4609/11231 9157/4607/11229 9189/4639/11261 9176/4626/11248 +f 9169/4619/11241 9190/4640/11262 9179/4629/11251 9174/4624/11246 +f 9171/4621/11243 9170/4620/11242 9191/4641/11263 9182/4632/11254 +f 9151/4601/11223 9139/4589/11211 9131/4581/11203 9152/4602/11224 +f 9192/4642/11264 9193/4643/11265 9194/4644/11266 9195/4645/11267 +f 9196/4646/11268 9192/4642/11264 9195/4645/11267 9197/4647/11269 +f 9198/4648/11270 9196/4646/11268 9197/4647/11269 9199/4649/11271 +f 9200/4650/11272 9198/4648/11270 9199/4649/11271 9201/4651/11273 +f 9202/4652/11274 9203/4653/11275 9193/4643/11265 9192/4642/11264 +f 9204/4654/11276 9202/4652/11274 9192/4642/11264 9196/4646/11268 +f 9205/4655/11277 9204/4654/11276 9196/4646/11268 9198/4648/11270 +f 9206/4656/11278 9205/4655/11277 9198/4648/11270 9200/4650/11272 +f 9207/4657/11279 9208/4658/11280 9203/4653/11275 9202/4652/11274 +f 9209/4659/11281 9207/4657/11279 9202/4652/11274 9204/4654/11276 +f 9210/4660/11282 9209/4659/11281 9204/4654/11276 9205/4655/11277 +f 9211/4661/11283 9210/4660/11282 9205/4655/11277 9206/4656/11278 +f 9212/4662/11284 9213/4663/11285 9208/4658/11280 9207/4657/11279 +f 9214/4664/11286 9212/4662/11284 9207/4657/11279 9209/4659/11281 +f 9215/4665/11287 9214/4664/11286 9209/4659/11281 9210/4660/11282 +f 9216/4666/11288 9215/4665/11287 9210/4660/11282 9211/4661/11283 +f 9194/4644/11266 9178/4628/11250 9177/4627/11249 9217/4667/11289 +f 9218/4668/11290 9219/4669/11291 9220/4670/11292 9201/4651/11273 +f 9216/4666/11288 9221/4671/11293 9222/4672/11294 9223/4673/11295 +f 9224/4674/11296 9180/4630/11252 9179/4629/11251 9213/4663/11285 +f 9195/4645/11267 9194/4644/11266 9217/4667/11289 9225/4675/11297 +f 9201/4651/11273 9220/4670/11292 9226/4676/11298 9200/4650/11272 +f 9215/4665/11287 9216/4666/11288 9223/4673/11295 9227/4677/11299 +f 9213/4663/11285 9179/4629/11251 9190/4640/11262 9208/4658/11280 +f 9197/4647/11269 9195/4645/11267 9225/4675/11297 9228/4678/11300 +f 9200/4650/11272 9226/4676/11298 9229/4679/11301 9206/4656/11278 +f 9214/4664/11286 9215/4665/11287 9227/4677/11299 9230/4680/11302 +f 9208/4658/11280 9190/4640/11262 9187/4637/11259 9203/4653/11275 +f 9199/4649/11271 9197/4647/11269 9228/4678/11300 9231/4681/11303 +f 9206/4656/11278 9229/4679/11301 9232/4682/11304 9211/4661/11283 +f 9212/4662/11284 9214/4664/11286 9230/4680/11302 9233/4683/11305 +f 9203/4653/11275 9187/4637/11259 9184/4634/11256 9193/4643/11265 +f 9201/4651/11273 9199/4649/11271 9231/4681/11303 9218/4668/11290 +f 9211/4661/11283 9232/4682/11304 9221/4671/11293 9216/4666/11288 +f 9213/4663/11285 9212/4662/11284 9233/4683/11305 9224/4674/11296 +f 9193/4643/11265 9184/4634/11256 9178/4628/11250 9194/4644/11266 +f 9234/4684/11306 9235/4685/11307 9236/4686/11308 9237/4687/11309 +f 9238/4688/11310 9234/4684/11306 9237/4687/11309 9239/4689/11311 +f 9240/4690/11312 9238/4688/11310 9239/4689/11311 9241/4691/11313 +f 9242/4692/11314 9240/4690/11312 9241/4691/11313 9243/4693/11315 +f 9244/4694/11316 9245/4695/11317 9235/4685/11307 9234/4684/11306 +f 9246/4696/11318 9244/4694/11316 9234/4684/11306 9238/4688/11310 +f 9247/4697/11319 9246/4696/11318 9238/4688/11310 9240/4690/11312 +f 9248/4698/11320 9247/4697/11319 9240/4690/11312 9242/4692/11314 +f 9249/4699/11321 9250/4700/11322 9245/4695/11317 9244/4694/11316 +f 9251/4701/11323 9249/4699/11321 9244/4694/11316 9246/4696/11318 +f 9252/4702/11324 9251/4701/11323 9246/4696/11318 9247/4697/11319 +f 9253/4703/11325 9252/4702/11324 9247/4697/11319 9248/4698/11320 +f 9254/4704/11326 9255/4705/11327 9250/4700/11322 9249/4699/11321 +f 9256/4706/11328 9254/4704/11326 9249/4699/11321 9251/4701/11323 +f 9257/4707/11329 9256/4706/11328 9251/4701/11323 9252/4702/11324 +f 9258/4708/11330 9257/4707/11329 9252/4702/11324 9253/4703/11325 +f 9236/4686/11308 9220/4670/11292 9219/4669/11291 9259/4709/11331 +f 9260/4710/11332 9261/4711/11333 9262/4712/11334 9243/4693/11315 +f 9258/4708/11330 9263/4713/11335 9264/4714/11336 9265/4715/11337 +f 9266/4716/11338 9222/4672/11294 9221/4671/11293 9255/4705/11327 +f 9237/4687/11309 9236/4686/11308 9259/4709/11331 9267/4717/11339 +f 9243/4693/11315 9262/4712/11334 9268/4718/11340 9242/4692/11314 +f 9257/4707/11329 9258/4708/11330 9265/4715/11337 9269/4719/11341 +f 9255/4705/11327 9221/4671/11293 9232/4682/11304 9250/4700/11322 +f 9239/4689/11311 9237/4687/11309 9267/4717/11339 9270/4720/11342 +f 9242/4692/11314 9268/4718/11340 9271/4721/11343 9248/4698/11320 +f 9256/4706/11328 9257/4707/11329 9269/4719/11341 9272/4722/11344 +f 9250/4700/11322 9232/4682/11304 9229/4679/11301 9245/4695/11317 +f 9241/4691/11313 9239/4689/11311 9270/4720/11342 9273/4723/11345 +f 9248/4698/11320 9271/4721/11343 9274/4724/11346 9253/4703/11325 +f 9254/4704/11326 9256/4706/11328 9272/4722/11344 9275/4725/11347 +f 9245/4695/11317 9229/4679/11301 9226/4676/11298 9235/4685/11307 +f 9243/4693/11315 9241/4691/11313 9273/4723/11345 9260/4710/11332 +f 9253/4703/11325 9274/4724/11346 9263/4713/11335 9258/4708/11330 +f 9255/4705/11327 9254/4704/11326 9275/4725/11347 9266/4716/11338 +f 9235/4685/11307 9226/4676/11298 9220/4670/11292 9236/4686/11308 +f 9276/4726/11348 9277/4727/11349 9278/4728/11350 9279/4729/11351 +f 9280/4730/11352 9276/4726/11348 9279/4729/11351 9281/4731/11353 +f 9282/4732/11354 9280/4730/11352 9281/4731/11353 9283/4733/11355 +f 9284/4734/11356 9282/4732/11354 9283/4733/11355 9285/4735/11357 +f 9286/4736/11358 9287/4737/11359 9277/4727/11349 9276/4726/11348 +f 9288/4738/11360 9286/4736/11358 9276/4726/11348 9280/4730/11352 +f 9289/4739/11361 9288/4738/11360 9280/4730/11352 9282/4732/11354 +f 9290/4740/11362 9289/4739/11361 9282/4732/11354 9284/4734/11356 +f 9291/4741/11363 9292/4742/11364 9287/4737/11359 9286/4736/11358 +f 9293/4743/11365 9291/4741/11363 9286/4736/11358 9288/4738/11360 +f 9294/4744/11366 9293/4743/11365 9288/4738/11360 9289/4739/11361 +f 9295/4745/11367 9294/4744/11366 9289/4739/11361 9290/4740/11362 +f 9296/4746/11368 9297/4747/11369 9292/4742/11364 9291/4741/11363 +f 9298/4748/11370 9296/4746/11368 9291/4741/11363 9293/4743/11365 +f 9299/4749/11371 9298/4748/11370 9293/4743/11365 9294/4744/11366 +f 9300/4750/11372 9299/4749/11371 9294/4744/11366 9295/4745/11367 +f 9278/4728/11350 9301/4751/11373 9302/4752/11374 9303/4753/11375 +f 9304/4754/11376 9305/4755/11377 9306/4756/11378 9285/4735/11357 +f 9300/4750/11372 9307/4757/11379 9130/4580/11202 9129/4579/11201 +f 9128/4578/11200 9127/4577/11199 9308/4758/11380 9297/4747/11369 +f 9279/4729/11351 9278/4728/11350 9303/4753/11375 9309/4759/11381 +f 9285/4735/11357 9306/4756/11378 9310/4760/11382 9284/4734/11356 +f 9299/4749/11371 9300/4750/11372 9129/4579/11201 9146/4596/11218 +f 9297/4747/11369 9308/4758/11380 9311/4761/11383 9292/4742/11364 +f 9281/4731/11353 9279/4729/11351 9309/4759/11381 9312/4762/11384 +f 9284/4734/11356 9310/4760/11382 9313/4763/11385 9290/4740/11362 +f 9298/4748/11370 9299/4749/11371 9146/4596/11218 9142/4592/11214 +f 9292/4742/11364 9311/4761/11383 9314/4764/11386 9287/4737/11359 +f 9283/4733/11355 9281/4731/11353 9312/4762/11384 9315/4765/11387 +f 9290/4740/11362 9313/4763/11385 9316/4766/11388 9295/4745/11367 +f 9296/4746/11368 9298/4748/11370 9142/4592/11214 9138/4588/11210 +f 9287/4737/11359 9314/4764/11386 9317/4767/11389 9277/4727/11349 +f 9285/4735/11357 9283/4733/11355 9315/4765/11387 9304/4754/11376 +f 9295/4745/11367 9316/4766/11388 9307/4757/11379 9300/4750/11372 +f 9297/4747/11369 9296/4746/11368 9138/4588/11210 9128/4578/11200 +f 9277/4727/11349 9317/4767/11389 9301/4751/11373 9278/4728/11350 +f 9318/4768/11390 9319/4769/11391 9320/4770/11392 9321/4771/11393 +f 9322/4772/11394 9318/4768/11390 9321/4771/11393 9323/4773/11395 +f 9324/4774/11396 9322/4772/11394 9323/4773/11395 9325/4775/11397 +f 9326/4776/11398 9324/4774/11396 9325/4775/11397 9327/4777/11399 +f 9328/4778/11400 9329/4779/11401 9319/4769/11391 9318/4768/11390 +f 9330/4780/11402 9328/4778/11400 9318/4768/11390 9322/4772/11394 +f 9331/4781/11403 9330/4780/11402 9322/4772/11394 9324/4774/11396 +f 9332/4782/11404 9331/4781/11403 9324/4774/11396 9326/4776/11398 +f 9333/4783/11405 9334/4784/11406 9329/4779/11401 9328/4778/11400 +f 9335/4785/11407 9333/4783/11405 9328/4778/11400 9330/4780/11402 +f 9336/4786/11408 9335/4785/11407 9330/4780/11402 9331/4781/11403 +f 9337/4787/11409 9336/4786/11408 9331/4781/11403 9332/4782/11404 +f 9338/4788/11410 9339/4789/11411 9334/4784/11406 9333/4783/11405 +f 9340/4790/11412 9338/4788/11410 9333/4783/11405 9335/4785/11407 +f 9341/4791/11413 9340/4790/11412 9335/4785/11407 9336/4786/11408 +f 9342/4792/11414 9341/4791/11413 9336/4786/11408 9337/4787/11409 +f 9320/4770/11392 9306/4756/11378 9305/4755/11377 9343/4793/11415 +f 9344/4794/11416 9345/4795/11417 9346/4796/11418 9327/4777/11399 +f 9342/4792/11414 9347/4797/11419 9177/4627/11249 9176/4626/11248 +f 9175/4625/11247 9130/4580/11202 9307/4757/11379 9339/4789/11411 +f 9321/4771/11393 9320/4770/11392 9343/4793/11415 9348/4798/11420 +f 9327/4777/11399 9346/4796/11418 9349/4799/11421 9326/4776/11398 +f 9341/4791/11413 9342/4792/11414 9176/4626/11248 9189/4639/11261 +f 9339/4789/11411 9307/4757/11379 9316/4766/11388 9334/4784/11406 +f 9323/4773/11395 9321/4771/11393 9348/4798/11420 9350/4800/11422 +f 9326/4776/11398 9349/4799/11421 9351/4801/11423 9332/4782/11404 +f 9340/4790/11412 9341/4791/11413 9189/4639/11261 9186/4636/11258 +f 9334/4784/11406 9316/4766/11388 9313/4763/11385 9329/4779/11401 +f 9325/4775/11397 9323/4773/11395 9350/4800/11422 9352/4802/11424 +f 9332/4782/11404 9351/4801/11423 9353/4803/11425 9337/4787/11409 +f 9338/4788/11410 9340/4790/11412 9186/4636/11258 9183/4633/11255 +f 9329/4779/11401 9313/4763/11385 9310/4760/11382 9319/4769/11391 +f 9327/4777/11399 9325/4775/11397 9352/4802/11424 9344/4794/11416 +f 9337/4787/11409 9353/4803/11425 9347/4797/11419 9342/4792/11414 +f 9339/4789/11411 9338/4788/11410 9183/4633/11255 9175/4625/11247 +f 9319/4769/11391 9310/4760/11382 9306/4756/11378 9320/4770/11392 +f 9354/4804/11426 9355/4805/11427 9356/4806/11428 9357/4807/11429 +f 9358/4808/11430 9354/4804/11426 9357/4807/11429 9359/4809/11431 +f 9360/4810/11432 9358/4808/11430 9359/4809/11431 9361/4811/11433 +f 9362/4812/11434 9360/4810/11432 9361/4811/11433 9363/4813/11435 +f 9364/4814/11436 9365/4815/11437 9355/4805/11427 9354/4804/11426 +f 9366/4816/11438 9364/4814/11436 9354/4804/11426 9358/4808/11430 +f 9367/4817/11439 9366/4816/11438 9358/4808/11430 9360/4810/11432 +f 9368/4818/11440 9367/4817/11439 9360/4810/11432 9362/4812/11434 +f 9369/4819/11441 9370/4820/11442 9365/4815/11437 9364/4814/11436 +f 9371/4821/11443 9369/4819/11441 9364/4814/11436 9366/4816/11438 +f 9372/4822/11444 9371/4821/11443 9366/4816/11438 9367/4817/11439 +f 9373/4823/11445 9372/4822/11444 9367/4817/11439 9368/4818/11440 +f 9374/4824/11446 9375/4825/11447 9370/4820/11442 9369/4819/11441 +f 9376/4826/11448 9374/4824/11446 9369/4819/11441 9371/4821/11443 +f 9377/4827/11449 9376/4826/11448 9371/4821/11443 9372/4822/11444 +f 9378/4828/11450 9377/4827/11449 9372/4822/11444 9373/4823/11445 +f 9356/4806/11428 9346/4796/11418 9345/4795/11417 9379/4829/11451 +f 9380/4830/11452 9381/4831/11453 9382/4832/11454 9363/4813/11435 +f 9378/4828/11450 9383/4833/11455 9219/4669/11291 9218/4668/11290 +f 9217/4667/11289 9177/4627/11249 9347/4797/11419 9375/4825/11447 +f 9357/4807/11429 9356/4806/11428 9379/4829/11451 9384/4834/11456 +f 9363/4813/11435 9382/4832/11454 9385/4835/11457 9362/4812/11434 +f 9377/4827/11449 9378/4828/11450 9218/4668/11290 9231/4681/11303 +f 9375/4825/11447 9347/4797/11419 9353/4803/11425 9370/4820/11442 +f 9359/4809/11431 9357/4807/11429 9384/4834/11456 9386/4836/11458 +f 9362/4812/11434 9385/4835/11457 9387/4837/11459 9368/4818/11440 +f 9376/4826/11448 9377/4827/11449 9231/4681/11303 9228/4678/11300 +f 9370/4820/11442 9353/4803/11425 9351/4801/11423 9365/4815/11437 +f 9361/4811/11433 9359/4809/11431 9386/4836/11458 9388/4838/11460 +f 9368/4818/11440 9387/4837/11459 9389/4839/11461 9373/4823/11445 +f 9374/4824/11446 9376/4826/11448 9228/4678/11300 9225/4675/11297 +f 9365/4815/11437 9351/4801/11423 9349/4799/11421 9355/4805/11427 +f 9363/4813/11435 9361/4811/11433 9388/4838/11460 9380/4830/11452 +f 9373/4823/11445 9389/4839/11461 9383/4833/11455 9378/4828/11450 +f 9375/4825/11447 9374/4824/11446 9225/4675/11297 9217/4667/11289 +f 9355/4805/11427 9349/4799/11421 9346/4796/11418 9356/4806/11428 +f 9390/4840/11462 9391/4841/11463 9392/4842/11464 9393/4843/11465 +f 9394/4844/11466 9390/4840/11462 9393/4843/11465 9395/4845/11467 +f 9396/4846/11468 9394/4844/11466 9395/4845/11467 9397/4847/11469 +f 9398/4848/11470 9396/4846/11468 9397/4847/11469 9399/4849/11471 +f 9400/4850/11472 9401/4851/11473 9391/4841/11463 9390/4840/11462 +f 9402/4852/11474 9400/4850/11472 9390/4840/11462 9394/4844/11466 +f 9403/4853/11475 9402/4852/11474 9394/4844/11466 9396/4846/11468 +f 9404/4854/11476 9403/4853/11475 9396/4846/11468 9398/4848/11470 +f 9405/4855/11477 9406/4856/11478 9401/4851/11473 9400/4850/11472 +f 9407/4857/11479 9405/4855/11477 9400/4850/11472 9402/4852/11474 +f 9408/4858/11480 9407/4857/11479 9402/4852/11474 9403/4853/11475 +f 9409/4859/11481 9408/4858/11480 9403/4853/11475 9404/4854/11476 +f 9410/4860/11482 9411/4861/11483 9406/4856/11478 9405/4855/11477 +f 9412/4862/11484 9410/4860/11482 9405/4855/11477 9407/4857/11479 +f 9413/4863/11485 9412/4862/11484 9407/4857/11479 9408/4858/11480 +f 9414/4864/11486 9413/4863/11485 9408/4858/11480 9409/4859/11481 +f 9392/4842/11464 9382/4832/11454 9381/4831/11453 9415/4865/11487 +f 9416/4866/11488 9417/4867/11489 9418/4868/11490 9399/4849/11471 +f 9414/4864/11486 9419/4869/11491 9261/4711/11333 9260/4710/11332 +f 9259/4709/11331 9219/4669/11291 9383/4833/11455 9411/4861/11483 +f 9393/4843/11465 9392/4842/11464 9415/4865/11487 9420/4870/11492 +f 9399/4849/11471 9418/4868/11490 9421/4871/11493 9398/4848/11470 +f 9413/4863/11485 9414/4864/11486 9260/4710/11332 9273/4723/11345 +f 9411/4861/11483 9383/4833/11455 9389/4839/11461 9406/4856/11478 +f 9395/4845/11467 9393/4843/11465 9420/4870/11492 9422/4872/11494 +f 9398/4848/11470 9421/4871/11493 9423/4873/11495 9404/4854/11476 +f 9412/4862/11484 9413/4863/11485 9273/4723/11345 9270/4720/11342 +f 9406/4856/11478 9389/4839/11461 9387/4837/11459 9401/4851/11473 +f 9397/4847/11469 9395/4845/11467 9422/4872/11494 9424/4874/11496 +f 9404/4854/11476 9423/4873/11495 9425/4875/11497 9409/4859/11481 +f 9410/4860/11482 9412/4862/11484 9270/4720/11342 9267/4717/11339 +f 9401/4851/11473 9387/4837/11459 9385/4835/11457 9391/4841/11463 +f 9399/4849/11471 9397/4847/11469 9424/4874/11496 9416/4866/11488 +f 9409/4859/11481 9425/4875/11497 9419/4869/11491 9414/4864/11486 +f 9411/4861/11483 9410/4860/11482 9267/4717/11339 9259/4709/11331 +f 9391/4841/11463 9385/4835/11457 9382/4832/11454 9392/4842/11464 +f 9426/4553/11498 9427/4552/11499 9428/4551/11500 9429/4554/11501 +f 9429/4554/11501 9428/4551/11500 9430/4555/11502 9431/4556/11503 +f 9431/4556/11503 9430/4555/11502 9432/4557/11504 9433/4558/11505 +f 9433/4558/11505 9432/4557/11504 9434/4559/11506 9435/4560/11507 +f 9427/4552/11499 9436/4562/11508 9437/4561/11509 9428/4551/11500 +f 9428/4551/11500 9437/4561/11509 9438/4563/11510 9430/4555/11502 +f 9430/4555/11502 9438/4563/11510 9439/4564/11511 9432/4557/11504 +f 9432/4557/11504 9439/4564/11511 9440/4565/11512 9434/4559/11506 +f 9436/4562/11508 9441/4567/11513 9442/4566/11514 9437/4561/11509 +f 9437/4561/11509 9442/4566/11514 9443/4568/11515 9438/4563/11510 +f 9438/4563/11510 9443/4568/11515 9444/4569/11516 9439/4564/11511 +f 9439/4564/11511 9444/4569/11516 9445/4570/11517 9440/4565/11512 +f 9441/4567/11513 9446/4572/11518 9447/4571/11519 9442/4566/11514 +f 9442/4566/11514 9447/4571/11519 9448/4573/11520 9443/4568/11515 +f 9443/4568/11515 9448/4573/11520 9449/4574/11521 9444/4569/11516 +f 9444/4569/11516 9449/4574/11521 9450/4575/11522 9445/4570/11517 +f 9451/4577/11523 9452/4576/11524 9426/4553/11498 9453/4578/11525 +f 9454/4581/11526 9455/4580/11527 9456/4579/11528 9435/4560/11507 +f 9457/4583/11529 9458/4582/11530 9450/4575/11522 9459/4584/11531 +f 9460/4587/11532 9461/4586/11533 9462/4585/11534 9446/4572/11518 +f 9453/4578/11525 9426/4553/11498 9429/4554/11501 9463/4588/11535 +f 9464/4589/11536 9454/4581/11526 9435/4560/11507 9434/4559/11506 +f 9459/4584/11531 9450/4575/11522 9449/4574/11521 9465/4590/11537 +f 9466/4591/11538 9460/4587/11532 9446/4572/11518 9441/4567/11513 +f 9463/4588/11535 9429/4554/11501 9431/4556/11503 9467/4592/11539 +f 9468/4593/11540 9464/4589/11536 9434/4559/11506 9440/4565/11512 +f 9465/4590/11537 9449/4574/11521 9448/4573/11520 9469/4594/11541 +f 9470/4595/11542 9466/4591/11538 9441/4567/11513 9436/4562/11508 +f 9467/4592/11539 9431/4556/11503 9433/4558/11505 9471/4596/11543 +f 9472/4597/11544 9468/4593/11540 9440/4565/11512 9445/4570/11517 +f 9469/4594/11541 9448/4573/11520 9447/4571/11519 9473/4598/11545 +f 9474/4599/11546 9470/4595/11542 9436/4562/11508 9427/4552/11499 +f 9471/4596/11543 9433/4558/11505 9435/4560/11507 9456/4579/11528 +f 9458/4582/11530 9472/4597/11544 9445/4570/11517 9450/4575/11522 +f 9473/4598/11545 9447/4571/11519 9446/4572/11518 9462/4585/11534 +f 9452/4576/11524 9474/4599/11546 9427/4552/11499 9426/4553/11498 +f 9475/4602/11547 9476/4601/11548 9477/4600/11549 9478/4603/11550 +f 9478/4603/11550 9477/4600/11549 9479/4604/11551 9480/4605/11552 +f 9480/4605/11552 9479/4604/11551 9481/4606/11553 9482/4607/11554 +f 9482/4607/11554 9481/4606/11553 9483/4608/11555 9484/4609/11556 +f 9476/4601/11548 9485/4611/11557 9486/4610/11558 9477/4600/11549 +f 9477/4600/11549 9486/4610/11558 9487/4612/11559 9479/4604/11551 +f 9479/4604/11551 9487/4612/11559 9488/4613/11560 9481/4606/11553 +f 9481/4606/11553 9488/4613/11560 9489/4614/11561 9483/4608/11555 +f 9485/4611/11557 9490/4616/11562 9491/4615/11563 9486/4610/11558 +f 9486/4610/11558 9491/4615/11563 9492/4617/11564 9487/4612/11559 +f 9487/4612/11559 9492/4617/11564 9493/4618/11565 9488/4613/11560 +f 9488/4613/11560 9493/4618/11565 9494/4619/11566 9489/4614/11561 +f 9490/4616/11562 9495/4621/11567 9496/4620/11568 9491/4615/11563 +f 9491/4615/11563 9496/4620/11568 9497/4622/11569 9492/4617/11564 +f 9492/4617/11564 9497/4622/11569 9498/4623/11570 9493/4618/11565 +f 9493/4618/11565 9498/4623/11570 9499/4624/11571 9494/4619/11566 +f 9455/4580/11527 9454/4581/11526 9475/4602/11547 9500/4625/11572 +f 9501/4628/11573 9502/4627/11574 9503/4626/11575 9484/4609/11556 +f 9504/4630/11576 9505/4629/11577 9499/4624/11571 9506/4631/11578 +f 9458/4582/11530 9457/4583/11529 9507/4632/11579 9495/4621/11567 +f 9500/4625/11572 9475/4602/11547 9478/4603/11550 9508/4633/11580 +f 9509/4634/11581 9501/4628/11573 9484/4609/11556 9483/4608/11555 +f 9506/4631/11578 9499/4624/11571 9498/4623/11570 9510/4635/11582 +f 9472/4597/11544 9458/4582/11530 9495/4621/11567 9490/4616/11562 +f 9508/4633/11580 9478/4603/11550 9480/4605/11552 9511/4636/11583 +f 9512/4637/11584 9509/4634/11581 9483/4608/11555 9489/4614/11561 +f 9510/4635/11582 9498/4623/11570 9497/4622/11569 9513/4638/11585 +f 9468/4593/11540 9472/4597/11544 9490/4616/11562 9485/4611/11557 +f 9511/4636/11583 9480/4605/11552 9482/4607/11554 9514/4639/11586 +f 9515/4640/11587 9512/4637/11584 9489/4614/11561 9494/4619/11566 +f 9513/4638/11585 9497/4622/11569 9496/4620/11568 9516/4641/11588 +f 9464/4589/11536 9468/4593/11540 9485/4611/11557 9476/4601/11548 +f 9514/4639/11586 9482/4607/11554 9484/4609/11556 9503/4626/11575 +f 9505/4629/11577 9515/4640/11587 9494/4619/11566 9499/4624/11571 +f 9516/4641/11588 9496/4620/11568 9495/4621/11567 9507/4632/11579 +f 9454/4581/11526 9464/4589/11536 9476/4601/11548 9475/4602/11547 +f 9517/4644/11589 9518/4643/11590 9519/4642/11591 9520/4645/11592 +f 9520/4645/11592 9519/4642/11591 9521/4646/11593 9522/4647/11594 +f 9522/4647/11594 9521/4646/11593 9523/4648/11595 9524/4649/11596 +f 9524/4649/11596 9523/4648/11595 9525/4650/11597 9526/4651/11598 +f 9518/4643/11590 9527/4653/11599 9528/4652/11600 9519/4642/11591 +f 9519/4642/11591 9528/4652/11600 9529/4654/11601 9521/4646/11593 +f 9521/4646/11593 9529/4654/11601 9530/4655/11602 9523/4648/11595 +f 9523/4648/11595 9530/4655/11602 9531/4656/11603 9525/4650/11597 +f 9527/4653/11599 9532/4658/11604 9533/4657/11605 9528/4652/11600 +f 9528/4652/11600 9533/4657/11605 9534/4659/11606 9529/4654/11601 +f 9529/4654/11601 9534/4659/11606 9535/4660/11607 9530/4655/11602 +f 9530/4655/11602 9535/4660/11607 9536/4661/11608 9531/4656/11603 +f 9532/4658/11604 9537/4663/11609 9538/4662/11610 9533/4657/11605 +f 9533/4657/11605 9538/4662/11610 9539/4664/11611 9534/4659/11606 +f 9534/4659/11606 9539/4664/11611 9540/4665/11612 9535/4660/11607 +f 9535/4660/11607 9540/4665/11612 9541/4666/11613 9536/4661/11608 +f 9502/4627/11574 9501/4628/11573 9517/4644/11589 9542/4667/11614 +f 9543/4670/11615 9544/4669/11616 9545/4668/11617 9526/4651/11598 +f 9546/4672/11618 9547/4671/11619 9541/4666/11613 9548/4673/11620 +f 9505/4629/11577 9504/4630/11576 9549/4674/11621 9537/4663/11609 +f 9542/4667/11614 9517/4644/11589 9520/4645/11592 9550/4675/11622 +f 9551/4676/11623 9543/4670/11615 9526/4651/11598 9525/4650/11597 +f 9548/4673/11620 9541/4666/11613 9540/4665/11612 9552/4677/11624 +f 9515/4640/11587 9505/4629/11577 9537/4663/11609 9532/4658/11604 +f 9550/4675/11622 9520/4645/11592 9522/4647/11594 9553/4678/11625 +f 9554/4679/11626 9551/4676/11623 9525/4650/11597 9531/4656/11603 +f 9552/4677/11624 9540/4665/11612 9539/4664/11611 9555/4680/11627 +f 9512/4637/11584 9515/4640/11587 9532/4658/11604 9527/4653/11599 +f 9553/4678/11625 9522/4647/11594 9524/4649/11596 9556/4681/11628 +f 9557/4682/11629 9554/4679/11626 9531/4656/11603 9536/4661/11608 +f 9555/4680/11627 9539/4664/11611 9538/4662/11610 9558/4683/11630 +f 9509/4634/11581 9512/4637/11584 9527/4653/11599 9518/4643/11590 +f 9556/4681/11628 9524/4649/11596 9526/4651/11598 9545/4668/11617 +f 9547/4671/11619 9557/4682/11629 9536/4661/11608 9541/4666/11613 +f 9558/4683/11630 9538/4662/11610 9537/4663/11609 9549/4674/11621 +f 9501/4628/11573 9509/4634/11581 9518/4643/11590 9517/4644/11589 +f 9559/4686/11631 9560/4685/11632 9561/4684/11633 9562/4687/11634 +f 9562/4687/11634 9561/4684/11633 9563/4688/11635 9564/4689/11636 +f 9564/4689/11636 9563/4688/11635 9565/4690/11637 9566/4691/11638 +f 9566/4691/11638 9565/4690/11637 9567/4692/11639 9568/4693/11640 +f 9560/4685/11632 9569/4695/11641 9570/4694/11642 9561/4684/11633 +f 9561/4684/11633 9570/4694/11642 9571/4696/11643 9563/4688/11635 +f 9563/4688/11635 9571/4696/11643 9572/4697/11644 9565/4690/11637 +f 9565/4690/11637 9572/4697/11644 9573/4698/11645 9567/4692/11639 +f 9569/4695/11641 9574/4700/11646 9575/4699/11647 9570/4694/11642 +f 9570/4694/11642 9575/4699/11647 9576/4701/11648 9571/4696/11643 +f 9571/4696/11643 9576/4701/11648 9577/4702/11649 9572/4697/11644 +f 9572/4697/11644 9577/4702/11649 9578/4703/11650 9573/4698/11645 +f 9574/4700/11646 9579/4705/11651 9580/4704/11652 9575/4699/11647 +f 9575/4699/11647 9580/4704/11652 9581/4706/11653 9576/4701/11648 +f 9576/4701/11648 9581/4706/11653 9582/4707/11654 9577/4702/11649 +f 9577/4702/11649 9582/4707/11654 9583/4708/11655 9578/4703/11650 +f 9544/4669/11616 9543/4670/11615 9559/4686/11631 9584/4709/11656 +f 9585/4712/11657 9586/4711/11658 9587/4710/11659 9568/4693/11640 +f 9588/4714/11660 9589/4713/11661 9583/4708/11655 9590/4715/11662 +f 9547/4671/11619 9546/4672/11618 9591/4716/11663 9579/4705/11651 +f 9584/4709/11656 9559/4686/11631 9562/4687/11634 9592/4717/11664 +f 9593/4718/11665 9585/4712/11657 9568/4693/11640 9567/4692/11639 +f 9590/4715/11662 9583/4708/11655 9582/4707/11654 9594/4719/11666 +f 9557/4682/11629 9547/4671/11619 9579/4705/11651 9574/4700/11646 +f 9592/4717/11664 9562/4687/11634 9564/4689/11636 9595/4720/11667 +f 9596/4721/11668 9593/4718/11665 9567/4692/11639 9573/4698/11645 +f 9594/4719/11666 9582/4707/11654 9581/4706/11653 9597/4722/11669 +f 9554/4679/11626 9557/4682/11629 9574/4700/11646 9569/4695/11641 +f 9595/4720/11667 9564/4689/11636 9566/4691/11638 9598/4723/11670 +f 9599/4724/11671 9596/4721/11668 9573/4698/11645 9578/4703/11650 +f 9597/4722/11669 9581/4706/11653 9580/4704/11652 9600/4725/11672 +f 9551/4676/11623 9554/4679/11626 9569/4695/11641 9560/4685/11632 +f 9598/4723/11670 9566/4691/11638 9568/4693/11640 9587/4710/11659 +f 9589/4713/11661 9599/4724/11671 9578/4703/11650 9583/4708/11655 +f 9600/4725/11672 9580/4704/11652 9579/4705/11651 9591/4716/11663 +f 9543/4670/11615 9551/4676/11623 9560/4685/11632 9559/4686/11631 +f 9601/4728/11673 9602/4727/11674 9603/4726/11675 9604/4729/11676 +f 9604/4729/11676 9603/4726/11675 9605/4730/11677 9606/4731/11678 +f 9606/4731/11678 9605/4730/11677 9607/4732/11679 9608/4733/11680 +f 9608/4733/11680 9607/4732/11679 9609/4734/11681 9610/4735/11682 +f 9602/4727/11674 9611/4737/11683 9612/4736/11684 9603/4726/11675 +f 9603/4726/11675 9612/4736/11684 9613/4738/11685 9605/4730/11677 +f 9605/4730/11677 9613/4738/11685 9614/4739/11686 9607/4732/11679 +f 9607/4732/11679 9614/4739/11686 9615/4740/11687 9609/4734/11681 +f 9611/4737/11683 9616/4742/11688 9617/4741/11689 9612/4736/11684 +f 9612/4736/11684 9617/4741/11689 9618/4743/11690 9613/4738/11685 +f 9613/4738/11685 9618/4743/11690 9619/4744/11691 9614/4739/11686 +f 9614/4739/11686 9619/4744/11691 9620/4745/11692 9615/4740/11687 +f 9616/4742/11688 9621/4747/11693 9622/4746/11694 9617/4741/11689 +f 9617/4741/11689 9622/4746/11694 9623/4748/11695 9618/4743/11690 +f 9618/4743/11690 9623/4748/11695 9624/4749/11696 9619/4744/11691 +f 9619/4744/11691 9624/4749/11696 9625/4750/11697 9620/4745/11692 +f 9626/4752/11698 9627/4751/11699 9601/4728/11673 9628/4753/11700 +f 9629/4756/11701 9630/4755/11702 9631/4754/11703 9610/4735/11682 +f 9455/4580/11527 9632/4757/11704 9625/4750/11697 9456/4579/11528 +f 9633/4758/11705 9451/4577/11523 9453/4578/11525 9621/4747/11693 +f 9628/4753/11700 9601/4728/11673 9604/4729/11676 9634/4759/11706 +f 9635/4760/11707 9629/4756/11701 9610/4735/11682 9609/4734/11681 +f 9456/4579/11528 9625/4750/11697 9624/4749/11696 9471/4596/11543 +f 9636/4761/11708 9633/4758/11705 9621/4747/11693 9616/4742/11688 +f 9634/4759/11706 9604/4729/11676 9606/4731/11678 9637/4762/11709 +f 9638/4763/11710 9635/4760/11707 9609/4734/11681 9615/4740/11687 +f 9471/4596/11543 9624/4749/11696 9623/4748/11695 9467/4592/11539 +f 9639/4764/11711 9636/4761/11708 9616/4742/11688 9611/4737/11683 +f 9637/4762/11709 9606/4731/11678 9608/4733/11680 9640/4765/11712 +f 9641/4766/11713 9638/4763/11710 9615/4740/11687 9620/4745/11692 +f 9467/4592/11539 9623/4748/11695 9622/4746/11694 9463/4588/11535 +f 9642/4767/11714 9639/4764/11711 9611/4737/11683 9602/4727/11674 +f 9640/4765/11712 9608/4733/11680 9610/4735/11682 9631/4754/11703 +f 9632/4757/11704 9641/4766/11713 9620/4745/11692 9625/4750/11697 +f 9463/4588/11535 9622/4746/11694 9621/4747/11693 9453/4578/11525 +f 9627/4751/11699 9642/4767/11714 9602/4727/11674 9601/4728/11673 +f 9643/4770/11715 9644/4769/11716 9645/4768/11717 9646/4771/11718 +f 9646/4771/11718 9645/4768/11717 9647/4772/11719 9648/4773/11720 +f 9648/4773/11720 9647/4772/11719 9649/4774/11721 9650/4775/11722 +f 9650/4775/11722 9649/4774/11721 9651/4776/11723 9652/4777/11724 +f 9644/4769/11716 9653/4779/11725 9654/4778/11726 9645/4768/11717 +f 9645/4768/11717 9654/4778/11726 9655/4780/11727 9647/4772/11719 +f 9647/4772/11719 9655/4780/11727 9656/4781/11728 9649/4774/11721 +f 9649/4774/11721 9656/4781/11728 9657/4782/11729 9651/4776/11723 +f 9653/4779/11725 9658/4784/11730 9659/4783/11731 9654/4778/11726 +f 9654/4778/11726 9659/4783/11731 9660/4785/11732 9655/4780/11727 +f 9655/4780/11727 9660/4785/11732 9661/4786/11733 9656/4781/11728 +f 9656/4781/11728 9661/4786/11733 9662/4787/11734 9657/4782/11729 +f 9658/4784/11730 9663/4789/11735 9664/4788/11736 9659/4783/11731 +f 9659/4783/11731 9664/4788/11736 9665/4790/11737 9660/4785/11732 +f 9660/4785/11732 9665/4790/11737 9666/4791/11738 9661/4786/11733 +f 9661/4786/11733 9666/4791/11738 9667/4792/11739 9662/4787/11734 +f 9630/4755/11702 9629/4756/11701 9643/4770/11715 9668/4793/11740 +f 9669/4796/11741 9670/4795/11742 9671/4794/11743 9652/4777/11724 +f 9502/4627/11574 9672/4797/11744 9667/4792/11739 9503/4626/11575 +f 9632/4757/11704 9455/4580/11527 9500/4625/11572 9663/4789/11735 +f 9668/4793/11740 9643/4770/11715 9646/4771/11718 9673/4798/11745 +f 9674/4799/11746 9669/4796/11741 9652/4777/11724 9651/4776/11723 +f 9503/4626/11575 9667/4792/11739 9666/4791/11738 9514/4639/11586 +f 9641/4766/11713 9632/4757/11704 9663/4789/11735 9658/4784/11730 +f 9673/4798/11745 9646/4771/11718 9648/4773/11720 9675/4800/11747 +f 9676/4801/11748 9674/4799/11746 9651/4776/11723 9657/4782/11729 +f 9514/4639/11586 9666/4791/11738 9665/4790/11737 9511/4636/11583 +f 9638/4763/11710 9641/4766/11713 9658/4784/11730 9653/4779/11725 +f 9675/4800/11747 9648/4773/11720 9650/4775/11722 9677/4802/11749 +f 9678/4803/11750 9676/4801/11748 9657/4782/11729 9662/4787/11734 +f 9511/4636/11583 9665/4790/11737 9664/4788/11736 9508/4633/11580 +f 9635/4760/11707 9638/4763/11710 9653/4779/11725 9644/4769/11716 +f 9677/4802/11749 9650/4775/11722 9652/4777/11724 9671/4794/11743 +f 9672/4797/11744 9678/4803/11750 9662/4787/11734 9667/4792/11739 +f 9508/4633/11580 9664/4788/11736 9663/4789/11735 9500/4625/11572 +f 9629/4756/11701 9635/4760/11707 9644/4769/11716 9643/4770/11715 +f 9679/4806/11751 9680/4805/11752 9681/4804/11753 9682/4807/11754 +f 9682/4807/11754 9681/4804/11753 9683/4808/11755 9684/4809/11756 +f 9684/4809/11756 9683/4808/11755 9685/4810/11757 9686/4811/11758 +f 9686/4811/11758 9685/4810/11757 9687/4812/11759 9688/4813/11760 +f 9680/4805/11752 9689/4815/11761 9690/4814/11762 9681/4804/11753 +f 9681/4804/11753 9690/4814/11762 9691/4816/11763 9683/4808/11755 +f 9683/4808/11755 9691/4816/11763 9692/4817/11764 9685/4810/11757 +f 9685/4810/11757 9692/4817/11764 9693/4818/11765 9687/4812/11759 +f 9689/4815/11761 9694/4820/11766 9695/4819/11767 9690/4814/11762 +f 9690/4814/11762 9695/4819/11767 9696/4821/11768 9691/4816/11763 +f 9691/4816/11763 9696/4821/11768 9697/4822/11769 9692/4817/11764 +f 9692/4817/11764 9697/4822/11769 9698/4823/11770 9693/4818/11765 +f 9694/4820/11766 9699/4825/11771 9700/4824/11772 9695/4819/11767 +f 9695/4819/11767 9700/4824/11772 9701/4826/11773 9696/4821/11768 +f 9696/4821/11768 9701/4826/11773 9702/4827/11774 9697/4822/11769 +f 9697/4822/11769 9702/4827/11774 9703/4828/11775 9698/4823/11770 +f 9670/4795/11742 9669/4796/11741 9679/4806/11751 9704/4829/11776 +f 9705/4832/11777 9706/4831/11778 9707/4830/11779 9688/4813/11760 +f 9544/4669/11616 9708/4833/11780 9703/4828/11775 9545/4668/11617 +f 9672/4797/11744 9502/4627/11574 9542/4667/11614 9699/4825/11771 +f 9704/4829/11776 9679/4806/11751 9682/4807/11754 9709/4834/11781 +f 9710/4835/11782 9705/4832/11777 9688/4813/11760 9687/4812/11759 +f 9545/4668/11617 9703/4828/11775 9702/4827/11774 9556/4681/11628 +f 9678/4803/11750 9672/4797/11744 9699/4825/11771 9694/4820/11766 +f 9709/4834/11781 9682/4807/11754 9684/4809/11756 9711/4836/11783 +f 9712/4837/11784 9710/4835/11782 9687/4812/11759 9693/4818/11765 +f 9556/4681/11628 9702/4827/11774 9701/4826/11773 9553/4678/11625 +f 9676/4801/11748 9678/4803/11750 9694/4820/11766 9689/4815/11761 +f 9711/4836/11783 9684/4809/11756 9686/4811/11758 9713/4838/11785 +f 9714/4839/11786 9712/4837/11784 9693/4818/11765 9698/4823/11770 +f 9553/4678/11625 9701/4826/11773 9700/4824/11772 9550/4675/11622 +f 9674/4799/11746 9676/4801/11748 9689/4815/11761 9680/4805/11752 +f 9713/4838/11785 9686/4811/11758 9688/4813/11760 9707/4830/11779 +f 9708/4833/11780 9714/4839/11786 9698/4823/11770 9703/4828/11775 +f 9550/4675/11622 9700/4824/11772 9699/4825/11771 9542/4667/11614 +f 9669/4796/11741 9674/4799/11746 9680/4805/11752 9679/4806/11751 +f 9715/4842/11787 9716/4841/11788 9717/4840/11789 9718/4843/11790 +f 9718/4843/11790 9717/4840/11789 9719/4844/11791 9720/4845/11792 +f 9720/4845/11792 9719/4844/11791 9721/4846/11793 9722/4847/11794 +f 9722/4847/11794 9721/4846/11793 9723/4848/11795 9724/4849/11796 +f 9716/4841/11788 9725/4851/11797 9726/4850/11798 9717/4840/11789 +f 9717/4840/11789 9726/4850/11798 9727/4852/11799 9719/4844/11791 +f 9719/4844/11791 9727/4852/11799 9728/4853/11800 9721/4846/11793 +f 9721/4846/11793 9728/4853/11800 9729/4854/11801 9723/4848/11795 +f 9725/4851/11797 9730/4856/11802 9731/4855/11803 9726/4850/11798 +f 9726/4850/11798 9731/4855/11803 9732/4857/11804 9727/4852/11799 +f 9727/4852/11799 9732/4857/11804 9733/4858/11805 9728/4853/11800 +f 9728/4853/11800 9733/4858/11805 9734/4859/11806 9729/4854/11801 +f 9730/4856/11802 9735/4861/11807 9736/4860/11808 9731/4855/11803 +f 9731/4855/11803 9736/4860/11808 9737/4862/11809 9732/4857/11804 +f 9732/4857/11804 9737/4862/11809 9738/4863/11810 9733/4858/11805 +f 9733/4858/11805 9738/4863/11810 9739/4864/11811 9734/4859/11806 +f 9706/4831/11778 9705/4832/11777 9715/4842/11787 9740/4865/11812 +f 9741/4868/11813 9742/4867/11814 9743/4866/11815 9724/4849/11796 +f 9586/4711/11658 9744/4869/11816 9739/4864/11811 9587/4710/11659 +f 9708/4833/11780 9544/4669/11616 9584/4709/11656 9735/4861/11807 +f 9740/4865/11812 9715/4842/11787 9718/4843/11790 9745/4870/11817 +f 9746/4871/11818 9741/4868/11813 9724/4849/11796 9723/4848/11795 +f 9587/4710/11659 9739/4864/11811 9738/4863/11810 9598/4723/11670 +f 9714/4839/11786 9708/4833/11780 9735/4861/11807 9730/4856/11802 +f 9745/4870/11817 9718/4843/11790 9720/4845/11792 9747/4872/11819 +f 9748/4873/11820 9746/4871/11818 9723/4848/11795 9729/4854/11801 +f 9598/4723/11670 9738/4863/11810 9737/4862/11809 9595/4720/11667 +f 9712/4837/11784 9714/4839/11786 9730/4856/11802 9725/4851/11797 +f 9747/4872/11819 9720/4845/11792 9722/4847/11794 9749/4874/11821 +f 9750/4875/11822 9748/4873/11820 9729/4854/11801 9734/4859/11806 +f 9595/4720/11667 9737/4862/11809 9736/4860/11808 9592/4717/11664 +f 9710/4835/11782 9712/4837/11784 9725/4851/11797 9716/4841/11788 +f 9749/4874/11821 9722/4847/11794 9724/4849/11796 9743/4866/11815 +f 9744/4869/11816 9750/4875/11822 9734/4859/11806 9739/4864/11811 +f 9592/4717/11664 9736/4860/11808 9735/4861/11807 9584/4709/11656 +f 9705/4832/11777 9710/4835/11782 9716/4841/11788 9715/4842/11787 +s 2 +f 9452/4576/11823 9451/4577/11824 9127/4577/11825 9126/4576/11826 +s 4 +f 9457/4583/11827 9459/4584/11828 9134/4584/11829 9133/4583/11830 +f 9462/4585/11831 9461/4586/11832 9136/4586/11833 9135/4585/11834 +s 2 +f 9461/4586/11835 9460/4587/11836 9137/4587/11837 9136/4586/11838 +s 4 +f 9459/4584/11828 9465/4590/11839 9140/4590/11840 9134/4584/11829 +s 2 +f 9460/4587/11836 9466/4591/11841 9141/4591/11842 9137/4587/11837 +s 4 +f 9465/4590/11839 9469/4594/11843 9144/4594/11844 9140/4590/11840 +s 2 +f 9466/4591/11841 9470/4595/11845 9145/4595/11846 9141/4591/11842 +s 4 +f 9469/4594/11843 9473/4598/11847 9148/4598/11848 9144/4594/11844 +s 2 +f 9470/4595/11845 9474/4599/11849 9149/4599/11850 9145/4595/11846 +s 4 +f 9473/4598/11847 9462/4585/11831 9135/4585/11834 9148/4598/11848 +s 2 +f 9474/4599/11849 9452/4576/11823 9126/4576/11826 9149/4599/11850 +s 4 +f 9504/4630/11851 9506/4631/11852 9181/4631/11853 9180/4630/11854 +f 9507/4632/11855 9457/4583/11827 9133/4583/11830 9182/4632/11856 +f 9506/4631/11852 9510/4635/11857 9185/4635/11858 9181/4631/11853 +f 9510/4635/11857 9513/4638/11859 9188/4638/11860 9185/4635/11858 +f 9513/4638/11859 9516/4641/11861 9191/4641/11862 9188/4638/11860 +f 9516/4641/11861 9507/4632/11855 9182/4632/11856 9191/4641/11862 +f 9546/4672/11863 9548/4673/11864 9223/4673/11865 9222/4672/11866 +f 9549/4674/11867 9504/4630/11851 9180/4630/11854 9224/4674/11868 +f 9548/4673/11864 9552/4677/11869 9227/4677/11870 9223/4673/11865 +f 9552/4677/11869 9555/4680/11871 9230/4680/11872 9227/4677/11870 +f 9555/4680/11871 9558/4683/11873 9233/4683/11874 9230/4680/11872 +f 9558/4683/11873 9549/4674/11867 9224/4674/11868 9233/4683/11874 +f 9586/4711/11875 9585/4712/11876 9262/4712/11877 9261/4711/11878 +f 9588/4714/11879 9590/4715/11880 9265/4715/11881 9264/4714/11882 +f 9589/4713/11883 9588/4714/11879 9264/4714/11882 9263/4713/11884 +f 9591/4716/11885 9546/4672/11863 9222/4672/11866 9266/4716/11886 +f 9585/4712/11876 9593/4718/11887 9268/4718/11888 9262/4712/11877 +f 9590/4715/11880 9594/4719/11889 9269/4719/11890 9265/4715/11881 +f 9593/4718/11887 9596/4721/11891 9271/4721/11892 9268/4718/11888 +f 9594/4719/11889 9597/4722/11893 9272/4722/11894 9269/4719/11890 +f 9596/4721/11891 9599/4724/11895 9274/4724/11896 9271/4721/11892 +f 9597/4722/11893 9600/4725/11897 9275/4725/11898 9272/4722/11894 +f 9599/4724/11895 9589/4713/11883 9263/4713/11884 9274/4724/11896 +f 9600/4725/11897 9591/4716/11885 9266/4716/11886 9275/4725/11898 +f 9626/4752/11899 9628/4753/11900 9303/4753/11901 9302/4752/11902 +s 2 +f 9627/4751/11903 9626/4752/11904 9302/4752/11905 9301/4751/11906 +s 4 +f 9631/4754/11907 9630/4755/11908 9305/4755/11909 9304/4754/11910 +s 2 +f 9451/4577/11824 9633/4758/11911 9308/4758/11912 9127/4577/11825 +s 4 +f 9628/4753/11900 9634/4759/11913 9309/4759/11914 9303/4753/11901 +s 2 +f 9633/4758/11911 9636/4761/11915 9311/4761/11916 9308/4758/11912 +s 4 +f 9634/4759/11913 9637/4762/11917 9312/4762/11918 9309/4759/11914 +s 2 +f 9636/4761/11915 9639/4764/11919 9314/4764/11920 9311/4761/11916 +s 4 +f 9637/4762/11917 9640/4765/11921 9315/4765/11922 9312/4762/11918 +s 2 +f 9639/4764/11919 9642/4767/11923 9317/4767/11924 9314/4764/11920 +s 4 +f 9640/4765/11921 9631/4754/11907 9304/4754/11910 9315/4765/11922 +s 2 +f 9642/4767/11923 9627/4751/11903 9301/4751/11906 9317/4767/11924 +s 4 +f 9630/4755/11908 9668/4793/11925 9343/4793/11926 9305/4755/11909 +f 9671/4794/11927 9670/4795/11928 9345/4795/11929 9344/4794/11930 +f 9668/4793/11925 9673/4798/11931 9348/4798/11932 9343/4793/11926 +f 9673/4798/11931 9675/4800/11933 9350/4800/11934 9348/4798/11932 +f 9675/4800/11933 9677/4802/11935 9352/4802/11936 9350/4800/11934 +f 9677/4802/11935 9671/4794/11927 9344/4794/11930 9352/4802/11936 +f 9670/4795/11928 9704/4829/11937 9379/4829/11938 9345/4795/11929 +f 9707/4830/11939 9706/4831/11940 9381/4831/11941 9380/4830/11942 +f 9704/4829/11937 9709/4834/11943 9384/4834/11944 9379/4829/11938 +f 9709/4834/11943 9711/4836/11945 9386/4836/11946 9384/4834/11944 +f 9711/4836/11945 9713/4838/11947 9388/4838/11948 9386/4836/11946 +f 9713/4838/11947 9707/4830/11939 9380/4830/11942 9388/4838/11948 +f 9706/4831/11940 9740/4865/11949 9415/4865/11950 9381/4831/11941 +f 9743/4866/11951 9742/4867/11952 9417/4867/11953 9416/4866/11954 +f 9742/4867/11952 9741/4868/11955 9418/4868/11956 9417/4867/11953 +f 9744/4869/11957 9586/4711/11875 9261/4711/11878 9419/4869/11958 +f 9740/4865/11949 9745/4870/11959 9420/4870/11960 9415/4865/11950 +f 9741/4868/11955 9746/4871/11961 9421/4871/11962 9418/4868/11956 +f 9745/4870/11959 9747/4872/11963 9422/4872/11964 9420/4870/11960 +f 9746/4871/11961 9748/4873/11965 9423/4873/11966 9421/4871/11962 +f 9747/4872/11963 9749/4874/11967 9424/4874/11968 9422/4872/11964 +f 9748/4873/11965 9750/4875/11969 9425/4875/11970 9423/4873/11966 +f 9749/4874/11967 9743/4866/11951 9416/4866/11954 9424/4874/11968 +f 9750/4875/11969 9744/4869/11957 9419/4869/11958 9425/4875/11970 +# 648 polygons + +# +# object lotu_petal_15 +# + +v -0.4725 0.3250 0.0079 +v -0.4344 0.2836 0.0050 +v -0.4076 0.2743 -0.0473 +v -0.4378 0.3159 -0.0540 +v -0.5109 0.3662 0.0099 +v -0.4751 0.3596 -0.0606 +v -0.5563 0.4145 0.0133 +v -0.5167 0.4106 -0.0652 +v -0.6037 0.4705 0.0095 +v -0.5637 0.4670 -0.0761 +v -0.4911 0.3329 0.0742 +v -0.4521 0.2957 0.0611 +v -0.5375 0.3724 0.0837 +v -0.5831 0.4239 0.0928 +v -0.6342 0.4818 0.0946 +v -0.5060 0.3508 0.1411 +v -0.4575 0.3135 0.1202 +v -0.5562 0.3924 0.1592 +v -0.6050 0.4429 0.1723 +v -0.6531 0.4978 0.1785 +v -0.5216 0.3694 0.2078 +v -0.4725 0.3340 0.1791 +v -0.5705 0.4121 0.2346 +v -0.6195 0.4623 0.2532 +v -0.6691 0.5167 0.2633 +v -0.3784 0.2401 -0.0452 +v -0.3519 0.2360 -0.0877 +v -0.3799 0.2716 -0.0976 +v -0.5202 0.4760 -0.1587 +v -0.5690 0.5405 -0.1822 +v -0.6062 0.5354 -0.0945 +v -0.7161 0.5769 0.2619 +v -0.7295 0.6105 0.3513 +v -0.6797 0.5456 0.3496 +v -0.4734 0.3549 0.2386 +v -0.4223 0.3255 0.1963 +v -0.4200 0.3076 0.1443 +v -0.4064 0.3120 -0.1091 +v -0.6447 0.5305 -0.0032 +v -0.6279 0.4877 0.3329 +v -0.4197 0.2840 0.0943 +v -0.4388 0.3629 -0.1244 +v -0.6779 0.5418 0.0873 +v -0.5743 0.4376 0.3072 +v -0.4160 0.2654 0.0470 +v -0.4798 0.4195 -0.1429 +v -0.6972 0.5583 0.1758 +v -0.5249 0.3887 0.2743 +v -0.4004 0.2514 -0.0002 +v -0.7347 0.6678 -0.0542 +v -0.6968 0.5964 -0.0247 +v -0.6556 0.6001 -0.1163 +v -0.7045 0.6747 -0.1462 +v -0.7838 0.7488 -0.0713 +v -0.7422 0.7570 -0.1757 +v -0.8238 0.8399 -0.0780 +v -0.7802 0.8508 -0.1848 +v -0.8603 0.9477 -0.0985 +v -0.8285 0.9544 -0.1972 +v -0.7649 0.6727 0.0395 +v -0.7254 0.6050 0.0682 +v -0.8065 0.7577 0.0322 +v -0.8510 0.8524 0.0270 +v -0.8905 0.9635 0.0063 +v -0.7944 0.6859 0.1437 +v -0.7407 0.6159 0.1580 +v -0.8468 0.7674 0.1414 +v -0.8917 0.8630 0.1354 +v -0.9246 0.9705 0.1161 +v -0.8167 0.7110 0.2491 +v -0.7658 0.6405 0.2485 +v -0.8731 0.7940 0.2485 +v -0.9211 0.8859 0.2431 +v -0.9487 0.9869 0.2245 +v -0.6136 0.6109 -0.2066 +v -0.7825 0.9592 -0.3009 +v -0.8186 1.0765 -0.3101 +v -0.8577 1.0744 -0.2132 +v -0.9660 1.1038 0.2045 +v -0.9816 1.1220 0.3159 +v -0.9702 1.0129 0.3361 +v -0.7766 0.6756 0.3394 +v -0.6568 0.6831 -0.2377 +v -0.8953 1.0717 -0.1106 +v -0.9415 0.9146 0.3508 +v -0.6957 0.7619 -0.2690 +v -0.9297 1.0804 -0.0053 +v -0.8931 0.8272 0.3541 +v -0.7421 0.8574 -0.2882 +v -0.9471 1.0899 0.0979 +v -0.8309 0.7444 0.3497 +v -0.9709 1.3731 -0.1739 +v -0.9307 1.2107 -0.1440 +v -0.8950 1.2130 -0.2449 +v -0.9289 1.3784 -0.2732 +v -0.9899 1.5481 -0.2165 +v -0.9571 1.5533 -0.3111 +v -0.9837 1.7300 -0.2504 +v -0.9539 1.7346 -0.3356 +v -0.9920 1.9034 -0.2709 +v -0.9549 1.9048 -0.3546 +v -1.0091 1.3781 -0.0746 +v -0.9629 1.2151 -0.0410 +v -1.0228 1.5555 -0.1162 +v -1.0186 1.7308 -0.1594 +v -1.0244 1.8950 -0.1844 +v -1.0345 1.3903 0.0270 +v -0.9900 1.2276 0.0653 +v -1.0395 1.5604 -0.0156 +v -1.0375 1.7360 -0.0651 +v -1.0311 1.9023 -0.0942 +v -1.0441 1.4032 0.1322 +v -1.0109 1.2401 0.1706 +v -1.0475 1.5747 0.0840 +v -1.0497 1.7464 0.0311 +v -1.0321 1.9059 -0.0020 +v -0.8607 1.2184 -0.3392 +v -0.9152 1.8973 -0.4324 +v -0.9096 2.0495 -0.4405 +v -0.9454 2.0551 -0.3676 +v -1.0203 2.0454 -0.0504 +v -1.0248 2.0466 0.0378 +v -1.0296 1.9099 0.0904 +v -1.0164 1.2559 0.2791 +v -0.8897 1.3759 -0.3692 +v -0.9738 2.0548 -0.2933 +v -1.0404 1.7550 0.1277 +v -0.9138 1.5501 -0.4018 +v -0.9952 2.0439 -0.2161 +v -1.0475 1.5822 0.1840 +v -0.9172 1.7269 -0.4165 +v -1.0100 2.0456 -0.1347 +v -1.0422 1.4087 0.2392 +v -0.9327 2.3040 -0.3414 +v -0.9640 2.1839 -0.3182 +v -0.9419 2.1860 -0.3866 +v -0.9164 2.3081 -0.3987 +v -0.8824 2.4119 -0.3665 +v -0.8683 2.4125 -0.4161 +v -0.8276 2.5047 -0.3724 +v -0.8169 2.5087 -0.4091 +v -0.7780 2.5880 -0.3624 +v -0.7649 2.5919 -0.3889 +v -0.9391 2.2965 -0.2810 +v -0.9753 2.1750 -0.2502 +v -0.8948 2.4037 -0.3120 +v -0.8383 2.5036 -0.3303 +v -0.7882 2.5861 -0.3334 +v -0.9482 2.2914 -0.2181 +v -0.9877 2.1704 -0.1788 +v -0.8997 2.3980 -0.2565 +v -0.8472 2.4920 -0.2877 +v -0.7948 2.5792 -0.3059 +v -0.9434 2.2811 -0.1527 +v -0.9890 2.1655 -0.1026 +v -0.9000 2.3870 -0.2006 +v -0.8530 2.4794 -0.2491 +v -0.8055 2.5660 -0.2825 +v -0.8956 2.1808 -0.4555 +v -0.7573 2.5929 -0.4083 +v -0.7130 2.6664 -0.3797 +v -0.7182 2.6642 -0.3683 +v -0.7552 2.6373 -0.3246 +v -0.7669 2.6220 -0.3171 +v -0.8140 2.5506 -0.2619 +v -0.9915 2.1686 -0.0209 +v -0.8830 2.3014 -0.4512 +v -0.7249 2.6613 -0.3574 +v -0.8604 2.4627 -0.2154 +v -0.8514 2.4126 -0.4587 +v -0.7327 2.6556 -0.3464 +v -0.9024 2.3721 -0.1460 +v -0.8089 2.5084 -0.4373 +v -0.7428 2.6479 -0.3352 +v -0.9425 2.2729 -0.0837 +v -0.2593 0.3418 -0.3474 +v -0.2470 0.3028 -0.3030 +v -0.2021 0.3167 -0.3534 +v -0.2135 0.3570 -0.4064 +v -0.2792 0.3881 -0.3885 +v -0.2339 0.4018 -0.4538 +v -0.3050 0.4437 -0.4306 +v -0.2611 0.4482 -0.5001 +v -0.3415 0.4970 -0.4726 +v -0.2834 0.4995 -0.5486 +v -0.3055 0.3267 -0.2879 +v -0.2855 0.2840 -0.2497 +v -0.3251 0.3765 -0.3263 +v -0.3525 0.4304 -0.3605 +v -0.3890 0.4925 -0.4002 +v -0.3414 0.3201 -0.2274 +v -0.3225 0.2749 -0.1994 +v -0.3695 0.3671 -0.2580 +v -0.4005 0.4252 -0.2912 +v -0.4369 0.4887 -0.3217 +v -0.3778 0.3131 -0.1667 +v -0.3516 0.2705 -0.1477 +v -0.4048 0.3647 -0.1878 +v -0.4414 0.4229 -0.2171 +v -0.4836 0.4829 -0.2419 +v -0.2019 0.2836 -0.2908 +v -0.1563 0.3035 -0.3253 +v -0.1547 0.3401 -0.3937 +v -0.2068 0.5118 -0.6243 +v -0.2282 0.5630 -0.6788 +v -0.3053 0.5567 -0.5964 +v -0.5280 0.5493 -0.2638 +v -0.3244 0.2373 -0.1281 +v -0.1667 0.3763 -0.4550 +v -0.3762 0.5532 -0.5185 +v -0.3004 0.2403 -0.1681 +v -0.1853 0.4128 -0.5160 +v -0.4302 0.5537 -0.4317 +v -0.2729 0.2463 -0.2092 +v -0.1965 0.4638 -0.5688 +v -0.4758 0.5511 -0.3491 +v -0.2376 0.2638 -0.2514 +v -0.4411 0.6813 -0.5995 +v -0.4019 0.6137 -0.5571 +v -0.3373 0.6143 -0.6463 +v -0.3747 0.6813 -0.6859 +v -0.4780 0.7615 -0.6317 +v -0.4076 0.7626 -0.7172 +v -0.5210 0.8537 -0.6614 +v -0.4510 0.8466 -0.7356 +v -0.5626 0.9567 -0.6845 +v -0.4866 0.9486 -0.7676 +v -0.5071 0.6803 -0.5104 +v -0.4716 0.6156 -0.4718 +v -0.5411 0.7626 -0.5440 +v -0.5847 0.8543 -0.5747 +v -0.6358 0.9622 -0.5932 +v -0.5661 0.6902 -0.4213 +v -0.5183 0.6185 -0.3831 +v -0.5983 0.7702 -0.4525 +v -0.6453 0.8605 -0.4812 +v -0.6900 0.9615 -0.4986 +v -0.6131 0.6873 -0.3310 +v -0.5702 0.6170 -0.2986 +v -0.6539 0.7669 -0.3606 +v -0.6999 0.8592 -0.3855 +v -0.7334 0.9580 -0.4024 +v -0.2612 0.6190 -0.7301 +v -0.3983 0.9637 -0.8453 +v -0.4352 1.0769 -0.8863 +v -0.5136 1.0651 -0.7983 +v -0.7746 1.0736 -0.4114 +v -0.2911 0.6914 -0.7671 +v -0.6004 1.0740 -0.7116 +v -0.3249 0.7759 -0.8005 +v -0.6646 1.0784 -0.6156 +v -0.3632 0.8626 -0.8223 +v -0.7235 1.0773 -0.5179 +v -0.6726 1.3739 -0.7419 +v -0.6294 1.2118 -0.7286 +v -0.5659 1.2060 -0.8147 +v -0.6016 1.3692 -0.8354 +v -0.7069 1.5500 -0.7570 +v -0.6286 1.5443 -0.8483 +v -0.7150 1.7298 -0.7502 +v -0.6359 1.7192 -0.8335 +v -0.7305 1.8988 -0.7358 +v -0.6550 1.8849 -0.7988 +v -0.7343 1.3808 -0.6434 +v -0.6947 1.2170 -0.6317 +v -0.7671 1.5551 -0.6730 +v -0.7885 1.7325 -0.6664 +v -0.7907 1.9012 -0.6611 +v -0.7939 1.3815 -0.5498 +v -0.7516 1.2193 -0.5275 +v -0.8215 1.5554 -0.5802 +v -0.8427 1.7329 -0.5821 +v -0.8459 1.9031 -0.5844 +v -0.8488 1.3712 -0.4552 +v -0.8054 1.2108 -0.4285 +v -0.8683 1.5472 -0.4882 +v -0.8811 1.7275 -0.4989 +v -0.8853 1.8990 -0.5070 +v -0.4807 1.2125 -0.9078 +v -0.5830 1.8783 -0.8583 +v -0.6079 2.0204 -0.8067 +v -0.6778 2.0311 -0.7540 +v -0.8761 2.0502 -0.5094 +v -0.5219 1.3759 -0.9201 +v -0.7374 2.0433 -0.7031 +v -0.5457 1.5494 -0.9285 +v -0.7890 2.0499 -0.6470 +v -0.5587 1.7195 -0.9006 +v -0.8367 2.0543 -0.5777 +v -0.7154 2.2918 -0.6457 +v -0.7255 2.1723 -0.6732 +v -0.6720 2.1583 -0.7127 +v -0.6644 2.2776 -0.6868 +v -0.7004 2.3970 -0.6064 +v -0.6581 2.3841 -0.6390 +v -0.7046 2.4890 -0.5532 +v -0.6741 2.4807 -0.5834 +v -0.6992 2.5752 -0.4931 +v -0.6799 2.5623 -0.5186 +v -0.7568 2.3013 -0.6028 +v -0.7736 2.1809 -0.6257 +v -0.7453 2.4036 -0.5725 +v -0.7381 2.4981 -0.5242 +v -0.7189 2.5840 -0.4689 +v -0.7953 2.3019 -0.5512 +v -0.8162 2.1844 -0.5727 +v -0.7872 2.4066 -0.5351 +v -0.7681 2.5046 -0.4914 +v -0.7353 2.5896 -0.4475 +v -0.8394 2.2991 -0.5011 +v -0.8570 2.1810 -0.5155 +v -0.8230 2.4088 -0.4971 +v -0.7921 2.5065 -0.4632 +v -0.7491 2.5938 -0.4262 +v -0.6074 2.1417 -0.7607 +v -0.6650 2.5475 -0.5400 +v -0.6781 2.6331 -0.4647 +v -0.6850 2.6424 -0.4463 +v -0.7079 2.6668 -0.3918 +v -0.6103 2.2614 -0.7239 +v -0.6910 2.6525 -0.4323 +v -0.6157 2.3699 -0.6729 +v -0.6973 2.6601 -0.4186 +v -0.6452 2.4667 -0.6092 +v -0.7025 2.6650 -0.4050 +v -0.4220 0.2610 -0.0513 +v -0.4497 0.2698 0.0026 +v -0.4869 0.3101 0.0040 +v -0.4527 0.3016 -0.0595 +v -0.5276 0.3511 0.0088 +v -0.4901 0.3466 -0.0632 +v -0.5700 0.4001 0.0128 +v -0.5317 0.3973 -0.0693 +v -0.6197 0.4579 0.0109 +v -0.5772 0.4564 -0.0775 +v -0.4677 0.2808 0.0616 +v -0.5052 0.3159 0.0738 +v -0.5515 0.3576 0.0860 +v -0.5988 0.4101 0.0961 +v -0.6499 0.4680 0.0983 +v -0.4718 0.2972 0.1230 +v -0.5182 0.3348 0.1458 +v -0.5699 0.3780 0.1636 +v -0.6214 0.4281 0.1772 +v -0.6688 0.4843 0.1842 +v -0.4804 0.3158 0.1860 +v -0.5333 0.3536 0.2144 +v -0.5851 0.3974 0.2406 +v -0.6349 0.4478 0.2604 +v -0.6841 0.5029 0.2708 +v -0.3643 0.2226 -0.0927 +v -0.3926 0.2267 -0.0475 +v -0.3930 0.2585 -0.1029 +v -0.6216 0.5223 -0.0946 +v -0.5835 0.5284 -0.1863 +v -0.5359 0.4629 -0.1644 +v -0.7463 0.5968 0.3553 +v -0.7339 0.5628 0.2674 +v -0.6973 0.5332 0.3571 +v -0.4267 0.2880 0.1520 +v -0.4286 0.3060 0.2064 +v -0.4781 0.3370 0.2456 +v -0.4211 0.3006 -0.1167 +v -0.6612 0.5163 -0.0019 +v -0.6420 0.4739 0.3414 +v -0.4298 0.2653 0.1007 +v -0.4540 0.3516 -0.1320 +v -0.6959 0.5269 0.0894 +v -0.5860 0.4214 0.3155 +v -0.4286 0.2474 0.0491 +v -0.4941 0.4069 -0.1491 +v -0.7152 0.5427 0.1779 +v -0.5353 0.3728 0.2811 +v -0.4135 0.2361 0.0002 +v -0.6701 0.5867 -0.1200 +v -0.7116 0.5808 -0.0270 +v -0.7518 0.6557 -0.0591 +v -0.7201 0.6619 -0.1517 +v -0.8020 0.7375 -0.0735 +v -0.7596 0.7459 -0.1802 +v -0.8408 0.8304 -0.0833 +v -0.7978 0.8404 -0.1893 +v -0.8781 0.9424 -0.1036 +v -0.8461 0.9447 -0.2042 +v -0.7419 0.5898 0.0664 +v -0.7836 0.6611 0.0379 +v -0.8249 0.7485 0.0319 +v -0.8687 0.8458 0.0253 +v -0.9104 0.9559 0.0040 +v -0.7578 0.5992 0.1591 +v -0.8109 0.6736 0.1447 +v -0.8638 0.7582 0.1424 +v -0.9097 0.8559 0.1343 +v -0.9447 0.9651 0.1135 +v -0.7815 0.6266 0.2520 +v -0.8341 0.7004 0.2505 +v -0.8893 0.7857 0.2500 +v -0.9399 0.8763 0.2434 +v -0.9693 0.9791 0.2244 +v -0.6294 0.5986 -0.2097 +v -0.8770 1.0651 -0.2201 +v -0.8366 1.0688 -0.3187 +v -0.8007 0.9487 -0.3059 +v -1.0025 1.1165 0.3143 +v -0.9859 1.0956 0.2043 +v -0.9902 1.0032 0.3367 +v -0.7956 0.6608 0.3423 +v -0.6730 0.6680 -0.2411 +v -0.9138 1.0646 -0.1143 +v -0.9595 0.9036 0.3526 +v -0.7138 0.7533 -0.2783 +v -0.9491 1.0724 -0.0109 +v -0.9100 0.8153 0.3574 +v -0.7590 0.8488 -0.2932 +v -0.9678 1.0831 0.0945 +v -0.8471 0.7336 0.3526 +v -0.9141 1.2069 -0.2498 +v -0.9495 1.2037 -0.1480 +v -0.9898 1.3654 -0.1800 +v -0.9475 1.3729 -0.2777 +v -1.0092 1.5446 -0.2193 +v -0.9759 1.5505 -0.3172 +v -1.0029 1.7279 -0.2580 +v -0.9730 1.7326 -0.3446 +v -1.0116 1.9027 -0.2774 +v -0.9733 1.9045 -0.3610 +v -0.9824 1.2097 -0.0435 +v -1.0278 1.3750 -0.0791 +v -1.0424 1.5525 -0.1199 +v -1.0382 1.7286 -0.1668 +v -1.0445 1.8947 -0.1890 +v -1.0094 1.2224 0.0625 +v -1.0545 1.3868 0.0241 +v -1.0604 1.5602 -0.0198 +v -1.0577 1.7378 -0.0708 +v -1.0517 1.9048 -0.0972 +v -1.0310 1.2370 0.1687 +v -1.0643 1.4019 0.1304 +v -1.0680 1.5745 0.0833 +v -1.0703 1.7488 0.0262 +v -1.0525 1.9084 -0.0040 +v -0.8786 1.2107 -0.3480 +v -0.9642 2.0560 -0.3752 +v -0.9286 2.0493 -0.4485 +v -0.9349 1.8967 -0.4401 +v -1.0452 2.0518 0.0386 +v -1.0405 2.0481 -0.0502 +v -1.0500 1.9155 0.0890 +v -1.0362 1.2491 0.2777 +v -0.9080 1.3689 -0.3758 +v -0.9940 2.0568 -0.2996 +v -1.0612 1.7572 0.1228 +v -0.9315 1.5446 -0.4072 +v -1.0153 2.0439 -0.2197 +v -1.0683 1.5819 0.1852 +v -0.9364 1.7251 -0.4252 +v -1.0303 2.0505 -0.1363 +v -1.0627 1.4077 0.2378 +v -0.9603 2.1883 -0.3927 +v -0.9843 2.1882 -0.3252 +v -0.9530 2.3090 -0.3477 +v -0.9335 2.3119 -0.4073 +v -0.9010 2.4203 -0.3724 +v -0.8856 2.4215 -0.4247 +v -0.8451 2.5150 -0.3787 +v -0.8343 2.5171 -0.4177 +v -0.7949 2.5978 -0.3693 +v -0.7812 2.6006 -0.3967 +v -0.9961 2.1801 -0.2546 +v -0.9591 2.3020 -0.2864 +v -0.9124 2.4110 -0.3179 +v -0.8557 2.5110 -0.3362 +v -0.8062 2.5966 -0.3402 +v -1.0074 2.1759 -0.1805 +v -0.9677 2.2974 -0.2230 +v -0.9185 2.4071 -0.2606 +v -0.8650 2.5007 -0.2932 +v -0.8137 2.5896 -0.3118 +v -1.0088 2.1722 -0.1032 +v -0.9627 2.2868 -0.1564 +v -0.9194 2.3958 -0.2026 +v -0.8703 2.4876 -0.2529 +v -0.8228 2.5754 -0.2857 +v -0.9129 2.1847 -0.4631 +v -0.7320 2.6749 -0.3764 +v -0.7273 2.6770 -0.3894 +v -0.7730 2.6007 -0.4185 +v -0.7825 2.6343 -0.3190 +v -0.7696 2.6464 -0.3306 +v -0.8322 2.5596 -0.2658 +v -1.0110 2.1725 -0.0211 +v -0.8994 2.3067 -0.4632 +v -0.7389 2.6717 -0.3643 +v -0.8789 2.4731 -0.2176 +v -0.8678 2.4177 -0.4702 +v -0.7477 2.6657 -0.3532 +v -0.9206 2.3808 -0.1466 +v -0.8249 2.5164 -0.4492 +v -0.7571 2.6574 -0.3419 +v -0.9614 2.2792 -0.0865 +v -0.2044 0.3002 -0.3622 +v -0.2523 0.2869 -0.3131 +v -0.2659 0.3273 -0.3567 +v -0.2216 0.3412 -0.4177 +v -0.2900 0.3749 -0.4006 +v -0.2440 0.3854 -0.4665 +v -0.3178 0.4292 -0.4415 +v -0.2717 0.4322 -0.5115 +v -0.3538 0.4831 -0.4830 +v -0.2938 0.4839 -0.5610 +v -0.2950 0.2699 -0.2584 +v -0.3151 0.3137 -0.2994 +v -0.3378 0.3633 -0.3361 +v -0.3646 0.4192 -0.3708 +v -0.4013 0.4800 -0.4114 +v -0.3342 0.2625 -0.2084 +v -0.3555 0.3079 -0.2358 +v -0.3832 0.3554 -0.2675 +v -0.4118 0.4148 -0.2975 +v -0.4502 0.4760 -0.3292 +v -0.3647 0.2580 -0.1546 +v -0.3927 0.3012 -0.1729 +v -0.4190 0.3536 -0.1962 +v -0.4555 0.4118 -0.2246 +v -0.4970 0.4707 -0.2495 +v -0.1537 0.2853 -0.3325 +v -0.2031 0.2659 -0.2989 +v -0.1579 0.3224 -0.4028 +v -0.3147 0.5414 -0.6056 +v -0.2378 0.5464 -0.6890 +v -0.2150 0.4946 -0.6358 +v -0.5404 0.5353 -0.2715 +v -0.3367 0.2230 -0.1349 +v -0.1734 0.3604 -0.4673 +v -0.3878 0.5377 -0.5281 +v -0.3115 0.2261 -0.1768 +v -0.1913 0.3970 -0.5267 +v -0.4432 0.5389 -0.4430 +v -0.2801 0.2321 -0.2170 +v -0.2060 0.4490 -0.5808 +v -0.4900 0.5367 -0.3580 +v -0.2424 0.2491 -0.2595 +v -0.3474 0.5997 -0.6547 +v -0.4148 0.5989 -0.5688 +v -0.4523 0.6687 -0.6106 +v -0.3851 0.6688 -0.6982 +v -0.4921 0.7500 -0.6445 +v -0.4191 0.7502 -0.7311 +v -0.5348 0.8427 -0.6742 +v -0.4641 0.8360 -0.7516 +v -0.5768 0.9482 -0.6977 +v -0.5007 0.9397 -0.7829 +v -0.4857 0.5997 -0.4797 +v -0.5205 0.6680 -0.5204 +v -0.5551 0.7522 -0.5548 +v -0.5989 0.8460 -0.5852 +v -0.6497 0.9543 -0.6053 +v -0.5340 0.6054 -0.3929 +v -0.5796 0.6781 -0.4304 +v -0.6134 0.7588 -0.4633 +v -0.6609 0.8498 -0.4921 +v -0.7066 0.9514 -0.5112 +v -0.5826 0.6033 -0.3049 +v -0.6279 0.6737 -0.3358 +v -0.6703 0.7555 -0.3707 +v -0.7174 0.8481 -0.3919 +v -0.7523 0.9484 -0.4102 +v -0.2706 0.6053 -0.7411 +v -0.5282 1.0590 -0.8119 +v -0.4506 1.0704 -0.8988 +v -0.4109 0.9550 -0.8590 +v -0.7924 1.0653 -0.4179 +v -0.3002 0.6817 -0.7794 +v -0.6139 1.0646 -0.7228 +v -0.3338 0.7645 -0.8152 +v -0.6833 1.0699 -0.6264 +v -0.3751 0.8523 -0.8350 +v -0.7423 1.0692 -0.5248 +v -0.5810 1.2034 -0.8278 +v -0.6462 1.2064 -0.7399 +v -0.6896 1.3694 -0.7507 +v -0.6172 1.3660 -0.8474 +v -0.7206 1.5489 -0.7698 +v -0.6414 1.5426 -0.8595 +v -0.7273 1.7311 -0.7620 +v -0.6477 1.7201 -0.8461 +v -0.7438 1.9019 -0.7489 +v -0.6672 1.8883 -0.8140 +v -0.7115 1.2116 -0.6402 +v -0.7516 1.3748 -0.6531 +v -0.7853 1.5519 -0.6834 +v -0.8038 1.7324 -0.6782 +v -0.8062 1.9028 -0.6729 +v -0.7687 1.2118 -0.5333 +v -0.8107 1.3748 -0.5569 +v -0.8395 1.5499 -0.5885 +v -0.8618 1.7295 -0.5928 +v -0.8638 1.9015 -0.5932 +v -0.8215 1.2024 -0.4380 +v -0.8669 1.3652 -0.4659 +v -0.8879 1.5442 -0.4968 +v -0.8996 1.7269 -0.5085 +v -0.9057 1.8999 -0.5156 +v -0.4926 1.2103 -0.9197 +v -0.6900 2.0359 -0.7698 +v -0.6184 2.0249 -0.8217 +v -0.5982 1.8826 -0.8738 +v -0.8947 2.0528 -0.5197 +v -0.5368 1.3768 -0.9329 +v -0.7523 2.0498 -0.7187 +v -0.5585 1.5516 -0.9404 +v -0.8053 2.0524 -0.6585 +v -0.5719 1.7230 -0.9158 +v -0.8540 2.0540 -0.5880 +v -0.6829 2.1644 -0.7309 +v -0.7394 2.1768 -0.6897 +v -0.7269 2.2985 -0.6617 +v -0.6733 2.2821 -0.7025 +v -0.7127 2.4058 -0.6226 +v -0.6701 2.3913 -0.6555 +v -0.7146 2.4990 -0.5697 +v -0.6842 2.4898 -0.5975 +v -0.7102 2.5831 -0.5063 +v -0.6902 2.5720 -0.5305 +v -0.7877 2.1834 -0.6396 +v -0.7706 2.3079 -0.6159 +v -0.7583 2.4140 -0.5871 +v -0.7492 2.5076 -0.5376 +v -0.7309 2.5936 -0.4841 +v -0.8325 2.1890 -0.5850 +v -0.8099 2.3087 -0.5630 +v -0.8006 2.4149 -0.5493 +v -0.7800 2.5124 -0.5064 +v -0.7477 2.5982 -0.4613 +v -0.8735 2.1859 -0.5283 +v -0.8537 2.3047 -0.5138 +v -0.8363 2.4150 -0.5105 +v -0.8059 2.5138 -0.4766 +v -0.7636 2.6013 -0.4383 +v -0.6155 2.1481 -0.7776 +v -0.7001 2.6479 -0.4616 +v -0.6975 2.6331 -0.4760 +v -0.6761 2.5567 -0.5536 +v -0.7220 2.6779 -0.4031 +v -0.6181 2.2678 -0.7420 +v -0.7050 2.6605 -0.4467 +v -0.6262 2.3770 -0.6882 +v -0.7109 2.6697 -0.4316 +v -0.6568 2.4749 -0.6246 +v -0.7161 2.6758 -0.4171 +# 650 vertices + +vn 0.0794 0.9966 0.0211 +vn 0.1305 0.9912 -0.0204 +vn -0.0075 0.9963 0.0861 +vn -0.0271 0.9956 0.0901 +vn 0.0518 0.9980 0.0361 +vn -0.0522 0.9952 0.0831 +vn 0.0592 0.9973 0.0429 +vn -0.0571 0.9952 0.0790 +vn 0.0612 0.9945 0.0852 +vn -0.0564 0.9925 0.1082 +vn 0.2333 0.9641 -0.1269 +vn 0.2916 0.9393 -0.1805 +vn 0.1926 0.9794 -0.0599 +vn 0.1875 0.9822 0.0081 +vn 0.1926 0.9802 0.0463 +vn 0.3003 0.9231 -0.2400 +vn 0.3500 0.8765 -0.3305 +vn 0.2957 0.9429 -0.1533 +vn 0.2801 0.9586 -0.0505 +vn 0.2724 0.9620 0.0206 +vn 0.3418 0.8906 -0.3001 +vn 0.3522 0.7955 -0.4931 +vn 0.3707 0.9022 -0.2203 +vn 0.3578 0.9268 -0.1145 +vn 0.3555 0.9339 -0.0380 +vn -0.0149 0.9980 0.0608 +vn -0.1176 0.9905 0.0717 +vn -0.0721 0.9937 0.0862 +vn -0.0789 0.9931 0.0868 +vn -0.0685 0.9937 0.0883 +vn -0.0411 0.9948 0.0927 +vn 0.3499 0.9366 0.0188 +vn 0.4063 0.9135 0.0215 +vn 0.4045 0.9136 -0.0425 +vn 0.3784 0.7486 -0.5444 +vn 0.3469 0.7206 -0.6003 +vn 0.3928 0.6354 -0.6648 +vn -0.0631 0.9902 0.1244 +vn 0.0517 0.9948 0.0879 +vn 0.4083 0.9007 -0.1485 +vn 0.4122 0.7824 -0.4669 +vn -0.0910 0.9889 0.1175 +vn 0.1904 0.9792 0.0697 +vn 0.4282 0.8608 -0.2752 +vn 0.2984 0.9255 -0.2332 +vn -0.0918 0.9919 0.0884 +vn 0.2632 0.9631 0.0566 +vn 0.3968 0.8666 -0.3025 +vn 0.1512 0.9859 -0.0713 +vn 0.0761 0.9818 0.1742 +vn 0.0534 0.9932 0.1032 +vn -0.0441 0.9946 0.0938 +vn -0.0370 0.9861 0.1619 +vn 0.1103 0.9628 0.2469 +vn -0.0361 0.9566 0.2891 +vn 0.1035 0.9336 0.3431 +vn 0.0139 0.9458 0.3244 +vn 0.1166 0.9163 0.3831 +vn 0.0429 0.9223 0.3840 +vn 0.1387 0.9692 0.2034 +vn 0.1847 0.9791 0.0846 +vn 0.1450 0.9522 0.2687 +vn 0.1520 0.9321 0.3287 +vn 0.1780 0.9068 0.3822 +vn 0.2399 0.9655 0.1010 +vn 0.2618 0.9640 0.0462 +vn 0.1889 0.9565 0.2222 +vn 0.1636 0.9257 0.3412 +vn 0.1888 0.8790 0.4379 +vn 0.3334 0.9408 0.0608 +vn 0.3400 0.9398 0.0337 +vn 0.3059 0.9400 0.1511 +vn 0.2701 0.9095 0.3161 +vn 0.2615 0.8484 0.4603 +vn -0.0831 0.9900 0.1141 +vn -0.0046 0.9163 0.4004 +vn 0.0274 0.9109 0.4117 +vn 0.0488 0.9001 0.4330 +vn 0.2991 0.8490 0.4357 +vn 0.3048 0.8301 0.4670 +vn 0.2826 0.8323 0.4769 +vn 0.4277 0.9037 -0.0187 +vn -0.0708 0.9846 0.1597 +vn 0.1034 0.8965 0.4308 +vn 0.3148 0.8982 0.3068 +vn -0.0362 0.9700 0.2403 +vn 0.2030 0.8952 0.3968 +vn 0.3518 0.9277 0.1250 +vn 0.0080 0.9548 0.2972 +vn 0.2549 0.8754 0.4108 +vn 0.3983 0.9172 0.0037 +vn 0.0582 0.8662 0.4963 +vn 0.0973 0.9008 0.4232 +vn 0.0612 0.8978 0.4361 +vn 0.0415 0.8676 0.4955 +vn 0.1008 0.8073 0.5815 +vn 0.0512 0.8097 0.5846 +vn 0.0882 0.7696 0.6325 +vn 0.0518 0.7663 0.6404 +vn 0.0713 0.7282 0.6817 +vn 0.0068 0.7352 0.6778 +vn 0.1536 0.8550 0.4953 +vn 0.1666 0.8954 0.4128 +vn 0.1950 0.7824 0.5915 +vn 0.1710 0.7528 0.6356 +vn 0.2205 0.7053 0.6737 +vn 0.2815 0.8184 0.5010 +vn 0.2438 0.8817 0.4041 +vn 0.3071 0.7426 0.5952 +vn 0.2883 0.7061 0.6467 +vn 0.3712 0.6545 0.6586 +vn 0.3875 0.7664 0.5123 +vn 0.3297 0.8508 0.4092 +vn 0.4003 0.6933 0.5993 +vn 0.4089 0.6524 0.6381 +vn 0.4196 0.6279 0.6555 +vn -0.0076 0.8906 0.4547 +vn 0.0159 0.7391 0.6734 +vn -0.0166 0.7181 0.6957 +vn 0.0367 0.7327 0.6795 +vn 0.3633 0.5790 0.7300 +vn 0.3982 0.5927 0.7001 +vn 0.4632 0.6068 0.6459 +vn 0.3755 0.8270 0.4186 +vn 0.0109 0.8711 0.4910 +vn 0.1368 0.6961 0.7048 +vn 0.4964 0.6144 0.6132 +vn -0.0185 0.8086 0.5881 +vn 0.2173 0.6444 0.7331 +vn 0.4309 0.6706 0.6039 +vn 0.0141 0.7656 0.6432 +vn 0.3106 0.5990 0.7380 +vn 0.4314 0.7464 0.5067 +vn 0.2694 0.4864 0.8312 +vn 0.2190 0.6327 0.7428 +vn 0.0111 0.6778 0.7351 +vn 0.0342 0.5455 0.8374 +vn 0.2221 0.3570 0.9073 +vn 0.1079 0.4103 0.9055 +vn 0.2027 0.2890 0.9356 +vn 0.1754 0.2859 0.9421 +vn 0.1262 0.2278 0.9655 +vn 0.1018 0.2140 0.9715 +vn 0.3410 0.4508 0.8249 +vn 0.2821 0.5888 0.7575 +vn 0.3318 0.3395 0.8801 +vn 0.2819 0.2753 0.9191 +vn 0.2429 0.2179 0.9453 +vn 0.4193 0.3889 0.8203 +vn 0.3631 0.5178 0.7746 +vn 0.4193 0.2981 0.8575 +vn 0.3831 0.2564 0.8874 +vn 0.3135 0.2278 0.9219 +vn 0.4867 0.3302 0.8088 +vn 0.4020 0.4505 0.7971 +vn 0.4805 0.2646 0.8361 +vn 0.4356 0.2434 0.8666 +vn 0.4015 0.1730 0.8994 +vn -0.1223 0.6630 0.7385 +vn 0.0809 0.2194 0.9723 +vn 0.1096 0.2106 0.9714 +vn 0.1093 0.2086 0.9719 +vn -0.1433 0.4365 0.8882 +vn -0.6275 0.1115 -0.7706 +vn 0.4132 0.2412 0.8781 +vn 0.3837 0.4528 0.8049 +vn -0.1692 0.5816 0.7957 +vn 0.0960 0.2038 0.9743 +vn 0.4439 0.2566 0.8586 +vn -0.0669 0.4663 0.8821 +vn 0.1226 0.2055 0.9709 +vn 0.4735 0.3009 0.8278 +vn 0.0158 0.2903 0.9568 +vn 0.0721 0.2476 0.9662 +vn 0.4463 0.3371 0.8289 +vn -0.3210 0.9442 -0.0743 +vn -0.3696 0.9094 -0.1909 +vn -0.4302 0.8344 -0.3444 +vn -0.3884 0.8977 -0.2082 +vn -0.2742 0.9617 -0.0049 +vn -0.2805 0.9520 -0.1225 +vn -0.2055 0.9786 -0.0119 +vn -0.2517 0.9658 -0.0625 +vn -0.1675 0.9856 -0.0222 +vn -0.2917 0.9560 -0.0320 +vn -0.2567 0.9665 -0.0011 +vn -0.3096 0.9488 -0.0636 +vn -0.2460 0.9678 0.0526 +vn -0.2157 0.9749 0.0555 +vn -0.1586 0.9866 0.0379 +vn -0.1634 0.9830 0.0841 +vn -0.1995 0.9795 0.0288 +vn -0.1333 0.9883 0.0738 +vn -0.1532 0.9836 0.0953 +vn -0.1423 0.9850 0.0974 +vn -0.1060 0.9851 0.1357 +vn -0.1004 0.9944 0.0324 +vn -0.0886 0.9898 0.1116 +vn -0.0800 0.9935 0.0812 +vn -0.0970 0.9914 0.0884 +vn -0.4333 0.8242 -0.3646 +vn -0.4793 0.7117 -0.5136 +vn -0.4750 0.7827 -0.4023 +vn -0.3226 0.9437 -0.0729 +vn -0.2755 0.9580 -0.0797 +vn -0.2752 0.9613 -0.0146 +vn -0.1082 0.9892 0.0991 +vn -0.1279 0.9917 -0.0138 +vn -0.3690 0.8841 -0.2866 +vn -0.1997 0.9792 0.0353 +vn -0.1715 0.9833 -0.0608 +vn -0.3106 0.9393 -0.1454 +vn -0.1031 0.9941 0.0337 +vn -0.3010 0.9492 -0.0920 +vn -0.3536 0.9321 -0.0789 +vn -0.1152 0.9900 0.0818 +vn -0.4134 0.8877 -0.2027 +vn -0.1888 0.9736 0.1286 +vn -0.2048 0.9767 0.0643 +vn -0.2308 0.9730 0.0042 +vn -0.2765 0.9502 0.1439 +vn -0.2036 0.9553 0.2145 +vn -0.3093 0.9234 0.2273 +vn -0.2280 0.9359 0.2686 +vn -0.3176 0.9102 0.2659 +vn -0.2301 0.9119 0.3399 +vn -0.3423 0.8812 0.3259 +vn -0.1446 0.9775 0.1536 +vn -0.1170 0.9914 0.0578 +vn -0.1381 0.9656 0.2204 +vn -0.1473 0.9546 0.2590 +vn -0.1520 0.9195 0.3627 +vn -0.0867 0.9842 0.1541 +vn -0.0840 0.9944 0.0645 +vn -0.1040 0.9683 0.2271 +vn -0.0916 0.9590 0.2682 +vn -0.0565 0.9320 0.3579 +vn -0.0658 0.9877 0.1420 +vn -0.0913 0.9915 0.0928 +vn -0.0701 0.9720 0.2242 +vn -0.0530 0.9521 0.3011 +vn -0.0207 0.9236 0.3829 +vn -0.3011 0.9534 0.0181 +vn -0.3994 0.8610 0.3147 +vn -0.3128 0.8913 0.3281 +vn -0.3169 0.8715 0.3742 +vn -0.0100 0.9040 0.4275 +vn -0.3640 0.9158 0.1700 +vn -0.2256 0.8761 0.4262 +vn -0.3697 0.9007 0.2283 +vn -0.1307 0.8799 0.4568 +vn -0.3928 0.8767 0.2777 +vn -0.0721 0.8812 0.4673 +vn -0.1585 0.8581 0.4884 +vn -0.1753 0.8672 0.4661 +vn -0.2448 0.8712 0.4255 +vn -0.2650 0.8234 0.5018 +vn -0.2221 0.7778 0.5879 +vn -0.3093 0.7316 0.6076 +vn -0.2850 0.6925 0.6627 +vn -0.3586 0.6352 0.6841 +vn -0.3275 0.6311 0.7031 +vn -0.4201 0.5631 0.7116 +vn -0.1198 0.8649 0.4874 +vn -0.1100 0.8686 0.4832 +vn -0.1338 0.8193 0.5576 +vn -0.1969 0.7304 0.6540 +vn -0.2077 0.6836 0.6997 +vn -0.1097 0.8655 0.4888 +vn -0.0807 0.8752 0.4769 +vn -0.0707 0.8290 0.5548 +vn -0.0616 0.7709 0.6339 +vn -0.1025 0.7051 0.7017 +vn -0.0560 0.8743 0.4822 +vn -0.0779 0.8789 0.4706 +vn -0.0450 0.8170 0.5749 +vn 0.0139 0.7758 0.6309 +vn 0.0156 0.7318 0.6813 +vn -0.3113 0.8510 0.4230 +vn -0.4269 0.5520 0.7163 +vn -0.4680 0.4488 0.7613 +vn -0.4413 0.4779 0.7595 +vn -0.0435 0.6803 0.7316 +vn -0.3276 0.7975 0.5065 +vn -0.3606 0.5361 0.7633 +vn -0.3628 0.7005 0.6145 +vn -0.2269 0.6086 0.7604 +vn -0.3982 0.5989 0.6949 +vn -0.1232 0.6469 0.7526 +vn -0.4078 0.4252 0.8080 +vn -0.4142 0.4633 0.7835 +vn -0.4840 0.4185 0.7685 +vn -0.4918 0.3692 0.7886 +vn -0.4622 0.2853 0.8397 +vn -0.4752 0.3024 0.8263 +vn -0.3948 0.2523 0.8834 +vn -0.4208 0.2561 0.8703 +vn -0.3355 0.1852 0.9237 +vn -0.3851 0.1467 0.9111 +vn -0.2765 0.5107 0.8141 +vn -0.2812 0.5230 0.8046 +vn -0.3974 0.3466 0.8496 +vn -0.3593 0.2444 0.9006 +vn -0.2910 0.1855 0.9386 +vn -0.2252 0.5585 0.7984 +vn -0.1939 0.5612 0.8046 +vn -0.3128 0.4293 0.8473 +vn -0.2665 0.2744 0.9240 +vn -0.2146 0.1946 0.9571 +vn -0.2461 0.5645 0.7879 +vn -0.1432 0.6164 0.7743 +vn -0.2377 0.4719 0.8490 +vn -0.1724 0.2860 0.9426 +vn -0.0572 0.2152 0.9749 +vn -0.4916 0.3948 0.7762 +vn -0.3754 0.2326 0.8972 +vn -0.0371 0.5149 0.8564 +vn -0.2671 0.2423 0.9327 +vn 0.0329 0.2182 0.9753 +vn -0.5204 0.3653 0.7718 +vn -0.2428 0.2237 0.9439 +vn -0.4721 0.3301 0.8174 +vn -0.1259 0.2564 0.9583 +vn -0.4617 0.2871 0.8393 +vn -0.0427 0.2443 0.9688 +vn 0.0143 -0.9975 -0.0695 +vn -0.1202 -0.9924 0.0268 +vn -0.0801 -0.9967 -0.0112 +vn 0.0358 -0.9953 -0.0897 +vn -0.0554 -0.9974 -0.0464 +vn 0.0554 -0.9940 -0.0947 +vn -0.0599 -0.9963 -0.0610 +vn 0.0515 -0.9943 -0.0937 +vn -0.0533 -0.9955 -0.0789 +vn 0.0492 -0.9922 -0.1145 +vn -0.2815 -0.9443 0.1705 +vn -0.2370 -0.9641 0.1200 +vn -0.2063 -0.9766 0.0615 +vn -0.1841 -0.9828 -0.0120 +vn -0.1929 -0.9809 -0.0264 +vn -0.3554 -0.8781 0.3205 +vn -0.3092 -0.9214 0.2353 +vn -0.2955 -0.9411 0.1644 +vn -0.2791 -0.9587 0.0548 +vn -0.2751 -0.9614 -0.0072 +vn -0.3665 -0.7882 0.4943 +vn -0.3471 -0.8851 0.3100 +vn -0.3661 -0.9031 0.2244 +vn -0.3645 -0.9231 0.1225 +vn -0.3548 -0.9340 0.0433 +vn 0.1057 -0.9925 -0.0612 +vn 0.0156 -0.9989 -0.0439 +vn 0.0728 -0.9946 -0.0735 +vn 0.0402 -0.9960 -0.0801 +vn 0.0658 -0.9935 -0.0930 +vn 0.0668 -0.9942 -0.0848 +vn -0.4134 -0.9106 0.0016 +vn -0.3561 -0.9344 -0.0062 +vn -0.3971 -0.9169 0.0401 +vn -0.3982 -0.6588 0.6383 +vn -0.3590 -0.7569 0.5461 +vn -0.3915 -0.7348 0.5539 +vn 0.0672 -0.9909 -0.1169 +vn -0.0394 -0.9963 -0.0758 +vn -0.4173 -0.8928 0.1699 +vn -0.4084 -0.7995 0.4405 +vn 0.0889 -0.9892 -0.1162 +vn -0.1826 -0.9816 -0.0563 +vn -0.4292 -0.8588 0.2796 +vn -0.2815 -0.9362 0.2105 +vn 0.0876 -0.9921 -0.0897 +vn -0.2703 -0.9621 -0.0355 +vn -0.4014 -0.8552 0.3278 +vn -0.1476 -0.9854 0.0849 +vn 0.0493 -0.9952 -0.0848 +vn -0.0429 -0.9944 -0.0970 +vn -0.0720 -0.9824 -0.1725 +vn 0.0370 -0.9872 -0.1553 +vn -0.1175 -0.9612 -0.2496 +vn 0.0284 -0.9572 -0.2880 +vn -0.1067 -0.9320 -0.3464 +vn -0.0162 -0.9447 -0.3275 +vn -0.1160 -0.9164 -0.3831 +vn -0.0504 -0.9256 -0.3751 +vn -0.1769 -0.9799 -0.0924 +vn -0.1433 -0.9669 -0.2112 +vn -0.1525 -0.9481 -0.2791 +vn -0.1562 -0.9325 -0.3255 +vn -0.1728 -0.9111 -0.3741 +vn -0.2682 -0.9615 -0.0596 +vn -0.2474 -0.9614 -0.1203 +vn -0.1987 -0.9545 -0.2222 +vn -0.1584 -0.9287 -0.3354 +vn -0.1883 -0.8833 -0.4293 +vn -0.3421 -0.9384 -0.0492 +vn -0.3369 -0.9386 -0.0745 +vn -0.3013 -0.9413 -0.1521 +vn -0.2695 -0.9155 -0.2987 +vn -0.2589 -0.8514 -0.4562 +vn 0.0824 -0.9913 -0.1022 +vn -0.0541 -0.9000 -0.4326 +vn -0.0236 -0.9099 -0.4142 +vn -0.0005 -0.9206 -0.3904 +vn -0.3026 -0.8299 -0.4686 +vn -0.2981 -0.8465 -0.4411 +vn -0.2872 -0.8365 -0.4668 +vn -0.4069 -0.9132 -0.0245 +vn 0.0729 -0.9863 -0.1479 +vn -0.1067 -0.8974 -0.4281 +vn -0.3144 -0.9039 -0.2900 +vn 0.0334 -0.9686 -0.2463 +vn -0.1933 -0.8953 -0.4013 +vn -0.3373 -0.9327 -0.1275 +vn -0.0121 -0.9541 -0.2994 +vn -0.2569 -0.8741 -0.4122 +vn -0.3981 -0.9173 -0.0084 +vn -0.0633 -0.8956 -0.4403 +vn -0.1037 -0.9000 -0.4234 +vn -0.0603 -0.8661 -0.4961 +vn -0.0409 -0.8658 -0.4986 +vn -0.0999 -0.8083 -0.5802 +vn -0.0503 -0.8109 -0.5831 +vn -0.0894 -0.7713 -0.6302 +vn -0.0508 -0.7670 -0.6396 +vn -0.0689 -0.7278 -0.6823 +vn -0.0093 -0.7348 -0.6782 +vn -0.1658 -0.8935 -0.4172 +vn -0.1546 -0.8548 -0.4954 +vn -0.1902 -0.7845 -0.5903 +vn -0.1673 -0.7552 -0.6338 +vn -0.2191 -0.7055 -0.6740 +vn -0.2444 -0.8792 -0.4089 +vn -0.2793 -0.8199 -0.4997 +vn -0.3043 -0.7445 -0.5943 +vn -0.2849 -0.7068 -0.6475 +vn -0.3706 -0.6541 -0.6594 +vn -0.3280 -0.8485 -0.4154 +vn -0.3872 -0.7665 -0.5124 +vn -0.4016 -0.6935 -0.5981 +vn -0.4058 -0.6526 -0.6399 +vn -0.4188 -0.6274 -0.6565 +vn 0.0089 -0.8895 -0.4568 +vn -0.0329 -0.7326 -0.6799 +vn 0.0098 -0.7131 -0.7010 +vn -0.0285 -0.7395 -0.6725 +vn -0.3933 -0.5915 -0.7038 +vn -0.3650 -0.5780 -0.7299 +vn -0.4608 -0.6089 -0.6457 +vn -0.3709 -0.8272 -0.4221 +vn -0.0178 -0.8699 -0.4930 +vn -0.1361 -0.6998 -0.7013 +vn -0.4950 -0.6155 -0.6133 +vn 0.0094 -0.8113 -0.5846 +vn -0.2208 -0.6450 -0.7316 +vn -0.4290 -0.6727 -0.6029 +vn -0.0162 -0.7670 -0.6415 +vn -0.3105 -0.5984 -0.7386 +vn -0.4297 -0.7469 -0.5075 +vn 0.0035 -0.6780 -0.7350 +vn -0.2043 -0.6356 -0.7445 +vn -0.2530 -0.4883 -0.8352 +vn -0.0215 -0.5544 -0.8320 +vn -0.2289 -0.3570 -0.9056 +vn -0.0979 -0.4117 -0.9060 +vn -0.2091 -0.2883 -0.9344 +vn -0.1585 -0.2848 -0.9454 +vn -0.0952 -0.2191 -0.9710 +vn -0.0854 -0.2048 -0.9751 +vn -0.2899 -0.5873 -0.7557 +vn -0.3430 -0.4470 -0.8262 +vn -0.3283 -0.3360 -0.8828 +vn -0.2875 -0.2849 -0.9144 +vn -0.2213 -0.2078 -0.9528 +vn -0.3680 -0.5153 -0.7740 +vn -0.4219 -0.3903 -0.8184 +vn -0.4058 -0.2967 -0.8644 +vn -0.3809 -0.2595 -0.8875 +vn -0.3593 -0.1758 -0.9165 +vn -0.4063 -0.4451 -0.7980 +vn -0.4881 -0.3307 -0.8078 +vn -0.4817 -0.2659 -0.8350 +vn -0.4121 -0.2557 -0.8745 +vn -0.4138 -0.1796 -0.8925 +vn 0.1077 -0.6647 -0.7393 +vn -0.1429 -0.2084 -0.9676 +vn -0.1494 -0.2236 -0.9632 +vn -0.0631 -0.2153 -0.9745 +vn 0.2951 -0.6048 -0.7397 +vn -0.0068 -0.3240 -0.9460 +vn -0.3681 -0.2795 -0.8868 +vn -0.3926 -0.4498 -0.8022 +vn 0.1624 -0.5850 -0.7946 +vn -0.0977 -0.1942 -0.9761 +vn -0.3943 -0.2842 -0.8739 +vn 0.0858 -0.4718 -0.8775 +vn -0.1208 -0.1794 -0.9763 +vn -0.4859 -0.2994 -0.8212 +vn 0.0113 -0.2874 -0.9578 +vn -0.1840 -0.1653 -0.9689 +vn -0.4503 -0.3316 -0.8290 +vn 0.4240 -0.8358 0.3488 +vn 0.3727 -0.9065 0.1982 +vn 0.3190 -0.9431 0.0935 +vn 0.3666 -0.9025 0.2260 +vn 0.2536 -0.9671 0.0212 +vn 0.2843 -0.9496 0.1320 +vn 0.1898 -0.9818 0.0106 +vn 0.2587 -0.9638 0.0650 +vn 0.1634 -0.9863 0.0217 +vn 0.2961 -0.9549 0.0227 +vn 0.3094 -0.9469 0.0869 +vn 0.2671 -0.9636 0.0130 +vn 0.2410 -0.9689 -0.0561 +vn 0.1913 -0.9800 -0.0546 +vn 0.1474 -0.9888 -0.0220 +vn 0.2075 -0.9780 -0.0197 +vn 0.1635 -0.9837 -0.0754 +vn 0.1366 -0.9863 -0.0921 +vn 0.1510 -0.9832 -0.1028 +vn 0.1311 -0.9889 -0.0696 +vn 0.1010 -0.9943 -0.0350 +vn 0.1044 -0.9862 -0.1287 +vn 0.0886 -0.9895 -0.1142 +vn 0.0959 -0.9917 -0.0855 +vn 0.1050 -0.9910 -0.0831 +vn 0.4762 -0.7226 0.5011 +vn 0.4275 -0.8236 0.3728 +vn 0.4638 -0.7867 0.4075 +vn 0.2829 -0.9591 0.0020 +vn 0.2682 -0.9613 0.0635 +vn 0.3195 -0.9452 0.0666 +vn 0.0978 -0.9905 -0.0968 +vn 0.1218 -0.9925 0.0046 +vn 0.3769 -0.8763 0.3001 +vn 0.2047 -0.9784 -0.0278 +vn 0.1922 -0.9800 0.0513 +vn 0.3330 -0.9285 0.1645 +vn 0.1045 -0.9943 -0.0220 +vn 0.3192 -0.9409 0.1133 +vn 0.3577 -0.9287 0.0976 +vn 0.1011 -0.9925 -0.0682 +vn 0.4034 -0.8849 0.2331 +vn 0.2364 -0.9716 -0.0066 +vn 0.2171 -0.9738 -0.0676 +vn 0.1938 -0.9725 -0.1291 +vn 0.2825 -0.9502 -0.1319 +vn 0.1977 -0.9580 -0.2076 +vn 0.3161 -0.9248 -0.2118 +vn 0.2158 -0.9383 -0.2702 +vn 0.3210 -0.9103 -0.2615 +vn 0.2247 -0.9120 -0.3432 +vn 0.3468 -0.8770 -0.3325 +vn 0.1157 -0.9911 -0.0655 +vn 0.1478 -0.9755 -0.1630 +vn 0.1409 -0.9649 -0.2215 +vn 0.1490 -0.9538 -0.2608 +vn 0.1564 -0.9217 -0.3551 +vn 0.0721 -0.9948 -0.0719 +vn 0.0861 -0.9840 -0.1558 +vn 0.1092 -0.9689 -0.2218 +vn 0.0992 -0.9596 -0.2632 +vn 0.0689 -0.9305 -0.3598 +vn 0.0805 -0.9928 -0.0889 +vn 0.0661 -0.9889 -0.1327 +vn 0.0694 -0.9730 -0.2201 +vn 0.0432 -0.9539 -0.2971 +vn 0.0157 -0.9240 -0.3821 +vn 0.3063 -0.9514 -0.0310 +vn 0.3159 -0.8690 -0.3808 +vn 0.3187 -0.8865 -0.3355 +vn 0.4122 -0.8552 -0.3141 +vn 0.0102 -0.9010 -0.4337 +vn 0.3795 -0.9107 -0.1634 +vn 0.2304 -0.8733 -0.4293 +vn 0.3833 -0.8992 -0.2111 +vn 0.1348 -0.8782 -0.4588 +vn 0.4135 -0.8679 -0.2751 +vn 0.0657 -0.8792 -0.4720 +vn 0.2583 -0.8639 -0.4324 +vn 0.1740 -0.8679 -0.4652 +vn 0.1634 -0.8552 -0.4918 +vn 0.2689 -0.8202 -0.5049 +vn 0.2391 -0.7678 -0.5944 +vn 0.3133 -0.7257 -0.6125 +vn 0.2935 -0.6904 -0.6612 +vn 0.3457 -0.6480 -0.6787 +vn 0.3249 -0.6431 -0.6935 +vn 0.4061 -0.5804 -0.7058 +vn 0.1057 -0.8672 -0.4867 +vn 0.1160 -0.8670 -0.4847 +vn 0.1435 -0.8164 -0.5593 +vn 0.2177 -0.7211 -0.6578 +vn 0.2131 -0.6850 -0.6967 +vn 0.0838 -0.8719 -0.4825 +vn 0.1154 -0.8666 -0.4854 +vn 0.0697 -0.8327 -0.5493 +vn 0.0682 -0.7700 -0.6343 +vn 0.1152 -0.7021 -0.7027 +vn 0.0835 -0.8782 -0.4709 +vn 0.0603 -0.8743 -0.4816 +vn 0.0410 -0.8175 -0.5744 +vn -0.0169 -0.7773 -0.6289 +vn -0.0118 -0.7301 -0.6833 +vn 0.3315 -0.8386 -0.4323 +vn 0.4564 -0.4712 -0.7548 +vn 0.4847 -0.4277 -0.7630 +vn 0.4109 -0.5657 -0.7149 +vn 0.0458 -0.6771 -0.7345 +vn 0.3326 -0.7947 -0.5078 +vn 0.3556 -0.5434 -0.7605 +vn 0.3565 -0.6995 -0.6194 +vn 0.2160 -0.6161 -0.7575 +vn 0.3741 -0.6221 -0.6878 +vn 0.1295 -0.6498 -0.7490 +vn 0.4964 -0.4062 -0.7672 +vn 0.4016 -0.4660 -0.7884 +vn 0.4176 -0.4184 -0.8066 +vn 0.4955 -0.3709 -0.7854 +vn 0.4650 -0.2866 -0.8376 +vn 0.4912 -0.2879 -0.8221 +vn 0.3994 -0.2323 -0.8869 +vn 0.4296 -0.2290 -0.8735 +vn 0.3799 -0.1464 -0.9134 +vn 0.3579 -0.1856 -0.9151 +vn 0.2725 -0.5246 -0.8065 +vn 0.2695 -0.5176 -0.8121 +vn 0.3905 -0.3471 -0.8527 +vn 0.3487 -0.2468 -0.9042 +vn 0.3088 -0.1743 -0.9350 +vn 0.2028 -0.5567 -0.8056 +vn 0.2255 -0.5584 -0.7983 +vn 0.2981 -0.4380 -0.8481 +vn 0.2699 -0.2676 -0.9250 +vn 0.1958 -0.2117 -0.9575 +vn 0.1378 -0.6153 -0.7761 +vn 0.2545 -0.5573 -0.7903 +vn 0.2386 -0.4768 -0.8460 +vn 0.1874 -0.2828 -0.9407 +vn 0.0660 -0.2207 -0.9731 +vn 0.5102 -0.3822 -0.7705 +vn 0.2487 -0.2899 -0.9242 +vn -0.5090 -0.0812 0.8570 +vn 0.3129 -0.3021 -0.9005 +vn -0.0520 -0.2374 -0.9700 +vn 0.5027 -0.3865 -0.7732 +vn 0.2012 -0.2870 -0.9366 +vn 0.4950 -0.3029 -0.8144 +vn 0.1390 -0.2550 -0.9569 +vn 0.4243 -0.3414 -0.8387 +vn 0.0464 -0.2542 -0.9660 +vn -0.0870 0.0428 0.9953 +vn -0.0813 0.0372 0.9960 +vn -0.0783 0.0379 0.9962 +vn -0.0948 0.0620 0.9936 +vn -0.8450 0.4683 0.2582 +vn -0.7238 0.5770 0.3785 +vn -0.7288 0.5562 0.3993 +vn -0.8541 0.4514 0.2583 +vn -0.4237 0.7359 0.5281 +vn -0.3737 0.7646 0.5252 +vn -0.3749 0.7595 0.5316 +vn -0.4302 0.7235 0.5398 +vn 0.3087 0.5101 0.8028 +vn 0.3025 0.4758 0.8259 +vn 0.3047 0.4960 0.8131 +vn 0.3087 0.5167 0.7986 +vn -0.6204 0.6225 0.4770 +vn -0.6214 0.6120 0.4892 +vn 0.2349 0.3492 0.9071 +vn 0.2414 0.3865 0.8901 +vn -0.5422 0.6338 0.5517 +vn -0.5412 0.6327 0.5538 +vn 0.0891 0.2529 0.9634 +vn 0.0948 0.2858 0.9536 +vn -0.5055 0.6164 0.6038 +vn -0.5067 0.6066 0.6126 +vn -0.0425 0.1696 0.9846 +vn -0.0549 0.2048 0.9773 +vn -0.9383 0.3322 0.0956 +vn -0.9169 0.3580 0.1762 +vn -0.9201 0.3548 0.1657 +vn -0.9396 0.3298 0.0918 +vn -0.8611 0.4025 0.3106 +vn -0.8613 0.3986 0.3151 +vn -0.8857 0.3838 0.2613 +vn -0.8908 0.3786 0.2512 +vn -0.8396 0.4277 0.3348 +vn -0.8416 0.4247 0.3338 +vn -0.8246 0.4005 0.3995 +vn -0.8228 0.4019 0.4017 +vn -0.7895 0.6063 0.0954 +vn -0.8719 0.4800 0.0968 +vn -0.8720 0.4760 0.1139 +vn -0.7896 0.6059 0.0977 +vn -0.9428 0.3275 0.0621 +vn -0.9422 0.3289 0.0634 +vn -0.9461 0.3239 0.0038 +vn -0.9447 0.3278 -0.0008 +vn -0.8504 0.5161 0.1020 +vn -0.8519 0.5142 0.0992 +vn -0.9154 0.3965 0.0700 +vn -0.9128 0.4014 0.0749 +vn -0.0891 0.9633 -0.2533 +vn -0.1837 0.9567 -0.2259 +vn -0.2239 0.9447 -0.2397 +vn -0.1214 0.9571 -0.2632 +vn -0.6617 0.7459 0.0759 +vn -0.7756 0.6300 -0.0395 +vn -0.7751 0.6309 -0.0344 +vn -0.7047 0.7079 0.0473 +vn -0.7140 0.6940 -0.0922 +vn -0.7607 0.6333 -0.1422 +vn -0.7879 0.6158 0.0097 +vn -0.7870 0.6169 0.0006 +vn -0.3643 0.9060 -0.2156 +vn -0.3686 0.9050 -0.2123 +vn -0.7291 0.6837 0.0310 +vn -0.7265 0.6868 0.0218 +vn -0.5191 0.8280 -0.2119 +vn -0.5104 0.8353 -0.2043 +vn -0.6980 0.7156 0.0277 +vn -0.6961 0.7171 0.0342 +vn -0.6187 0.7607 -0.1963 +vn -0.6191 0.7604 -0.1962 +vn -0.7881 0.6124 -0.0619 +vn -0.7858 0.6158 -0.0577 +vn 0.3824 0.7324 0.5634 +vn 0.5874 0.5425 0.6005 +vn 0.5691 0.5702 0.5925 +vn 0.3481 0.7637 0.5437 +vn -0.2660 0.4314 0.8621 +vn -0.4194 0.4780 0.7718 +vn -0.3982 0.4633 0.7917 +vn -0.2450 0.4082 0.8794 +vn 0.7529 0.3780 0.5387 +vn 0.8632 0.3043 0.4028 +vn 0.8625 0.3104 0.3997 +vn 0.7553 0.3795 0.5343 +vn -0.0262 0.0423 0.9988 +vn -0.0228 0.0419 0.9989 +vn 0.7088 0.4435 0.5485 +vn 0.7000 0.4526 0.5524 +vn 0.0004 0.0623 0.9981 +vn 0.0107 0.0473 0.9988 +vn 0.7196 0.4358 0.5406 +vn 0.7122 0.4465 0.5417 +vn -0.0466 0.2007 0.9785 +vn -0.0247 0.1786 0.9836 +vn 0.7566 0.3257 0.5670 +vn 0.7548 0.3298 0.5670 +vn -0.0791 0.3128 0.9465 +vn -0.0540 0.2903 0.9554 +vn 0.8930 0.3284 0.3076 +vn 0.8964 0.3238 0.3026 +vn 0.9328 0.3124 0.1796 +vn 0.9706 0.2148 0.1088 +vn 0.9699 0.2144 0.1153 +vn 0.9306 0.3171 0.1828 +vn 0.8866 0.3882 0.2514 +vn 0.8908 0.3809 0.2476 +vn 0.8713 0.4538 0.1867 +vn 0.8689 0.4606 0.1812 +vn 0.9419 0.3246 0.0867 +vn 0.9385 0.3315 0.0965 +vn 0.9349 0.3397 0.1026 +vn 0.9362 0.3361 0.1025 +vn 0.8494 0.5276 0.0048 +vn 0.7952 0.5844 0.1619 +vn 0.8020 0.5784 0.1491 +vn 0.8521 0.5233 0.0027 +vn 0.9560 0.2790 0.0903 +vn 0.9547 0.2854 0.0841 +vn 0.9346 0.3419 0.0977 +vn 0.9387 0.3295 0.1014 +vn 0.8686 0.4855 0.0991 +vn 0.8715 0.4795 0.1029 +vn 0.7348 0.5936 0.3282 +vn 0.7400 0.5913 0.3205 +vn 0.6495 0.7604 0.0022 +vn 0.6206 0.6257 -0.4727 +vn 0.5212 0.6356 -0.5695 +vn 0.6433 0.7648 0.0349 +vn 0.6146 0.7655 -0.1903 +vn 0.5127 0.7783 -0.3625 +vn 0.0372 0.9703 -0.2390 +vn 0.0184 0.9702 -0.2417 +vn 0.7028 0.6366 0.3176 +vn 0.6991 0.6377 0.3234 +vn 0.4809 0.8570 -0.1852 +vn 0.4356 0.8648 -0.2498 +vn 0.6977 0.7101 0.0950 +vn 0.6950 0.7114 0.1048 +vn 0.3612 0.9137 -0.1862 +vn 0.3238 0.9183 -0.2278 +vn 0.6347 0.7726 0.0147 +vn 0.6346 0.7727 0.0146 +vn 0.2215 0.9548 -0.1980 +vn 0.1828 0.9579 -0.2214 +# 798 vertex normals + +vt 0.4398 0.0481 -0.3276 +vt 0.4476 0.0289 -0.3276 +vt 0.4700 0.0289 -0.4052 +vt 0.4655 0.0481 -0.4052 +vt 0.4322 0.0698 -0.3276 +vt 0.4609 0.0698 -0.4052 +vt 0.4253 0.0942 -0.3276 +vt 0.4565 0.0942 -0.4052 +vt 0.4195 0.1211 -0.3276 +vt 0.4531 0.1211 -0.4052 +vt 0.4134 0.0481 -0.1983 +vt 0.4245 0.0289 -0.1983 +vt 0.4033 0.0698 -0.1983 +vt 0.3943 0.0942 -0.1983 +vt 0.3866 0.1211 -0.1983 +vt 0.3871 0.0481 -0.0172 +vt 0.4015 0.0289 -0.0172 +vt 0.3746 0.0698 -0.0172 +vt 0.3637 0.0942 -0.0172 +vt 0.3539 0.1211 -0.0172 +vt 0.3618 0.0481 0.2155 +vt 0.3794 0.0289 0.2155 +vt 0.3466 0.0698 0.2155 +vt 0.3333 0.0942 0.2155 +vt 0.3213 0.1211 0.2155 +vt 0.4737 0.0123 -0.4052 +vt 0.4923 0.0123 -0.4310 +vt 0.4909 0.0289 -0.4310 +vt 0.4876 0.1211 -0.4310 +vt 0.4873 0.1506 -0.4310 +vt 0.4512 0.1506 -0.4052 +vt 0.3103 0.1506 0.2155 +vt 0.2760 0.1506 0.5000 +vt 0.2885 0.1211 0.5000 +vt 0.3590 0.0289 0.5000 +vt 0.3816 0.0123 0.5000 +vt 0.3999 0.0123 0.2155 +vt 0.4898 0.0481 -0.4310 +vt 0.4154 0.1506 -0.3276 +vt 0.3031 0.0942 0.5000 +vt 0.4182 0.0123 -0.0172 +vt 0.4888 0.0698 -0.4310 +vt 0.3800 0.1506 -0.1983 +vt 0.3197 0.0698 0.5000 +vt 0.4366 0.0123 -0.1983 +vt 0.4881 0.0942 -0.4310 +vt 0.3450 0.1506 -0.0172 +vt 0.3383 0.0481 0.5000 +vt 0.4551 0.0123 -0.3276 +vt 0.4098 0.2158 -0.3276 +vt 0.4124 0.1822 -0.3276 +vt 0.4501 0.1822 -0.4052 +vt 0.4491 0.2158 -0.4052 +vt 0.4078 0.2520 -0.3276 +vt 0.4483 0.2520 -0.4052 +vt 0.4065 0.2914 -0.3276 +vt 0.4478 0.2914 -0.4052 +vt 0.4061 0.3345 -0.3276 +vt 0.4477 0.3345 -0.4052 +vt 0.3703 0.2158 -0.1983 +vt 0.3746 0.1822 -0.1983 +vt 0.3671 0.2520 -0.1983 +vt 0.3651 0.2914 -0.1983 +vt 0.3646 0.3345 -0.1983 +vt 0.3310 0.2158 -0.0172 +vt 0.3372 0.1822 -0.0172 +vt 0.3266 0.2520 -0.0172 +vt 0.3240 0.2914 -0.0172 +vt 0.3233 0.3345 -0.0172 +vt 0.2927 0.2158 0.2155 +vt 0.3006 0.1822 0.2155 +vt 0.2870 0.2520 0.2155 +vt 0.2835 0.2914 0.2155 +vt 0.2824 0.3345 0.2155 +vt 0.4872 0.1822 -0.4310 +vt 0.4891 0.3345 -0.4310 +vt 0.4898 0.3820 -0.4310 +vt 0.4482 0.3820 -0.4052 +vt 0.2838 0.3820 0.2155 +vt 0.2433 0.3820 0.5000 +vt 0.2421 0.3345 0.5000 +vt 0.2652 0.1822 0.5000 +vt 0.4875 0.2158 -0.4310 +vt 0.4068 0.3820 -0.3276 +vt 0.2440 0.2914 0.5000 +vt 0.4879 0.2520 -0.4310 +vt 0.3656 0.3820 -0.1983 +vt 0.2488 0.2520 0.5000 +vt 0.4885 0.2914 -0.4310 +vt 0.3246 0.3820 -0.0172 +vt 0.2560 0.2158 0.5000 +vt 0.4128 0.4993 -0.3531 +vt 0.4090 0.4369 -0.3356 +vt 0.4497 0.4369 -0.4151 +vt 0.4524 0.4992 -0.4371 +vt 0.4177 0.5654 -0.3707 +vt 0.4557 0.5652 -0.4591 +vt 0.4231 0.6316 -0.3787 +vt 0.4592 0.6314 -0.4690 +vt 0.4287 0.6941 -0.3675 +vt 0.4622 0.6940 -0.4551 +vt 0.3729 0.4994 -0.2155 +vt 0.3684 0.4369 -0.2037 +vt 0.3790 0.5657 -0.2274 +vt 0.3863 0.6320 -0.2328 +vt 0.3945 0.6944 -0.2252 +vt 0.3333 0.4996 -0.0262 +vt 0.3279 0.4370 -0.0200 +vt 0.3404 0.5660 -0.0323 +vt 0.3495 0.6323 -0.0351 +vt 0.3602 0.6946 -0.0312 +vt 0.2940 0.4997 0.2130 +vt 0.2878 0.4370 0.2147 +vt 0.3026 0.5662 0.2112 +vt 0.3135 0.6325 0.2104 +vt 0.3266 0.6948 0.2115 +vt 0.4906 0.4368 -0.4418 +vt 0.4944 0.6939 -0.4849 +vt 0.4948 0.7492 -0.4310 +vt 0.4644 0.7492 -0.4052 +vt 0.3420 0.7492 0.2155 +vt 0.3112 0.7492 0.5000 +vt 0.2942 0.6949 0.5000 +vt 0.2479 0.4370 0.5000 +vt 0.4916 0.4991 -0.4655 +vt 0.4339 0.7492 -0.3276 +vt 0.2791 0.6326 0.5000 +vt 0.4926 0.5652 -0.4892 +vt 0.4033 0.7492 -0.1983 +vt 0.2661 0.5662 0.5000 +vt 0.4936 0.6313 -0.5000 +vt 0.3727 0.7492 -0.0172 +vt 0.2556 0.4998 0.5000 +vt 0.4469 0.8427 -0.1386 +vt 0.4396 0.7977 -0.2503 +vt 0.4669 0.7978 -0.3182 +vt 0.4708 0.8429 -0.2024 +vt 0.4552 0.8841 0.0000 +vt 0.4755 0.8845 -0.0603 +vt 0.4639 0.9219 0.1577 +vt 0.4801 0.9224 0.1057 +vt 0.4725 0.9558 0.3269 +vt 0.4839 0.9567 0.2933 +vt 0.4231 0.8422 -0.0345 +vt 0.4128 0.7974 -0.1358 +vt 0.4344 0.8835 0.0927 +vt 0.4467 0.9209 0.2328 +vt 0.4600 0.9543 0.3728 +vt 0.3993 0.8415 0.1079 +vt 0.3858 0.7970 0.0267 +vt 0.4136 0.8823 0.2112 +vt 0.4295 0.9192 0.3212 +vt 0.4476 0.9519 0.4226 +vt 0.3753 0.8405 0.2867 +vt 0.3584 0.7966 0.2382 +vt 0.3934 0.8806 0.3491 +vt 0.4135 0.9166 0.4135 +vt 0.4364 0.9484 0.4678 +vt 0.4949 0.7979 -0.3405 +vt 0.4932 0.9569 0.2802 +vt 0.4923 0.9877 0.5000 +vt 0.4862 0.9872 0.5000 +vt 0.4628 0.9758 0.5000 +vt 0.4571 0.9705 0.5000 +vt 0.4274 0.9438 0.5000 +vt 0.3301 0.7962 0.5000 +vt 0.4948 0.8430 -0.2241 +vt 0.4803 0.9858 0.5000 +vt 0.3998 0.9130 0.5000 +vt 0.4945 0.8845 -0.0819 +vt 0.4744 0.9834 0.5000 +vt 0.3744 0.8781 0.5000 +vt 0.4940 0.9225 0.0862 +vt 0.4685 0.9801 0.5000 +vt 0.3512 0.8392 0.5000 +vt 0.5966 0.0481 -0.0172 +vt 0.5833 0.0289 -0.0172 +vt 0.6067 0.0289 0.2155 +vt 0.6237 0.0481 0.2155 +vt 0.6079 0.0698 -0.0172 +vt 0.6382 0.0698 0.2155 +vt 0.6178 0.0942 -0.0172 +vt 0.6509 0.0942 0.2155 +vt 0.6267 0.1211 -0.0172 +vt 0.6623 0.1211 0.2155 +vt 0.5687 0.0481 -0.1983 +vt 0.5592 0.0289 -0.1983 +vt 0.5773 0.0698 -0.1983 +vt 0.5849 0.0942 -0.1983 +vt 0.5917 0.1211 -0.1983 +vt 0.5410 0.0481 -0.3276 +vt 0.5352 0.0289 -0.3276 +vt 0.5468 0.0698 -0.3276 +vt 0.5523 0.0942 -0.3276 +vt 0.5570 0.1211 -0.3276 +vt 0.5144 0.0481 -0.4052 +vt 0.5121 0.0289 -0.4052 +vt 0.5172 0.0698 -0.4052 +vt 0.5200 0.0942 -0.4052 +vt 0.5224 0.1211 -0.4052 +vt 0.5866 0.0123 0.2155 +vt 0.6057 0.0123 0.5000 +vt 0.6283 0.0289 0.5000 +vt 0.6988 0.1211 0.5000 +vt 0.7113 0.1506 0.5000 +vt 0.6731 0.1506 0.2155 +vt 0.5237 0.1506 -0.4052 +vt 0.5110 0.0123 -0.4052 +vt 0.6490 0.0481 0.5000 +vt 0.6352 0.1506 -0.0172 +vt 0.5298 0.0123 -0.3276 +vt 0.6676 0.0698 0.5000 +vt 0.5977 0.1506 -0.1983 +vt 0.5487 0.0123 -0.1983 +vt 0.6842 0.0942 0.5000 +vt 0.5605 0.1506 -0.3276 +vt 0.5676 0.0123 -0.0172 +vt 0.6497 0.2158 -0.0172 +vt 0.6431 0.1822 -0.0172 +vt 0.6829 0.1822 0.2155 +vt 0.6910 0.2158 0.2155 +vt 0.6547 0.2520 -0.0172 +vt 0.6971 0.2520 0.2155 +vt 0.6579 0.2914 -0.0172 +vt 0.7009 0.2914 0.2155 +vt 0.6593 0.3345 -0.0172 +vt 0.7024 0.3345 0.2155 +vt 0.6080 0.2158 -0.1983 +vt 0.6031 0.1822 -0.1983 +vt 0.6119 0.2520 -0.1983 +vt 0.6147 0.2914 -0.1983 +vt 0.6162 0.3345 -0.1983 +vt 0.5666 0.2158 -0.3276 +vt 0.5635 0.1822 -0.3276 +vt 0.5694 0.2520 -0.3276 +vt 0.5718 0.2914 -0.3276 +vt 0.5733 0.3345 -0.3276 +vt 0.5262 0.2158 -0.4052 +vt 0.5247 0.1822 -0.4052 +vt 0.5279 0.2520 -0.4052 +vt 0.5295 0.2914 -0.4052 +vt 0.5309 0.3345 -0.4052 +vt 0.7221 0.1822 0.5000 +vt 0.7452 0.3345 0.5000 +vt 0.7440 0.3820 0.5000 +vt 0.7011 0.3820 0.2155 +vt 0.5316 0.3820 -0.4052 +vt 0.7313 0.2158 0.5000 +vt 0.6584 0.3820 -0.0172 +vt 0.7385 0.2520 0.5000 +vt 0.6159 0.3820 -0.1983 +vt 0.7433 0.2914 0.5000 +vt 0.5737 0.3820 -0.3276 +vt 0.6514 0.4996 -0.0262 +vt 0.6557 0.4370 -0.0200 +vt 0.6975 0.4370 0.2147 +vt 0.6918 0.4997 0.2130 +vt 0.6455 0.5660 -0.0323 +vt 0.6839 0.5662 0.2112 +vt 0.6377 0.6323 -0.0351 +vt 0.6738 0.6325 0.2104 +vt 0.6279 0.6946 -0.0312 +vt 0.6612 0.6948 0.2115 +vt 0.6110 0.4994 -0.2155 +vt 0.6141 0.4369 -0.2037 +vt 0.6066 0.5657 -0.2274 +vt 0.6009 0.6320 -0.2328 +vt 0.5939 0.6944 -0.2252 +vt 0.5707 0.4993 -0.3531 +vt 0.5727 0.4369 -0.3356 +vt 0.5677 0.5654 -0.3707 +vt 0.5640 0.6316 -0.3787 +vt 0.5599 0.6941 -0.3675 +vt 0.5308 0.4992 -0.4371 +vt 0.5315 0.4369 -0.4151 +vt 0.5295 0.5652 -0.4591 +vt 0.5280 0.6314 -0.4690 +vt 0.5265 0.6940 -0.4551 +vt 0.7394 0.4370 0.5000 +vt 0.6931 0.6949 0.5000 +vt 0.6761 0.7492 0.5000 +vt 0.6460 0.7492 0.2155 +vt 0.5252 0.7492 -0.4052 +vt 0.7317 0.4998 0.5000 +vt 0.6159 0.7492 -0.0172 +vt 0.7212 0.5662 0.5000 +vt 0.5857 0.7492 -0.1983 +vt 0.7082 0.6326 0.5000 +vt 0.5555 0.7492 -0.3276 +vt 0.5889 0.8415 0.1079 +vt 0.6027 0.7970 0.0267 +vt 0.6295 0.7966 0.2382 +vt 0.6124 0.8405 0.2867 +vt 0.5741 0.8823 0.2112 +vt 0.5940 0.8806 0.3491 +vt 0.5575 0.9192 0.3212 +vt 0.5735 0.9166 0.4135 +vt 0.5388 0.9519 0.4226 +vt 0.5504 0.9484 0.4678 +vt 0.5656 0.8422 -0.0345 +vt 0.5763 0.7974 -0.1358 +vt 0.5537 0.8835 0.0927 +vt 0.5406 0.9209 0.2328 +vt 0.5263 0.9543 0.3728 +vt 0.5422 0.8427 -0.1386 +vt 0.5498 0.7977 -0.2503 +vt 0.5333 0.8841 0.0000 +vt 0.5236 0.9219 0.1577 +vt 0.5139 0.9558 0.3269 +vt 0.5187 0.8429 -0.2024 +vt 0.5229 0.7978 -0.3182 +vt 0.5134 0.8845 -0.0603 +vt 0.5078 0.9224 0.1057 +vt 0.5025 0.9567 0.2933 +vt 0.6572 0.7962 0.5000 +vt 0.5600 0.9438 0.5000 +vt 0.5302 0.9705 0.5000 +vt 0.5237 0.9758 0.5000 +vt 0.4984 0.9872 0.5000 +vt 0.6361 0.8392 0.5000 +vt 0.5173 0.9801 0.5000 +vt 0.6129 0.8781 0.5000 +vt 0.5109 0.9834 0.5000 +vt 0.5875 0.9130 0.5000 +vt 0.5046 0.9858 0.5000 +# 325 texture coords + +g lotu_petal_15 +s 1 +f 9751/4876/11971 9752/4877/11972 9753/4878/11973 9754/4879/11974 +f 9755/4880/11975 9751/4876/11971 9754/4879/11974 9756/4881/11976 +f 9757/4882/11977 9755/4880/11975 9756/4881/11976 9758/4883/11978 +f 9759/4884/11979 9757/4882/11977 9758/4883/11978 9760/4885/11980 +f 9761/4886/11981 9762/4887/11982 9752/4877/11972 9751/4876/11971 +f 9763/4888/11983 9761/4886/11981 9751/4876/11971 9755/4880/11975 +f 9764/4889/11984 9763/4888/11983 9755/4880/11975 9757/4882/11977 +f 9765/4890/11985 9764/4889/11984 9757/4882/11977 9759/4884/11979 +f 9766/4891/11986 9767/4892/11987 9762/4887/11982 9761/4886/11981 +f 9768/4893/11988 9766/4891/11986 9761/4886/11981 9763/4888/11983 +f 9769/4894/11989 9768/4893/11988 9763/4888/11983 9764/4889/11984 +f 9770/4895/11990 9769/4894/11989 9764/4889/11984 9765/4890/11985 +f 9771/4896/11991 9772/4897/11992 9767/4892/11987 9766/4891/11986 +f 9773/4898/11993 9771/4896/11991 9766/4891/11986 9768/4893/11988 +f 9774/4899/11994 9773/4898/11993 9768/4893/11988 9769/4894/11989 +f 9775/4900/11995 9774/4899/11994 9769/4894/11989 9770/4895/11990 +f 9753/4878/11973 9776/4901/11996 9777/4902/11997 9778/4903/11998 +f 9779/4904/11999 9780/4905/12000 9781/4906/12001 9760/4885/11980 +f 9775/4900/11995 9782/4907/12002 9783/4908/12003 9784/4909/12004 +f 9785/4910/12005 9786/4911/12006 9787/4912/12007 9772/4897/11992 +f 9754/4879/11974 9753/4878/11973 9778/4903/11998 9788/4913/12008 +f 9760/4885/11980 9781/4906/12001 9789/4914/12009 9759/4884/11979 +f 9774/4899/11994 9775/4900/11995 9784/4909/12004 9790/4915/12010 +f 9772/4897/11992 9787/4912/12007 9791/4916/12011 9767/4892/11987 +f 9756/4881/11976 9754/4879/11974 9788/4913/12008 9792/4917/12012 +f 9759/4884/11979 9789/4914/12009 9793/4918/12013 9765/4890/11985 +f 9773/4898/11993 9774/4899/11994 9790/4915/12010 9794/4919/12014 +f 9767/4892/11987 9791/4916/12011 9795/4920/12015 9762/4887/11982 +f 9758/4883/11978 9756/4881/11976 9792/4917/12012 9796/4921/12016 +f 9765/4890/11985 9793/4918/12013 9797/4922/12017 9770/4895/11990 +f 9771/4896/11991 9773/4898/11993 9794/4919/12014 9798/4923/12018 +f 9762/4887/11982 9795/4920/12015 9799/4924/12019 9752/4877/11972 +f 9760/4885/11980 9758/4883/11978 9796/4921/12016 9779/4904/11999 +f 9770/4895/11990 9797/4922/12017 9782/4907/12002 9775/4900/11995 +f 9772/4897/11992 9771/4896/11991 9798/4923/12018 9785/4910/12005 +f 9752/4877/11972 9799/4924/12019 9776/4901/11996 9753/4878/11973 +f 9800/4925/12020 9801/4926/12021 9802/4927/12022 9803/4928/12023 +f 9804/4929/12024 9800/4925/12020 9803/4928/12023 9805/4930/12025 +f 9806/4931/12026 9804/4929/12024 9805/4930/12025 9807/4932/12027 +f 9808/4933/12028 9806/4931/12026 9807/4932/12027 9809/4934/12029 +f 9810/4935/12030 9811/4936/12031 9801/4926/12021 9800/4925/12020 +f 9812/4937/12032 9810/4935/12030 9800/4925/12020 9804/4929/12024 +f 9813/4938/12033 9812/4937/12032 9804/4929/12024 9806/4931/12026 +f 9814/4939/12034 9813/4938/12033 9806/4931/12026 9808/4933/12028 +f 9815/4940/12035 9816/4941/12036 9811/4936/12031 9810/4935/12030 +f 9817/4942/12037 9815/4940/12035 9810/4935/12030 9812/4937/12032 +f 9818/4943/12038 9817/4942/12037 9812/4937/12032 9813/4938/12033 +f 9819/4944/12039 9818/4943/12038 9813/4938/12033 9814/4939/12034 +f 9820/4945/12040 9821/4946/12041 9816/4941/12036 9815/4940/12035 +f 9822/4947/12042 9820/4945/12040 9815/4940/12035 9817/4942/12037 +f 9823/4948/12043 9822/4947/12042 9817/4942/12037 9818/4943/12038 +f 9824/4949/12044 9823/4948/12043 9818/4943/12038 9819/4944/12039 +f 9802/4927/12022 9781/4906/12001 9780/4905/12000 9825/4950/12045 +f 9826/4951/12046 9827/4952/12047 9828/4953/12048 9809/4934/12029 +f 9824/4949/12044 9829/4954/12049 9830/4955/12050 9831/4956/12051 +f 9832/4957/12052 9783/4908/12003 9782/4907/12002 9821/4946/12041 +f 9803/4928/12023 9802/4927/12022 9825/4950/12045 9833/4958/12053 +f 9809/4934/12029 9828/4953/12048 9834/4959/12054 9808/4933/12028 +f 9823/4948/12043 9824/4949/12044 9831/4956/12051 9835/4960/12055 +f 9821/4946/12041 9782/4907/12002 9797/4922/12017 9816/4941/12036 +f 9805/4930/12025 9803/4928/12023 9833/4958/12053 9836/4961/12056 +f 9808/4933/12028 9834/4959/12054 9837/4962/12057 9814/4939/12034 +f 9822/4947/12042 9823/4948/12043 9835/4960/12055 9838/4963/12058 +f 9816/4941/12036 9797/4922/12017 9793/4918/12013 9811/4936/12031 +f 9807/4932/12027 9805/4930/12025 9836/4961/12056 9839/4964/12059 +f 9814/4939/12034 9837/4962/12057 9840/4965/12060 9819/4944/12039 +f 9820/4945/12040 9822/4947/12042 9838/4963/12058 9841/4966/12061 +f 9811/4936/12031 9793/4918/12013 9789/4914/12009 9801/4926/12021 +f 9809/4934/12029 9807/4932/12027 9839/4964/12059 9826/4951/12046 +f 9819/4944/12039 9840/4965/12060 9829/4954/12049 9824/4949/12044 +f 9821/4946/12041 9820/4945/12040 9841/4966/12061 9832/4957/12052 +f 9801/4926/12021 9789/4914/12009 9781/4906/12001 9802/4927/12022 +f 9842/4967/12062 9843/4968/12063 9844/4969/12064 9845/4970/12065 +f 9846/4971/12066 9842/4967/12062 9845/4970/12065 9847/4972/12067 +f 9848/4973/12068 9846/4971/12066 9847/4972/12067 9849/4974/12069 +f 9850/4975/12070 9848/4973/12068 9849/4974/12069 9851/4976/12071 +f 9852/4977/12072 9853/4978/12073 9843/4968/12063 9842/4967/12062 +f 9854/4979/12074 9852/4977/12072 9842/4967/12062 9846/4971/12066 +f 9855/4980/12075 9854/4979/12074 9846/4971/12066 9848/4973/12068 +f 9856/4981/12076 9855/4980/12075 9848/4973/12068 9850/4975/12070 +f 9857/4982/12077 9858/4983/12078 9853/4978/12073 9852/4977/12072 +f 9859/4984/12079 9857/4982/12077 9852/4977/12072 9854/4979/12074 +f 9860/4985/12080 9859/4984/12079 9854/4979/12074 9855/4980/12075 +f 9861/4986/12081 9860/4985/12080 9855/4980/12075 9856/4981/12076 +f 9862/4987/12082 9863/4988/12083 9858/4983/12078 9857/4982/12077 +f 9864/4989/12084 9862/4987/12082 9857/4982/12077 9859/4984/12079 +f 9865/4990/12085 9864/4989/12084 9859/4984/12079 9860/4985/12080 +f 9866/4991/12086 9865/4990/12085 9860/4985/12080 9861/4986/12081 +f 9844/4969/12064 9828/4953/12048 9827/4952/12047 9867/4992/12087 +f 9868/4993/12088 9869/4994/12089 9870/4995/12090 9851/4976/12071 +f 9866/4991/12086 9871/4996/12091 9872/4997/12092 9873/4998/12093 +f 9874/4999/12094 9830/4955/12050 9829/4954/12049 9863/4988/12083 +f 9845/4970/12065 9844/4969/12064 9867/4992/12087 9875/5000/12095 +f 9851/4976/12071 9870/4995/12090 9876/5001/12096 9850/4975/12070 +f 9865/4990/12085 9866/4991/12086 9873/4998/12093 9877/5002/12097 +f 9863/4988/12083 9829/4954/12049 9840/4965/12060 9858/4983/12078 +f 9847/4972/12067 9845/4970/12065 9875/5000/12095 9878/5003/12098 +f 9850/4975/12070 9876/5001/12096 9879/5004/12099 9856/4981/12076 +f 9864/4989/12084 9865/4990/12085 9877/5002/12097 9880/5005/12100 +f 9858/4983/12078 9840/4965/12060 9837/4962/12057 9853/4978/12073 +f 9849/4974/12069 9847/4972/12067 9878/5003/12098 9881/5006/12101 +f 9856/4981/12076 9879/5004/12099 9882/5007/12102 9861/4986/12081 +f 9862/4987/12082 9864/4989/12084 9880/5005/12100 9883/5008/12103 +f 9853/4978/12073 9837/4962/12057 9834/4959/12054 9843/4968/12063 +f 9851/4976/12071 9849/4974/12069 9881/5006/12101 9868/4993/12088 +f 9861/4986/12081 9882/5007/12102 9871/4996/12091 9866/4991/12086 +f 9863/4988/12083 9862/4987/12082 9883/5008/12103 9874/4999/12094 +f 9843/4968/12063 9834/4959/12054 9828/4953/12048 9844/4969/12064 +f 9884/5009/12104 9885/5010/12105 9886/5011/12106 9887/5012/12107 +f 9888/5013/12108 9884/5009/12104 9887/5012/12107 9889/5014/12109 +f 9890/5015/12110 9888/5013/12108 9889/5014/12109 9891/5016/12111 +f 9892/5017/12112 9890/5015/12110 9891/5016/12111 9893/5018/12113 +f 9894/5019/12114 9895/5020/12115 9885/5010/12105 9884/5009/12104 +f 9896/5021/12116 9894/5019/12114 9884/5009/12104 9888/5013/12108 +f 9897/5022/12117 9896/5021/12116 9888/5013/12108 9890/5015/12110 +f 9898/5023/12118 9897/5022/12117 9890/5015/12110 9892/5017/12112 +f 9899/5024/12119 9900/5025/12120 9895/5020/12115 9894/5019/12114 +f 9901/5026/12121 9899/5024/12119 9894/5019/12114 9896/5021/12116 +f 9902/5027/12122 9901/5026/12121 9896/5021/12116 9897/5022/12117 +f 9903/5028/12123 9902/5027/12122 9897/5022/12117 9898/5023/12118 +f 9904/5029/12124 9905/5030/12125 9900/5025/12120 9899/5024/12119 +f 9906/5031/12126 9904/5029/12124 9899/5024/12119 9901/5026/12121 +f 9907/5032/12127 9906/5031/12126 9901/5026/12121 9902/5027/12122 +f 9908/5033/12128 9907/5032/12127 9902/5027/12122 9903/5028/12123 +f 9886/5011/12106 9870/4995/12090 9869/4994/12089 9909/5034/12129 +f 9910/5035/12130 9911/5036/12131 9912/5037/12132 9893/5018/12113 +f 9908/5033/12128 9913/5038/12133 9914/5039/12134 9915/5040/12135 +f 9916/5041/12136 9872/4997/12092 9871/4996/12091 9905/5030/12125 +f 9887/5012/12107 9886/5011/12106 9909/5034/12129 9917/5042/12137 +f 9893/5018/12113 9912/5037/12132 9918/5043/12138 9892/5017/12112 +f 9907/5032/12127 9908/5033/12128 9915/5040/12135 9919/5044/12139 +f 9905/5030/12125 9871/4996/12091 9882/5007/12102 9900/5025/12120 +f 9889/5014/12109 9887/5012/12107 9917/5042/12137 9920/5045/12140 +f 9892/5017/12112 9918/5043/12138 9921/5046/12141 9898/5023/12118 +f 9906/5031/12126 9907/5032/12127 9919/5044/12139 9922/5047/12142 +f 9900/5025/12120 9882/5007/12102 9879/5004/12099 9895/5020/12115 +f 9891/5016/12111 9889/5014/12109 9920/5045/12140 9923/5048/12143 +f 9898/5023/12118 9921/5046/12141 9924/5049/12144 9903/5028/12123 +f 9904/5029/12124 9906/5031/12126 9922/5047/12142 9925/5050/12145 +f 9895/5020/12115 9879/5004/12099 9876/5001/12096 9885/5010/12105 +f 9893/5018/12113 9891/5016/12111 9923/5048/12143 9910/5035/12130 +f 9903/5028/12123 9924/5049/12144 9913/5038/12133 9908/5033/12128 +f 9905/5030/12125 9904/5029/12124 9925/5050/12145 9916/5041/12136 +f 9885/5010/12105 9876/5001/12096 9870/4995/12090 9886/5011/12106 +f 9926/5051/12146 9927/5052/12147 9928/5053/12148 9929/5054/12149 +f 9930/5055/12150 9926/5051/12146 9929/5054/12149 9931/5056/12151 +f 9932/5057/12152 9930/5055/12150 9931/5056/12151 9933/5058/12153 +f 9934/5059/12154 9932/5057/12152 9933/5058/12153 9935/5060/12155 +f 9936/5061/12156 9937/5062/12157 9927/5052/12147 9926/5051/12146 +f 9938/5063/12158 9936/5061/12156 9926/5051/12146 9930/5055/12150 +f 9939/5064/12159 9938/5063/12158 9930/5055/12150 9932/5057/12152 +f 9940/5065/12160 9939/5064/12159 9932/5057/12152 9934/5059/12154 +f 9941/5066/12161 9942/5067/12162 9937/5062/12157 9936/5061/12156 +f 9943/5068/12163 9941/5066/12161 9936/5061/12156 9938/5063/12158 +f 9944/5069/12164 9943/5068/12163 9938/5063/12158 9939/5064/12159 +f 9945/5070/12165 9944/5069/12164 9939/5064/12159 9940/5065/12160 +f 9946/5071/12166 9947/5072/12167 9942/5067/12162 9941/5066/12161 +f 9948/5073/12168 9946/5071/12166 9941/5066/12161 9943/5068/12163 +f 9949/5074/12169 9948/5073/12168 9943/5068/12163 9944/5069/12164 +f 9950/5075/12170 9949/5074/12169 9944/5069/12164 9945/5070/12165 +f 9928/5053/12148 9951/5076/12171 9952/5077/12172 9953/5078/12173 +f 9954/5079/12174 9955/5080/12175 9956/5081/12176 9935/5060/12155 +f 9950/5075/12170 9957/5082/12177 9780/4905/12000 9779/4904/11999 +f 9778/4903/11998 9777/4902/11997 9958/5083/12178 9947/5072/12167 +f 9929/5054/12149 9928/5053/12148 9953/5078/12173 9959/5084/12179 +f 9935/5060/12155 9956/5081/12176 9960/5085/12180 9934/5059/12154 +f 9949/5074/12169 9950/5075/12170 9779/4904/11999 9796/4921/12016 +f 9947/5072/12167 9958/5083/12178 9961/5086/12181 9942/5067/12162 +f 9931/5056/12151 9929/5054/12149 9959/5084/12179 9962/5087/12182 +f 9934/5059/12154 9960/5085/12180 9963/5088/12183 9940/5065/12160 +f 9948/5073/12168 9949/5074/12169 9796/4921/12016 9792/4917/12012 +f 9942/5067/12162 9961/5086/12181 9964/5089/12184 9937/5062/12157 +f 9933/5058/12153 9931/5056/12151 9962/5087/12182 9965/5090/12185 +f 9940/5065/12160 9963/5088/12183 9966/5091/12186 9945/5070/12165 +f 9946/5071/12166 9948/5073/12168 9792/4917/12012 9788/4913/12008 +f 9937/5062/12157 9964/5089/12184 9967/5092/12187 9927/5052/12147 +f 9935/5060/12155 9933/5058/12153 9965/5090/12185 9954/5079/12174 +f 9945/5070/12165 9966/5091/12186 9957/5082/12177 9950/5075/12170 +f 9947/5072/12167 9946/5071/12166 9788/4913/12008 9778/4903/11998 +f 9927/5052/12147 9967/5092/12187 9951/5076/12171 9928/5053/12148 +f 9968/5093/12188 9969/5094/12189 9970/5095/12190 9971/5096/12191 +f 9972/5097/12192 9968/5093/12188 9971/5096/12191 9973/5098/12193 +f 9974/5099/12194 9972/5097/12192 9973/5098/12193 9975/5100/12195 +f 9976/5101/12196 9974/5099/12194 9975/5100/12195 9977/5102/12197 +f 9978/5103/12198 9979/5104/12199 9969/5094/12189 9968/5093/12188 +f 9980/5105/12200 9978/5103/12198 9968/5093/12188 9972/5097/12192 +f 9981/5106/12201 9980/5105/12200 9972/5097/12192 9974/5099/12194 +f 9982/5107/12202 9981/5106/12201 9974/5099/12194 9976/5101/12196 +f 9983/5108/12203 9984/5109/12204 9979/5104/12199 9978/5103/12198 +f 9985/5110/12205 9983/5108/12203 9978/5103/12198 9980/5105/12200 +f 9986/5111/12206 9985/5110/12205 9980/5105/12200 9981/5106/12201 +f 9987/5112/12207 9986/5111/12206 9981/5106/12201 9982/5107/12202 +f 9988/5113/12208 9989/5114/12209 9984/5109/12204 9983/5108/12203 +f 9990/5115/12210 9988/5113/12208 9983/5108/12203 9985/5110/12205 +f 9991/5116/12211 9990/5115/12210 9985/5110/12205 9986/5111/12206 +f 9992/5117/12212 9991/5116/12211 9986/5111/12206 9987/5112/12207 +f 9970/5095/12190 9956/5081/12176 9955/5080/12175 9993/5118/12213 +f 9994/5119/12214 9995/5120/12215 9996/5121/12216 9977/5102/12197 +f 9992/5117/12212 9997/5122/12217 9827/4952/12047 9826/4951/12046 +f 9825/4950/12045 9780/4905/12000 9957/5082/12177 9989/5114/12209 +f 9971/5096/12191 9970/5095/12190 9993/5118/12213 9998/5123/12218 +f 9977/5102/12197 9996/5121/12216 9999/5124/12219 9976/5101/12196 +f 9991/5116/12211 9992/5117/12212 9826/4951/12046 9839/4964/12059 +f 9989/5114/12209 9957/5082/12177 9966/5091/12186 9984/5109/12204 +f 9973/5098/12193 9971/5096/12191 9998/5123/12218 10000/5125/12220 +f 9976/5101/12196 9999/5124/12219 10001/5126/12221 9982/5107/12202 +f 9990/5115/12210 9991/5116/12211 9839/4964/12059 9836/4961/12056 +f 9984/5109/12204 9966/5091/12186 9963/5088/12183 9979/5104/12199 +f 9975/5100/12195 9973/5098/12193 10000/5125/12220 10002/5127/12222 +f 9982/5107/12202 10001/5126/12221 10003/5128/12223 9987/5112/12207 +f 9988/5113/12208 9990/5115/12210 9836/4961/12056 9833/4958/12053 +f 9979/5104/12199 9963/5088/12183 9960/5085/12180 9969/5094/12189 +f 9977/5102/12197 9975/5100/12195 10002/5127/12222 9994/5119/12214 +f 9987/5112/12207 10003/5128/12223 9997/5122/12217 9992/5117/12212 +f 9989/5114/12209 9988/5113/12208 9833/4958/12053 9825/4950/12045 +f 9969/5094/12189 9960/5085/12180 9956/5081/12176 9970/5095/12190 +f 10004/5129/12224 10005/5130/12225 10006/5131/12226 10007/5132/12227 +f 10008/5133/12228 10004/5129/12224 10007/5132/12227 10009/5134/12229 +f 10010/5135/12230 10008/5133/12228 10009/5134/12229 10011/5136/12231 +f 10012/5137/12232 10010/5135/12230 10011/5136/12231 10013/5138/12233 +f 10014/5139/12234 10015/5140/12235 10005/5130/12225 10004/5129/12224 +f 10016/5141/12236 10014/5139/12234 10004/5129/12224 10008/5133/12228 +f 10017/5142/12237 10016/5141/12236 10008/5133/12228 10010/5135/12230 +f 10018/5143/12238 10017/5142/12237 10010/5135/12230 10012/5137/12232 +f 10019/5144/12239 10020/5145/12240 10015/5140/12235 10014/5139/12234 +f 10021/5146/12241 10019/5144/12239 10014/5139/12234 10016/5141/12236 +f 10022/5147/12242 10021/5146/12241 10016/5141/12236 10017/5142/12237 +f 10023/5148/12243 10022/5147/12242 10017/5142/12237 10018/5143/12238 +f 10024/5149/12244 10025/5150/12245 10020/5145/12240 10019/5144/12239 +f 10026/5151/12246 10024/5149/12244 10019/5144/12239 10021/5146/12241 +f 10027/5152/12247 10026/5151/12246 10021/5146/12241 10022/5147/12242 +f 10028/5153/12248 10027/5152/12247 10022/5147/12242 10023/5148/12243 +f 10006/5131/12226 9996/5121/12216 9995/5120/12215 10029/5154/12249 +f 10030/5155/12250 10031/5156/12251 10032/5157/12252 10013/5138/12233 +f 10028/5153/12248 10033/5158/12253 9869/4994/12089 9868/4993/12088 +f 9867/4992/12087 9827/4952/12047 9997/5122/12217 10025/5150/12245 +f 10007/5132/12227 10006/5131/12226 10029/5154/12249 10034/5159/12254 +f 10013/5138/12233 10032/5157/12252 10035/5160/12255 10012/5137/12232 +f 10027/5152/12247 10028/5153/12248 9868/4993/12088 9881/5006/12101 +f 10025/5150/12245 9997/5122/12217 10003/5128/12223 10020/5145/12240 +f 10009/5134/12229 10007/5132/12227 10034/5159/12254 10036/5161/12256 +f 10012/5137/12232 10035/5160/12255 10037/5162/12257 10018/5143/12238 +f 10026/5151/12246 10027/5152/12247 9881/5006/12101 9878/5003/12098 +f 10020/5145/12240 10003/5128/12223 10001/5126/12221 10015/5140/12235 +f 10011/5136/12231 10009/5134/12229 10036/5161/12256 10038/5163/12258 +f 10018/5143/12238 10037/5162/12257 10039/5164/12259 10023/5148/12243 +f 10024/5149/12244 10026/5151/12246 9878/5003/12098 9875/5000/12095 +f 10015/5140/12235 10001/5126/12221 9999/5124/12219 10005/5130/12225 +f 10013/5138/12233 10011/5136/12231 10038/5163/12258 10030/5155/12250 +f 10023/5148/12243 10039/5164/12259 10033/5158/12253 10028/5153/12248 +f 10025/5150/12245 10024/5149/12244 9875/5000/12095 9867/4992/12087 +f 10005/5130/12225 9999/5124/12219 9996/5121/12216 10006/5131/12226 +f 10040/5165/12260 10041/5166/12261 10042/5167/12262 10043/5168/12263 +f 10044/5169/12264 10040/5165/12260 10043/5168/12263 10045/5170/12265 +f 10046/5171/12266 10044/5169/12264 10045/5170/12265 10047/5172/12267 +f 10048/5173/12268 10046/5171/12266 10047/5172/12267 10049/5174/12269 +f 10050/5175/12270 10051/5176/12271 10041/5166/12261 10040/5165/12260 +f 10052/5177/12272 10050/5175/12270 10040/5165/12260 10044/5169/12264 +f 10053/5178/12273 10052/5177/12272 10044/5169/12264 10046/5171/12266 +f 10054/5179/12274 10053/5178/12273 10046/5171/12266 10048/5173/12268 +f 10055/5180/12275 10056/5181/12276 10051/5176/12271 10050/5175/12270 +f 10057/5182/12277 10055/5180/12275 10050/5175/12270 10052/5177/12272 +f 10058/5183/12278 10057/5182/12277 10052/5177/12272 10053/5178/12273 +f 10059/5184/12279 10058/5183/12278 10053/5178/12273 10054/5179/12274 +f 10060/5185/12280 10061/5186/12281 10056/5181/12276 10055/5180/12275 +f 10062/5187/12282 10060/5185/12280 10055/5180/12275 10057/5182/12277 +f 10063/5188/12283 10062/5187/12282 10057/5182/12277 10058/5183/12278 +f 10064/5189/12284 10063/5188/12283 10058/5183/12278 10059/5184/12279 +f 10042/5167/12262 10032/5157/12252 10031/5156/12251 10065/5190/12285 +f 10066/5191/12286 10067/5192/12287 10068/5193/12288 10049/5174/12269 +f 10064/5189/12284 10069/5194/12289 9911/5036/12131 9910/5035/12130 +f 9909/5034/12129 9869/4994/12089 10033/5158/12253 10061/5186/12281 +f 10043/5168/12263 10042/5167/12262 10065/5190/12285 10070/5195/12290 +f 10049/5174/12269 10068/5193/12288 10071/5196/12291 10048/5173/12268 +f 10063/5188/12283 10064/5189/12284 9910/5035/12130 9923/5048/12143 +f 10061/5186/12281 10033/5158/12253 10039/5164/12259 10056/5181/12276 +f 10045/5170/12265 10043/5168/12263 10070/5195/12290 10072/5197/12292 +f 10048/5173/12268 10071/5196/12291 10073/5198/12293 10054/5179/12274 +f 10062/5187/12282 10063/5188/12283 9923/5048/12143 9920/5045/12140 +f 10056/5181/12276 10039/5164/12259 10037/5162/12257 10051/5176/12271 +f 10047/5172/12267 10045/5170/12265 10072/5197/12292 10074/5199/12294 +f 10054/5179/12274 10073/5198/12293 10075/5200/12295 10059/5184/12279 +f 10060/5185/12280 10062/5187/12282 9920/5045/12140 9917/5042/12137 +f 10051/5176/12271 10037/5162/12257 10035/5160/12255 10041/5166/12261 +f 10049/5174/12269 10047/5172/12267 10074/5199/12294 10066/5191/12286 +f 10059/5184/12279 10075/5200/12295 10069/5194/12289 10064/5189/12284 +f 10061/5186/12281 10060/5185/12280 9917/5042/12137 9909/5034/12129 +f 10041/5166/12261 10035/5160/12255 10032/5157/12252 10042/5167/12262 +f 10076/4878/12296 10077/4877/12297 10078/4876/12298 10079/4879/12299 +f 10079/4879/12299 10078/4876/12298 10080/4880/12300 10081/4881/12301 +f 10081/4881/12301 10080/4880/12300 10082/4882/12302 10083/4883/12303 +f 10083/4883/12303 10082/4882/12302 10084/4884/12304 10085/4885/12305 +f 10077/4877/12297 10086/4887/12306 10087/4886/12307 10078/4876/12298 +f 10078/4876/12298 10087/4886/12307 10088/4888/12308 10080/4880/12300 +f 10080/4880/12300 10088/4888/12308 10089/4889/12309 10082/4882/12302 +f 10082/4882/12302 10089/4889/12309 10090/4890/12310 10084/4884/12304 +f 10086/4887/12306 10091/4892/12311 10092/4891/12312 10087/4886/12307 +f 10087/4886/12307 10092/4891/12312 10093/4893/12313 10088/4888/12308 +f 10088/4888/12308 10093/4893/12313 10094/4894/12314 10089/4889/12309 +f 10089/4889/12309 10094/4894/12314 10095/4895/12315 10090/4890/12310 +f 10091/4892/12311 10096/4897/12316 10097/4896/12317 10092/4891/12312 +f 10092/4891/12312 10097/4896/12317 10098/4898/12318 10093/4893/12313 +f 10093/4893/12313 10098/4898/12318 10099/4899/12319 10094/4894/12314 +f 10094/4894/12314 10099/4899/12319 10100/4900/12320 10095/4895/12315 +f 10101/4902/12321 10102/4901/12322 10076/4878/12296 10103/4903/12323 +f 10104/4906/12324 10105/4905/12325 10106/4904/12326 10085/4885/12305 +f 10107/4908/12327 10108/4907/12328 10100/4900/12320 10109/4909/12329 +f 10110/4912/12330 10111/4911/12331 10112/4910/12332 10096/4897/12316 +f 10103/4903/12323 10076/4878/12296 10079/4879/12299 10113/4913/12333 +f 10114/4914/12334 10104/4906/12324 10085/4885/12305 10084/4884/12304 +f 10109/4909/12329 10100/4900/12320 10099/4899/12319 10115/4915/12335 +f 10116/4916/12336 10110/4912/12330 10096/4897/12316 10091/4892/12311 +f 10113/4913/12333 10079/4879/12299 10081/4881/12301 10117/4917/12337 +f 10118/4918/12338 10114/4914/12334 10084/4884/12304 10090/4890/12310 +f 10115/4915/12335 10099/4899/12319 10098/4898/12318 10119/4919/12339 +f 10120/4920/12340 10116/4916/12336 10091/4892/12311 10086/4887/12306 +f 10117/4917/12337 10081/4881/12301 10083/4883/12303 10121/4921/12341 +f 10122/4922/12342 10118/4918/12338 10090/4890/12310 10095/4895/12315 +f 10119/4919/12339 10098/4898/12318 10097/4896/12317 10123/4923/12343 +f 10124/4924/12344 10120/4920/12340 10086/4887/12306 10077/4877/12297 +f 10121/4921/12341 10083/4883/12303 10085/4885/12305 10106/4904/12326 +f 10108/4907/12328 10122/4922/12342 10095/4895/12315 10100/4900/12320 +f 10123/4923/12343 10097/4896/12317 10096/4897/12316 10112/4910/12332 +f 10102/4901/12322 10124/4924/12344 10077/4877/12297 10076/4878/12296 +f 10125/4927/12345 10126/4926/12346 10127/4925/12347 10128/4928/12348 +f 10128/4928/12348 10127/4925/12347 10129/4929/12349 10130/4930/12350 +f 10130/4930/12350 10129/4929/12349 10131/4931/12351 10132/4932/12352 +f 10132/4932/12352 10131/4931/12351 10133/4933/12353 10134/4934/12354 +f 10126/4926/12346 10135/4936/12355 10136/4935/12356 10127/4925/12347 +f 10127/4925/12347 10136/4935/12356 10137/4937/12357 10129/4929/12349 +f 10129/4929/12349 10137/4937/12357 10138/4938/12358 10131/4931/12351 +f 10131/4931/12351 10138/4938/12358 10139/4939/12359 10133/4933/12353 +f 10135/4936/12355 10140/4941/12360 10141/4940/12361 10136/4935/12356 +f 10136/4935/12356 10141/4940/12361 10142/4942/12362 10137/4937/12357 +f 10137/4937/12357 10142/4942/12362 10143/4943/12363 10138/4938/12358 +f 10138/4938/12358 10143/4943/12363 10144/4944/12364 10139/4939/12359 +f 10140/4941/12360 10145/4946/12365 10146/4945/12366 10141/4940/12361 +f 10141/4940/12361 10146/4945/12366 10147/4947/12367 10142/4942/12362 +f 10142/4942/12362 10147/4947/12367 10148/4948/12368 10143/4943/12363 +f 10143/4943/12363 10148/4948/12368 10149/4949/12369 10144/4944/12364 +f 10105/4905/12325 10104/4906/12324 10125/4927/12345 10150/4950/12370 +f 10151/4953/12371 10152/4952/12372 10153/4951/12373 10134/4934/12354 +f 10154/4955/12374 10155/4954/12375 10149/4949/12369 10156/4956/12376 +f 10108/4907/12328 10107/4908/12327 10157/4957/12377 10145/4946/12365 +f 10150/4950/12370 10125/4927/12345 10128/4928/12348 10158/4958/12378 +f 10159/4959/12379 10151/4953/12371 10134/4934/12354 10133/4933/12353 +f 10156/4956/12376 10149/4949/12369 10148/4948/12368 10160/4960/12380 +f 10122/4922/12342 10108/4907/12328 10145/4946/12365 10140/4941/12360 +f 10158/4958/12378 10128/4928/12348 10130/4930/12350 10161/4961/12381 +f 10162/4962/12382 10159/4959/12379 10133/4933/12353 10139/4939/12359 +f 10160/4960/12380 10148/4948/12368 10147/4947/12367 10163/4963/12383 +f 10118/4918/12338 10122/4922/12342 10140/4941/12360 10135/4936/12355 +f 10161/4961/12381 10130/4930/12350 10132/4932/12352 10164/4964/12384 +f 10165/4965/12385 10162/4962/12382 10139/4939/12359 10144/4944/12364 +f 10163/4963/12383 10147/4947/12367 10146/4945/12366 10166/4966/12386 +f 10114/4914/12334 10118/4918/12338 10135/4936/12355 10126/4926/12346 +f 10164/4964/12384 10132/4932/12352 10134/4934/12354 10153/4951/12373 +f 10155/4954/12375 10165/4965/12385 10144/4944/12364 10149/4949/12369 +f 10166/4966/12386 10146/4945/12366 10145/4946/12365 10157/4957/12377 +f 10104/4906/12324 10114/4914/12334 10126/4926/12346 10125/4927/12345 +f 10167/4969/12387 10168/4968/12388 10169/4967/12389 10170/4970/12390 +f 10170/4970/12390 10169/4967/12389 10171/4971/12391 10172/4972/12392 +f 10172/4972/12392 10171/4971/12391 10173/4973/12393 10174/4974/12394 +f 10174/4974/12394 10173/4973/12393 10175/4975/12395 10176/4976/12396 +f 10168/4968/12388 10177/4978/12397 10178/4977/12398 10169/4967/12389 +f 10169/4967/12389 10178/4977/12398 10179/4979/12399 10171/4971/12391 +f 10171/4971/12391 10179/4979/12399 10180/4980/12400 10173/4973/12393 +f 10173/4973/12393 10180/4980/12400 10181/4981/12401 10175/4975/12395 +f 10177/4978/12397 10182/4983/12402 10183/4982/12403 10178/4977/12398 +f 10178/4977/12398 10183/4982/12403 10184/4984/12404 10179/4979/12399 +f 10179/4979/12399 10184/4984/12404 10185/4985/12405 10180/4980/12400 +f 10180/4980/12400 10185/4985/12405 10186/4986/12406 10181/4981/12401 +f 10182/4983/12402 10187/4988/12407 10188/4987/12408 10183/4982/12403 +f 10183/4982/12403 10188/4987/12408 10189/4989/12409 10184/4984/12404 +f 10184/4984/12404 10189/4989/12409 10190/4990/12410 10185/4985/12405 +f 10185/4985/12405 10190/4990/12410 10191/4991/12411 10186/4986/12406 +f 10152/4952/12372 10151/4953/12371 10167/4969/12387 10192/4992/12412 +f 10193/4995/12413 10194/4994/12414 10195/4993/12415 10176/4976/12396 +f 10196/4997/12416 10197/4996/12417 10191/4991/12411 10198/4998/12418 +f 10155/4954/12375 10154/4955/12374 10199/4999/12419 10187/4988/12407 +f 10192/4992/12412 10167/4969/12387 10170/4970/12390 10200/5000/12420 +f 10201/5001/12421 10193/4995/12413 10176/4976/12396 10175/4975/12395 +f 10198/4998/12418 10191/4991/12411 10190/4990/12410 10202/5002/12422 +f 10165/4965/12385 10155/4954/12375 10187/4988/12407 10182/4983/12402 +f 10200/5000/12420 10170/4970/12390 10172/4972/12392 10203/5003/12423 +f 10204/5004/12424 10201/5001/12421 10175/4975/12395 10181/4981/12401 +f 10202/5002/12422 10190/4990/12410 10189/4989/12409 10205/5005/12425 +f 10162/4962/12382 10165/4965/12385 10182/4983/12402 10177/4978/12397 +f 10203/5003/12423 10172/4972/12392 10174/4974/12394 10206/5006/12426 +f 10207/5007/12427 10204/5004/12424 10181/4981/12401 10186/4986/12406 +f 10205/5005/12425 10189/4989/12409 10188/4987/12408 10208/5008/12428 +f 10159/4959/12379 10162/4962/12382 10177/4978/12397 10168/4968/12388 +f 10206/5006/12426 10174/4974/12394 10176/4976/12396 10195/4993/12415 +f 10197/4996/12417 10207/5007/12427 10186/4986/12406 10191/4991/12411 +f 10208/5008/12428 10188/4987/12408 10187/4988/12407 10199/4999/12419 +f 10151/4953/12371 10159/4959/12379 10168/4968/12388 10167/4969/12387 +f 10209/5011/12429 10210/5010/12430 10211/5009/12431 10212/5012/12432 +f 10212/5012/12432 10211/5009/12431 10213/5013/12433 10214/5014/12434 +f 10214/5014/12434 10213/5013/12433 10215/5015/12435 10216/5016/12436 +f 10216/5016/12436 10215/5015/12435 10217/5017/12437 10218/5018/12438 +f 10210/5010/12430 10219/5020/12439 10220/5019/12440 10211/5009/12431 +f 10211/5009/12431 10220/5019/12440 10221/5021/12441 10213/5013/12433 +f 10213/5013/12433 10221/5021/12441 10222/5022/12442 10215/5015/12435 +f 10215/5015/12435 10222/5022/12442 10223/5023/12443 10217/5017/12437 +f 10219/5020/12439 10224/5025/12444 10225/5024/12445 10220/5019/12440 +f 10220/5019/12440 10225/5024/12445 10226/5026/12446 10221/5021/12441 +f 10221/5021/12441 10226/5026/12446 10227/5027/12447 10222/5022/12442 +f 10222/5022/12442 10227/5027/12447 10228/5028/12448 10223/5023/12443 +f 10224/5025/12444 10229/5030/12449 10230/5029/12450 10225/5024/12445 +f 10225/5024/12445 10230/5029/12450 10231/5031/12451 10226/5026/12446 +f 10226/5026/12446 10231/5031/12451 10232/5032/12452 10227/5027/12447 +f 10227/5027/12447 10232/5032/12452 10233/5033/12453 10228/5028/12448 +f 10194/4994/12414 10193/4995/12413 10209/5011/12429 10234/5034/12454 +f 10235/5037/12455 10236/5036/12456 10237/5035/12457 10218/5018/12438 +f 10238/5039/12458 10239/5038/12459 10233/5033/12453 10240/5040/12460 +f 10197/4996/12417 10196/4997/12416 10241/5041/12461 10229/5030/12449 +f 10234/5034/12454 10209/5011/12429 10212/5012/12432 10242/5042/12462 +f 10243/5043/12463 10235/5037/12455 10218/5018/12438 10217/5017/12437 +f 10240/5040/12460 10233/5033/12453 10232/5032/12452 10244/5044/12464 +f 10207/5007/12427 10197/4996/12417 10229/5030/12449 10224/5025/12444 +f 10242/5042/12462 10212/5012/12432 10214/5014/12434 10245/5045/12465 +f 10246/5046/12466 10243/5043/12463 10217/5017/12437 10223/5023/12443 +f 10244/5044/12464 10232/5032/12452 10231/5031/12451 10247/5047/12467 +f 10204/5004/12424 10207/5007/12427 10224/5025/12444 10219/5020/12439 +f 10245/5045/12465 10214/5014/12434 10216/5016/12436 10248/5048/12468 +f 10249/5049/12469 10246/5046/12466 10223/5023/12443 10228/5028/12448 +f 10247/5047/12467 10231/5031/12451 10230/5029/12450 10250/5050/12470 +f 10201/5001/12421 10204/5004/12424 10219/5020/12439 10210/5010/12430 +f 10248/5048/12468 10216/5016/12436 10218/5018/12438 10237/5035/12457 +f 10239/5038/12459 10249/5049/12469 10228/5028/12448 10233/5033/12453 +f 10250/5050/12470 10230/5029/12450 10229/5030/12449 10241/5041/12461 +f 10193/4995/12413 10201/5001/12421 10210/5010/12430 10209/5011/12429 +f 10251/5053/12471 10252/5052/12472 10253/5051/12473 10254/5054/12474 +f 10254/5054/12474 10253/5051/12473 10255/5055/12475 10256/5056/12476 +f 10256/5056/12476 10255/5055/12475 10257/5057/12477 10258/5058/12478 +f 10258/5058/12478 10257/5057/12477 10259/5059/12479 10260/5060/12480 +f 10252/5052/12472 10261/5062/12481 10262/5061/12482 10253/5051/12473 +f 10253/5051/12473 10262/5061/12482 10263/5063/12483 10255/5055/12475 +f 10255/5055/12475 10263/5063/12483 10264/5064/12484 10257/5057/12477 +f 10257/5057/12477 10264/5064/12484 10265/5065/12485 10259/5059/12479 +f 10261/5062/12481 10266/5067/12486 10267/5066/12487 10262/5061/12482 +f 10262/5061/12482 10267/5066/12487 10268/5068/12488 10263/5063/12483 +f 10263/5063/12483 10268/5068/12488 10269/5069/12489 10264/5064/12484 +f 10264/5064/12484 10269/5069/12489 10270/5070/12490 10265/5065/12485 +f 10266/5067/12486 10271/5072/12491 10272/5071/12492 10267/5066/12487 +f 10267/5066/12487 10272/5071/12492 10273/5073/12493 10268/5068/12488 +f 10268/5068/12488 10273/5073/12493 10274/5074/12494 10269/5069/12489 +f 10269/5069/12489 10274/5074/12494 10275/5075/12495 10270/5070/12490 +f 10276/5077/12496 10277/5076/12497 10251/5053/12471 10278/5078/12498 +f 10279/5081/12499 10280/5080/12500 10281/5079/12501 10260/5060/12480 +f 10105/4905/12325 10282/5082/12502 10275/5075/12495 10106/4904/12326 +f 10283/5083/12503 10101/4902/12321 10103/4903/12323 10271/5072/12491 +f 10278/5078/12498 10251/5053/12471 10254/5054/12474 10284/5084/12504 +f 10285/5085/12505 10279/5081/12499 10260/5060/12480 10259/5059/12479 +f 10106/4904/12326 10275/5075/12495 10274/5074/12494 10121/4921/12341 +f 10286/5086/12506 10283/5083/12503 10271/5072/12491 10266/5067/12486 +f 10284/5084/12504 10254/5054/12474 10256/5056/12476 10287/5087/12507 +f 10288/5088/12508 10285/5085/12505 10259/5059/12479 10265/5065/12485 +f 10121/4921/12341 10274/5074/12494 10273/5073/12493 10117/4917/12337 +f 10289/5089/12509 10286/5086/12506 10266/5067/12486 10261/5062/12481 +f 10287/5087/12507 10256/5056/12476 10258/5058/12478 10290/5090/12510 +f 10291/5091/12511 10288/5088/12508 10265/5065/12485 10270/5070/12490 +f 10117/4917/12337 10273/5073/12493 10272/5071/12492 10113/4913/12333 +f 10292/5092/12512 10289/5089/12509 10261/5062/12481 10252/5052/12472 +f 10290/5090/12510 10258/5058/12478 10260/5060/12480 10281/5079/12501 +f 10282/5082/12502 10291/5091/12511 10270/5070/12490 10275/5075/12495 +f 10113/4913/12333 10272/5071/12492 10271/5072/12491 10103/4903/12323 +f 10277/5076/12497 10292/5092/12512 10252/5052/12472 10251/5053/12471 +f 10293/5095/12513 10294/5094/12514 10295/5093/12515 10296/5096/12516 +f 10296/5096/12516 10295/5093/12515 10297/5097/12517 10298/5098/12518 +f 10298/5098/12518 10297/5097/12517 10299/5099/12519 10300/5100/12520 +f 10300/5100/12520 10299/5099/12519 10301/5101/12521 10302/5102/12522 +f 10294/5094/12514 10303/5104/12523 10304/5103/12524 10295/5093/12515 +f 10295/5093/12515 10304/5103/12524 10305/5105/12525 10297/5097/12517 +f 10297/5097/12517 10305/5105/12525 10306/5106/12526 10299/5099/12519 +f 10299/5099/12519 10306/5106/12526 10307/5107/12527 10301/5101/12521 +f 10303/5104/12523 10308/5109/12528 10309/5108/12529 10304/5103/12524 +f 10304/5103/12524 10309/5108/12529 10310/5110/12530 10305/5105/12525 +f 10305/5105/12525 10310/5110/12530 10311/5111/12531 10306/5106/12526 +f 10306/5106/12526 10311/5111/12531 10312/5112/12532 10307/5107/12527 +f 10308/5109/12528 10313/5114/12533 10314/5113/12534 10309/5108/12529 +f 10309/5108/12529 10314/5113/12534 10315/5115/12535 10310/5110/12530 +f 10310/5110/12530 10315/5115/12535 10316/5116/12536 10311/5111/12531 +f 10311/5111/12531 10316/5116/12536 10317/5117/12537 10312/5112/12532 +f 10280/5080/12500 10279/5081/12499 10293/5095/12513 10318/5118/12538 +f 10319/5121/12539 10320/5120/12540 10321/5119/12541 10302/5102/12522 +f 10152/4952/12372 10322/5122/12542 10317/5117/12537 10153/4951/12373 +f 10282/5082/12502 10105/4905/12325 10150/4950/12370 10313/5114/12533 +f 10318/5118/12538 10293/5095/12513 10296/5096/12516 10323/5123/12543 +f 10324/5124/12544 10319/5121/12539 10302/5102/12522 10301/5101/12521 +f 10153/4951/12373 10317/5117/12537 10316/5116/12536 10164/4964/12384 +f 10291/5091/12511 10282/5082/12502 10313/5114/12533 10308/5109/12528 +f 10323/5123/12543 10296/5096/12516 10298/5098/12518 10325/5125/12545 +f 10326/5126/12546 10324/5124/12544 10301/5101/12521 10307/5107/12527 +f 10164/4964/12384 10316/5116/12536 10315/5115/12535 10161/4961/12381 +f 10288/5088/12508 10291/5091/12511 10308/5109/12528 10303/5104/12523 +f 10325/5125/12545 10298/5098/12518 10300/5100/12520 10327/5127/12547 +f 10328/5128/12548 10326/5126/12546 10307/5107/12527 10312/5112/12532 +f 10161/4961/12381 10315/5115/12535 10314/5113/12534 10158/4958/12378 +f 10285/5085/12505 10288/5088/12508 10303/5104/12523 10294/5094/12514 +f 10327/5127/12547 10300/5100/12520 10302/5102/12522 10321/5119/12541 +f 10322/5122/12542 10328/5128/12548 10312/5112/12532 10317/5117/12537 +f 10158/4958/12378 10314/5113/12534 10313/5114/12533 10150/4950/12370 +f 10279/5081/12499 10285/5085/12505 10294/5094/12514 10293/5095/12513 +f 10329/5131/12549 10330/5130/12550 10331/5129/12551 10332/5132/12552 +f 10332/5132/12552 10331/5129/12551 10333/5133/12553 10334/5134/12554 +f 10334/5134/12554 10333/5133/12553 10335/5135/12555 10336/5136/12556 +f 10336/5136/12556 10335/5135/12555 10337/5137/12557 10338/5138/12558 +f 10330/5130/12550 10339/5140/12559 10340/5139/12560 10331/5129/12551 +f 10331/5129/12551 10340/5139/12560 10341/5141/12561 10333/5133/12553 +f 10333/5133/12553 10341/5141/12561 10342/5142/12562 10335/5135/12555 +f 10335/5135/12555 10342/5142/12562 10343/5143/12563 10337/5137/12557 +f 10339/5140/12559 10344/5145/12564 10345/5144/12565 10340/5139/12560 +f 10340/5139/12560 10345/5144/12565 10346/5146/12566 10341/5141/12561 +f 10341/5141/12561 10346/5146/12566 10347/5147/12567 10342/5142/12562 +f 10342/5142/12562 10347/5147/12567 10348/5148/12568 10343/5143/12563 +f 10344/5145/12564 10349/5150/12569 10350/5149/12570 10345/5144/12565 +f 10345/5144/12565 10350/5149/12570 10351/5151/12571 10346/5146/12566 +f 10346/5146/12566 10351/5151/12571 10352/5152/12572 10347/5147/12567 +f 10347/5147/12567 10352/5152/12572 10353/5153/12573 10348/5148/12568 +f 10320/5120/12540 10319/5121/12539 10329/5131/12549 10354/5154/12574 +f 10355/5157/12575 10356/5156/12576 10357/5155/12577 10338/5138/12558 +f 10194/4994/12414 10358/5158/12578 10353/5153/12573 10195/4993/12415 +f 10322/5122/12542 10152/4952/12372 10192/4992/12412 10349/5150/12569 +f 10354/5154/12574 10329/5131/12549 10332/5132/12552 10359/5159/12579 +f 10360/5160/12580 10355/5157/12575 10338/5138/12558 10337/5137/12557 +f 10195/4993/12415 10353/5153/12573 10352/5152/12572 10206/5006/12426 +f 10328/5128/12548 10322/5122/12542 10349/5150/12569 10344/5145/12564 +f 10359/5159/12579 10332/5132/12552 10334/5134/12554 10361/5161/12581 +f 10362/5162/12582 10360/5160/12580 10337/5137/12557 10343/5143/12563 +f 10206/5006/12426 10352/5152/12572 10351/5151/12571 10203/5003/12423 +f 10326/5126/12546 10328/5128/12548 10344/5145/12564 10339/5140/12559 +f 10361/5161/12581 10334/5134/12554 10336/5136/12556 10363/5163/12583 +f 10364/5164/12584 10362/5162/12582 10343/5143/12563 10348/5148/12568 +f 10203/5003/12423 10351/5151/12571 10350/5149/12570 10200/5000/12420 +f 10324/5124/12544 10326/5126/12546 10339/5140/12559 10330/5130/12550 +f 10363/5163/12583 10336/5136/12556 10338/5138/12558 10357/5155/12577 +f 10358/5158/12578 10364/5164/12584 10348/5148/12568 10353/5153/12573 +f 10200/5000/12420 10350/5149/12570 10349/5150/12569 10192/4992/12412 +f 10319/5121/12539 10324/5124/12544 10330/5130/12550 10329/5131/12549 +f 10365/5167/12585 10366/5166/12586 10367/5165/12587 10368/5168/12588 +f 10368/5168/12588 10367/5165/12587 10369/5169/12589 10370/5170/12590 +f 10370/5170/12590 10369/5169/12589 10371/5171/12591 10372/5172/12592 +f 10372/5172/12592 10371/5171/12591 10373/5173/12593 10374/5174/12594 +f 10366/5166/12586 10375/5176/12595 10376/5175/12596 10367/5165/12587 +f 10367/5165/12587 10376/5175/12596 10377/5177/12597 10369/5169/12589 +f 10369/5169/12589 10377/5177/12597 10378/5178/12598 10371/5171/12591 +f 10371/5171/12591 10378/5178/12598 10379/5179/12599 10373/5173/12593 +f 10375/5176/12595 10380/5181/12600 10381/5180/12601 10376/5175/12596 +f 10376/5175/12596 10381/5180/12601 10382/5182/12602 10377/5177/12597 +f 10377/5177/12597 10382/5182/12602 10383/5183/12603 10378/5178/12598 +f 10378/5178/12598 10383/5183/12603 10384/5184/12604 10379/5179/12599 +f 10380/5181/12600 10385/5186/12605 10386/5185/12606 10381/5180/12601 +f 10381/5180/12601 10386/5185/12606 10387/5187/12607 10382/5182/12602 +f 10382/5182/12602 10387/5187/12607 10388/5188/12608 10383/5183/12603 +f 10383/5183/12603 10388/5188/12608 10389/5189/12609 10384/5184/12604 +f 10356/5156/12576 10355/5157/12575 10365/5167/12585 10390/5190/12610 +f 10391/5193/12611 10392/5192/12612 10393/5191/12613 10374/5174/12594 +f 10236/5036/12456 10394/5194/12614 10389/5189/12609 10237/5035/12457 +f 10358/5158/12578 10194/4994/12414 10234/5034/12454 10385/5186/12605 +f 10390/5190/12610 10365/5167/12585 10368/5168/12588 10395/5195/12615 +f 10396/5196/12616 10391/5193/12611 10374/5174/12594 10373/5173/12593 +f 10237/5035/12457 10389/5189/12609 10388/5188/12608 10248/5048/12468 +f 10364/5164/12584 10358/5158/12578 10385/5186/12605 10380/5181/12600 +f 10395/5195/12615 10368/5168/12588 10370/5170/12590 10397/5197/12617 +f 10398/5198/12618 10396/5196/12616 10373/5173/12593 10379/5179/12599 +f 10248/5048/12468 10388/5188/12608 10387/5187/12607 10245/5045/12465 +f 10362/5162/12582 10364/5164/12584 10380/5181/12600 10375/5176/12595 +f 10397/5197/12617 10370/5170/12590 10372/5172/12592 10399/5199/12619 +f 10400/5200/12620 10398/5198/12618 10379/5179/12599 10384/5184/12604 +f 10245/5045/12465 10387/5187/12607 10386/5185/12606 10242/5042/12462 +f 10360/5160/12580 10362/5162/12582 10375/5176/12595 10366/5166/12586 +f 10399/5199/12619 10372/5172/12592 10374/5174/12594 10393/5191/12613 +f 10394/5194/12614 10400/5200/12620 10384/5184/12604 10389/5189/12609 +f 10242/5042/12462 10386/5185/12606 10385/5186/12605 10234/5034/12454 +f 10355/5157/12575 10360/5160/12580 10366/5166/12586 10365/5167/12585 +s 2 +f 10102/4901/12621 10101/4902/12622 9777/4902/12623 9776/4901/12624 +s 4 +f 10107/4908/12625 10109/4909/12626 9784/4909/12627 9783/4908/12628 +f 10112/4910/12629 10111/4911/12630 9786/4911/12631 9785/4910/12632 +s 2 +f 10111/4911/12633 10110/4912/12634 9787/4912/12635 9786/4911/12636 +s 4 +f 10109/4909/12626 10115/4915/12637 9790/4915/12638 9784/4909/12627 +s 2 +f 10110/4912/12634 10116/4916/12639 9791/4916/12640 9787/4912/12635 +s 4 +f 10115/4915/12637 10119/4919/12641 9794/4919/12642 9790/4915/12638 +s 2 +f 10116/4916/12639 10120/4920/12643 9795/4920/12644 9791/4916/12640 +s 4 +f 10119/4919/12641 10123/4923/12645 9798/4923/12646 9794/4919/12642 +s 2 +f 10120/4920/12643 10124/4924/12647 9799/4924/12648 9795/4920/12644 +s 4 +f 10123/4923/12645 10112/4910/12629 9785/4910/12632 9798/4923/12646 +s 2 +f 10124/4924/12647 10102/4901/12621 9776/4901/12624 9799/4924/12648 +s 4 +f 10154/4955/12649 10156/4956/12650 9831/4956/12651 9830/4955/12652 +f 10157/4957/12653 10107/4908/12625 9783/4908/12628 9832/4957/12654 +f 10156/4956/12650 10160/4960/12655 9835/4960/12656 9831/4956/12651 +f 10160/4960/12655 10163/4963/12657 9838/4963/12658 9835/4960/12656 +f 10163/4963/12657 10166/4966/12659 9841/4966/12660 9838/4963/12658 +f 10166/4966/12659 10157/4957/12653 9832/4957/12654 9841/4966/12660 +f 10196/4997/12661 10198/4998/12662 9873/4998/12663 9872/4997/12664 +f 10199/4999/12665 10154/4955/12649 9830/4955/12652 9874/4999/12666 +f 10198/4998/12662 10202/5002/12667 9877/5002/12668 9873/4998/12663 +f 10202/5002/12667 10205/5005/12669 9880/5005/12670 9877/5002/12668 +f 10205/5005/12669 10208/5008/12671 9883/5008/12672 9880/5005/12670 +f 10208/5008/12671 10199/4999/12665 9874/4999/12666 9883/5008/12672 +f 10236/5036/12673 10235/5037/12674 9912/5037/12675 9911/5036/12676 +f 10238/5039/12677 10240/5040/12678 9915/5040/12679 9914/5039/12680 +f 10239/5038/12681 10238/5039/12677 9914/5039/12680 9913/5038/12682 +f 10241/5041/12683 10196/4997/12661 9872/4997/12664 9916/5041/12684 +f 10235/5037/12674 10243/5043/12685 9918/5043/12686 9912/5037/12675 +f 10240/5040/12678 10244/5044/12687 9919/5044/12688 9915/5040/12679 +f 10243/5043/12685 10246/5046/12689 9921/5046/12690 9918/5043/12686 +f 10244/5044/12687 10247/5047/12691 9922/5047/12692 9919/5044/12688 +f 10246/5046/12689 10249/5049/12693 9924/5049/12694 9921/5046/12690 +f 10247/5047/12691 10250/5050/12695 9925/5050/12696 9922/5047/12692 +f 10249/5049/12693 10239/5038/12681 9913/5038/12682 9924/5049/12694 +f 10250/5050/12695 10241/5041/12683 9916/5041/12684 9925/5050/12696 +f 10276/5077/12697 10278/5078/12698 9953/5078/12699 9952/5077/12700 +s 2 +f 10277/5076/12701 10276/5077/12702 9952/5077/12703 9951/5076/12704 +s 4 +f 10281/5079/12705 10280/5080/12706 9955/5080/12707 9954/5079/12708 +s 2 +f 10101/4902/12622 10283/5083/12709 9958/5083/12710 9777/4902/12623 +s 4 +f 10278/5078/12698 10284/5084/12711 9959/5084/12712 9953/5078/12699 +s 2 +f 10283/5083/12709 10286/5086/12713 9961/5086/12714 9958/5083/12710 +s 4 +f 10284/5084/12711 10287/5087/12715 9962/5087/12716 9959/5084/12712 +s 2 +f 10286/5086/12713 10289/5089/12717 9964/5089/12718 9961/5086/12714 +s 4 +f 10287/5087/12715 10290/5090/12719 9965/5090/12720 9962/5087/12716 +s 2 +f 10289/5089/12717 10292/5092/12721 9967/5092/12722 9964/5089/12718 +s 4 +f 10290/5090/12719 10281/5079/12705 9954/5079/12708 9965/5090/12720 +s 2 +f 10292/5092/12721 10277/5076/12701 9951/5076/12704 9967/5092/12722 +s 4 +f 10280/5080/12706 10318/5118/12723 9993/5118/12724 9955/5080/12707 +f 10321/5119/12725 10320/5120/12726 9995/5120/12727 9994/5119/12728 +f 10318/5118/12723 10323/5123/12729 9998/5123/12730 9993/5118/12724 +f 10323/5123/12729 10325/5125/12731 10000/5125/12732 9998/5123/12730 +f 10325/5125/12731 10327/5127/12733 10002/5127/12734 10000/5125/12732 +f 10327/5127/12733 10321/5119/12725 9994/5119/12728 10002/5127/12734 +f 10320/5120/12726 10354/5154/12735 10029/5154/12736 9995/5120/12727 +f 10357/5155/12737 10356/5156/12738 10031/5156/12739 10030/5155/12740 +f 10354/5154/12735 10359/5159/12741 10034/5159/12742 10029/5154/12736 +f 10359/5159/12741 10361/5161/12743 10036/5161/12744 10034/5159/12742 +f 10361/5161/12743 10363/5163/12745 10038/5163/12746 10036/5161/12744 +f 10363/5163/12745 10357/5155/12737 10030/5155/12740 10038/5163/12746 +f 10356/5156/12738 10390/5190/12747 10065/5190/12748 10031/5156/12739 +f 10393/5191/12749 10392/5192/12750 10067/5192/12751 10066/5191/12752 +f 10392/5192/12750 10391/5193/12753 10068/5193/12754 10067/5192/12751 +f 10394/5194/12755 10236/5036/12673 9911/5036/12676 10069/5194/12756 +f 10390/5190/12747 10395/5195/12757 10070/5195/12758 10065/5190/12748 +f 10391/5193/12753 10396/5196/12759 10071/5196/12760 10068/5193/12754 +f 10395/5195/12757 10397/5197/12761 10072/5197/12762 10070/5195/12758 +f 10396/5196/12759 10398/5198/12763 10073/5198/12764 10071/5196/12760 +f 10397/5197/12761 10399/5199/12765 10074/5199/12766 10072/5197/12762 +f 10398/5198/12763 10400/5200/12767 10075/5200/12768 10073/5198/12764 +f 10399/5199/12765 10393/5191/12749 10066/5191/12752 10074/5199/12766 +f 10400/5200/12767 10394/5194/12755 10069/5194/12756 10075/5200/12768 +# 648 polygons + +# +# object lotus_heart +# + +v 0.5620 0.0719 0.0089 +v 0.5020 0.1009 -0.1655 +v 0.4832 0.1908 -0.1169 +v 0.5555 0.1619 0.0527 +v 0.3878 0.1133 -0.2982 +v 0.3915 0.2033 -0.2808 +v 0.2727 0.0792 -0.4254 +v 0.2372 0.1692 -0.4414 +v 0.1055 0.0808 -0.5006 +v 0.0662 0.1708 -0.4739 +v -0.0894 0.1010 -0.4962 +v -0.1291 0.1910 -0.5204 +v -0.2873 0.1274 -0.4113 +v -0.3090 0.2173 -0.3992 +v -0.4443 0.1516 -0.2985 +v -0.4307 0.2415 -0.2913 +v -0.5193 0.1211 -0.1240 +v -0.5421 0.2110 -0.1403 +v -0.5205 0.0461 0.0447 +v -0.5307 0.1361 0.0557 +v -0.5325 0.1249 0.2478 +v -0.5218 0.2148 0.2297 +v -0.4392 0.1387 0.3935 +v -0.4628 0.2286 0.4103 +v -0.2945 0.1057 0.5144 +v -0.3006 0.1957 0.5494 +v -0.1227 0.1132 0.5716 +v -0.1082 0.2031 0.5489 +v 0.0662 0.1093 0.5776 +v 0.0793 0.1992 0.5956 +v 0.2585 0.0500 0.5195 +v 0.2415 0.1399 0.4972 +v 0.4026 0.1233 0.4040 +v 0.3674 0.2132 0.4143 +v 0.4956 0.0916 0.2028 +v 0.4901 0.1815 0.2514 +v 0.4822 0.2808 -0.1265 +v 0.5558 0.2518 0.0687 +v 0.4210 0.2932 -0.3281 +v 0.2486 0.2591 -0.4304 +v 0.0575 0.2607 -0.4919 +v -0.1288 0.2809 -0.4938 +v -0.2736 0.3073 -0.4526 +v -0.3979 0.3315 -0.3047 +v -0.5319 0.3009 -0.1571 +v -0.5296 0.2260 0.0330 +v -0.5079 0.3047 0.2146 +v -0.4321 0.3185 0.3923 +v -0.2741 0.2856 0.5022 +v -0.1012 0.2930 0.5815 +v 0.0878 0.2892 0.5704 +v 0.2527 0.2299 0.5108 +v 0.3940 0.3031 0.3641 +v 0.5114 0.2715 0.2477 +v 0.5067 0.3707 -0.1401 +v 0.5443 0.3417 0.0664 +v 0.4360 0.3831 -0.3490 +v 0.2794 0.3490 -0.4502 +v 0.0628 0.3506 -0.5095 +v -0.1250 0.3708 -0.4811 +v -0.2720 0.3972 -0.4673 +v -0.4047 0.4214 -0.3008 +v -0.5124 0.3908 -0.1605 +v -0.5384 0.3159 0.0366 +v -0.5197 0.3947 0.2102 +v -0.4206 0.4085 0.3992 +v -0.2831 0.3755 0.4661 +v -0.0939 0.3829 0.5857 +v 0.0938 0.3791 0.5610 +v 0.2676 0.3198 0.4926 +v 0.4127 0.3931 0.3524 +v 0.5100 0.3614 0.2312 +v 0.4218 0.1021 0.0501 +v 0.3566 0.1442 -0.0747 +v 0.3089 0.1130 -0.2143 +v 0.1733 0.0833 -0.3167 +v 0.0488 0.0946 -0.3712 +v -0.0903 0.0824 -0.3739 +v -0.2323 0.1183 -0.3035 +v -0.3118 0.1434 -0.1959 +v -0.3956 0.0872 -0.1215 +v -0.3835 0.0286 0.0184 +v -0.4022 0.0987 0.1608 +v -0.3356 0.1205 0.3114 +v -0.1985 0.0845 0.3884 +v -0.0670 0.0895 0.4294 +v 0.0725 0.0982 0.4320 +v 0.1983 0.1105 0.3833 +v 0.2883 0.1210 0.3077 +v 0.3636 0.1137 0.1978 +v 0.2842 0.1265 0.0282 +v 0.2353 0.1251 -0.0681 +v 0.1980 0.1016 -0.1434 +v 0.1221 0.0598 -0.1996 +v 0.0321 0.0826 -0.2512 +v -0.0566 0.0976 -0.2498 +v -0.1354 0.1320 -0.1918 +v -0.2194 0.1189 -0.1252 +v -0.2598 0.0666 -0.0741 +v -0.2535 0.0770 0.0267 +v -0.2606 0.0611 0.1087 +v -0.2181 0.0702 0.2028 +v -0.1625 0.1317 0.2786 +v -0.0598 0.0998 0.2850 +v 0.0296 0.1088 0.2904 +v 0.1223 0.1049 0.2783 +v 0.1883 0.1079 0.2046 +v 0.2443 0.0871 0.1308 +v 0.1522 0.0869 0.0400 +v 0.1327 0.0946 -0.0051 +v 0.0927 0.1014 -0.0455 +v 0.0562 0.0834 -0.0920 +v 0.0084 0.1023 -0.1217 +v -0.0365 0.0876 -0.1253 +v -0.0891 0.1221 -0.0939 +v -0.1251 0.1338 -0.0536 +v -0.1259 0.1100 -0.0003 +v -0.1184 0.0808 0.0444 +v -0.1202 0.1158 0.0917 +v -0.1057 0.1372 0.1197 +v -0.0830 0.1179 0.1423 +v -0.0394 0.1294 0.1428 +v 0.0044 0.1050 0.1463 +v 0.0542 0.0735 0.1406 +v 0.0954 0.1090 0.1316 +v 0.1343 0.1082 0.0911 +v 0.0146 0.1007 0.0077 +v 0.6009 0.9370 -0.0087 +v 0.6047 0.9533 -0.1459 +v 0.5048 0.9436 -0.1036 +v 0.4901 0.9472 0.0280 +v 0.5409 0.9587 -0.1963 +v 0.4975 0.9456 -0.2934 +v 0.4466 0.9146 -0.2759 +v 0.4862 0.9351 -0.1892 +v 0.4405 1.0151 -0.3619 +v 0.2940 0.9699 -0.5023 +v 0.2844 0.9229 -0.4163 +v 0.3811 0.9682 -0.3340 +v 0.2184 0.9903 -0.4975 +v 0.1355 0.9957 -0.5445 +v 0.1214 0.9442 -0.4892 +v 0.2083 0.9460 -0.4596 +v 0.0416 0.9717 -0.5541 +v -0.0616 0.9552 -0.5592 +v -0.0494 0.9206 -0.4897 +v 0.0281 0.9273 -0.4943 +v -0.1368 0.9433 -0.5968 +v -0.3313 0.9942 -0.5108 +v -0.2549 0.9994 -0.4453 +v -0.1264 0.9253 -0.4844 +v -0.3815 1.0029 -0.4647 +v -0.4773 1.0209 -0.3827 +v -0.3757 0.9883 -0.2831 +v -0.2870 0.9858 -0.3891 +v -0.4946 0.9816 -0.3168 +v -0.5507 0.9772 -0.2266 +v -0.4674 0.9341 -0.2131 +v -0.4373 0.9608 -0.2564 +v -0.5826 0.9676 -0.1462 +v -0.6490 0.9674 0.0165 +v -0.5289 0.9262 -0.0118 +v -0.4757 0.9246 -0.1414 +v -0.6146 0.9356 0.0946 +v -0.5666 0.9617 0.1856 +v -0.5030 0.9251 0.1502 +v -0.5409 0.8916 0.0742 +v -0.5522 1.0301 0.2603 +v -0.5222 1.0140 0.4054 +v -0.4329 0.9945 0.3634 +v -0.4667 0.9466 0.2138 +v -0.4756 1.0298 0.4552 +v -0.3313 0.9901 0.5882 +v -0.2796 0.9472 0.4929 +v -0.4135 0.9599 0.4130 +v -0.2514 0.9918 0.5657 +v -0.1546 0.9773 0.6018 +v -0.1354 0.9430 0.5289 +v -0.2081 0.9315 0.5226 +v -0.0785 1.0498 0.6828 +v 0.0616 0.9585 0.6464 +v 0.0689 0.9478 0.5447 +v -0.0555 0.9487 0.5488 +v 0.1149 0.9554 0.6191 +v 0.2795 0.9334 0.5666 +v 0.2517 0.9119 0.4715 +v 0.1238 0.9495 0.5160 +v 0.3412 0.9292 0.5055 +v 0.4057 0.9701 0.4647 +v 0.3405 0.9251 0.3903 +v 0.3126 0.9038 0.4437 +v 0.4575 0.9925 0.4469 +v 0.5776 0.9871 0.3043 +v 0.4779 0.9475 0.2404 +v 0.3609 0.9133 0.3241 +v 0.6116 1.0029 0.2440 +v 0.5940 0.9561 0.0539 +v 0.4903 0.9340 0.0729 +v 0.5072 0.9596 0.2047 +v 0.4442 0.8836 -0.0065 +v 0.4523 0.9178 -0.1099 +v 0.3467 0.9083 -0.0869 +v 0.3334 0.9220 -0.0199 +v 0.4333 0.9527 -0.1617 +v 0.3671 0.9551 -0.2605 +v 0.2967 0.9446 -0.1834 +v 0.3290 0.9612 -0.1242 +v 0.3306 0.9052 -0.3044 +v 0.2582 0.8812 -0.3491 +v 0.2191 0.9201 -0.2814 +v 0.2591 0.9081 -0.2425 +v 0.2128 0.9125 -0.3974 +v 0.1090 0.8913 -0.4324 +v 0.1026 0.9084 -0.3239 +v 0.1648 0.8833 -0.2984 +v 0.0461 0.8913 -0.4132 +v -0.0394 0.9101 -0.4019 +v -0.0175 0.8810 -0.3101 +v 0.0351 0.8733 -0.3198 +v -0.1032 0.8958 -0.4234 +v -0.1975 0.9465 -0.3887 +v -0.1360 0.9029 -0.3015 +v -0.0734 0.8930 -0.3092 +v -0.2393 0.9299 -0.3202 +v -0.3326 0.9688 -0.2454 +v -0.2426 0.8950 -0.1719 +v -0.1869 0.8725 -0.2512 +v -0.3610 0.9507 -0.1937 +v -0.3932 0.9149 -0.1593 +v -0.3111 0.9120 -0.0775 +v -0.2893 0.8994 -0.1234 +v -0.4195 0.9163 -0.1002 +v -0.4562 0.8701 -0.0228 +v -0.3721 0.8506 0.0209 +v -0.3432 0.8750 -0.0220 +v -0.4778 0.8946 0.0281 +v -0.4322 0.8882 0.1348 +v -0.3462 0.8511 0.1576 +v -0.3755 0.8459 0.0853 +v -0.3997 0.9283 0.2129 +v -0.3947 0.9272 0.3173 +v -0.3093 0.8823 0.2795 +v -0.3164 0.9082 0.2311 +v -0.3741 0.9450 0.3887 +v -0.2681 0.8961 0.4565 +v -0.2482 0.8867 0.3261 +v -0.2886 0.8793 0.3183 +v -0.1943 0.9070 0.4360 +v -0.1138 0.9458 0.4499 +v -0.1349 0.9061 0.3712 +v -0.1841 0.8638 0.3480 +v -0.0438 0.9449 0.4982 +v 0.0539 0.9614 0.5005 +v -0.0052 0.9239 0.3898 +v -0.0718 0.9061 0.3963 +v 0.1033 0.9653 0.4700 +v 0.2053 0.9124 0.4213 +v 0.1034 0.8847 0.3330 +v 0.0450 0.9108 0.3546 +v 0.2285 0.9223 0.3850 +v 0.2761 0.9410 0.3284 +v 0.2182 0.9190 0.2742 +v 0.1622 0.8898 0.3128 +v 0.3266 0.9254 0.2811 +v 0.4280 0.9314 0.1992 +v 0.3296 0.9127 0.1525 +v 0.2779 0.9183 0.2157 +v 0.4384 0.9151 0.1368 +v 0.4281 0.8981 0.0536 +v 0.3414 0.9222 0.0424 +v 0.3485 0.9152 0.0968 +v 0.2713 0.7933 0.0017 +v 0.2726 0.7892 -0.0447 +v 0.1633 0.7824 0.0219 +v 0.1631 0.7809 0.0325 +v 0.2504 0.8100 -0.0908 +v 0.2136 0.7947 -0.1195 +v 0.1456 0.7750 -0.0426 +v 0.1515 0.7744 -0.0324 +v 0.1696 0.7551 -0.1561 +v 0.1531 0.7487 -0.1754 +v 0.1118 0.7862 -0.1225 +v 0.1180 0.7864 -0.1165 +v 0.1169 0.7593 -0.2209 +v 0.0735 0.7755 -0.2429 +v 0.0288 0.7917 -0.1355 +v 0.0394 0.7963 -0.1348 +v 0.0207 0.7790 -0.2417 +v -0.0277 0.7814 -0.2404 +v -0.0243 0.7442 -0.1362 +v -0.0133 0.7440 -0.1353 +v -0.0820 0.7709 -0.2506 +v -0.1322 0.7809 -0.2531 +v -0.0991 0.8018 -0.1300 +v -0.0894 0.7993 -0.1304 +v -0.1912 0.7953 -0.2340 +v -0.2358 0.7833 -0.2020 +v -0.1437 0.7416 -0.1264 +v -0.1349 0.7387 -0.1301 +v -0.2683 0.7651 -0.1581 +v -0.2863 0.7689 -0.1099 +v -0.1802 0.7685 -0.0880 +v -0.1750 0.7695 -0.0966 +v -0.2857 0.7589 -0.0522 +v -0.2945 0.7625 -0.0204 +v -0.2296 0.7672 -0.0316 +v -0.2275 0.7676 -0.0382 +v -0.3110 0.7172 0.0341 +v -0.2910 0.7249 0.0795 +v -0.2041 0.7682 0.0381 +v -0.2096 0.7775 0.0293 +v -0.2561 0.7617 0.1386 +v -0.2220 0.7519 0.1731 +v -0.1595 0.7619 0.1004 +v -0.1685 0.7645 0.0901 +v -0.1875 0.7600 0.2106 +v -0.1617 0.7758 0.2425 +v -0.1006 0.7446 0.1643 +v -0.1110 0.7432 0.1542 +v -0.0967 0.7731 0.2739 +v -0.0639 0.7539 0.2935 +v -0.0474 0.7745 0.2376 +v -0.0542 0.7709 0.2319 +v -0.0257 0.7763 0.3470 +v 0.0134 0.7956 0.3462 +v 0.0157 0.8063 0.2440 +v 0.0041 0.8079 0.2455 +v 0.0786 0.7762 0.3263 +v 0.1248 0.7805 0.3148 +v 0.0902 0.7691 0.2187 +v 0.0802 0.7675 0.2245 +v 0.1666 0.8032 0.2999 +v 0.2102 0.8118 0.2677 +v 0.1399 0.7712 0.1879 +v 0.1328 0.7762 0.1926 +v 0.2612 0.7815 0.2151 +v 0.2742 0.7924 0.1627 +v 0.1544 0.8103 0.1459 +v 0.1548 0.8003 0.1557 +v 0.2761 0.7736 0.1047 +v 0.2697 0.7815 0.0563 +v 0.1621 0.7798 0.0868 +v 0.1612 0.7863 0.0986 +v 0.1177 0.8788 -0.0103 +v 0.1163 0.8770 -0.0012 +v 0.1414 0.8767 -0.0062 +v 0.1167 0.9085 -0.0594 +v 0.1183 0.9067 -0.0526 +v 0.1422 0.9001 -0.0675 +v 0.0901 0.8758 -0.0871 +v 0.0973 0.8804 -0.0836 +v 0.1099 0.8853 -0.1060 +v 0.0539 0.9022 -0.0929 +v 0.0608 0.8969 -0.0943 +v 0.0673 0.9111 -0.1181 +v 0.0028 0.8804 -0.0839 +v 0.0121 0.8838 -0.0858 +v 0.0050 0.8816 -0.1081 +v -0.0370 0.9063 -0.0805 +v -0.0301 0.8991 -0.0804 +v -0.0400 0.9107 -0.1057 +v -0.0810 0.9293 -0.0739 +v -0.0734 0.9280 -0.0766 +v -0.0895 0.8971 -0.0964 +v -0.1201 0.9258 -0.0485 +v -0.1142 0.9304 -0.0544 +v -0.1307 0.9152 -0.0664 +v -0.1475 0.8846 -0.0014 +v -0.1434 0.8917 -0.0106 +v -0.1673 0.8798 -0.0082 +v -0.1516 0.8933 0.0436 +v -0.1538 0.8858 0.0366 +v -0.1753 0.8936 0.0441 +v -0.1215 0.9382 0.0862 +v -0.1282 0.9334 0.0775 +v -0.1408 0.9158 0.0903 +v -0.0782 0.9175 0.1335 +v -0.0860 0.9217 0.1254 +v -0.0939 0.9022 0.1431 +v -0.0318 0.9171 0.1723 +v -0.0403 0.9152 0.1669 +v -0.0424 0.9157 0.1888 +v 0.0157 0.9232 0.1834 +v 0.0079 0.9274 0.1851 +v 0.0119 0.9233 0.2074 +v 0.0536 0.8782 0.1540 +v 0.0472 0.8843 0.1601 +v 0.0580 0.8668 0.1769 +v 0.0884 0.8899 0.1144 +v 0.0825 0.8819 0.1217 +v 0.1048 0.8829 0.1347 +v 0.1062 0.9063 0.0738 +v 0.1048 0.9077 0.0812 +v 0.1311 0.9197 0.0867 +v 0.1111 0.8981 0.0304 +v 0.1103 0.9029 0.0376 +v 0.1341 0.9100 0.0363 +v 0.5043 0.4139 -0.1299 +v 0.5326 0.3931 0.0542 +v 0.3817 0.4140 -0.1327 +v 0.3866 0.4528 -0.1159 +v 0.4051 0.3719 -0.0037 +v 0.4069 0.4071 0.0025 +v 0.4312 0.4634 -0.3189 +v 0.4991 0.4516 -0.1512 +v 0.3117 0.3828 -0.2489 +v 0.3303 0.4761 -0.2408 +v 0.3966 0.5108 -0.1412 +v 0.2791 0.3903 -0.4358 +v 0.4177 0.4251 -0.3340 +v 0.2257 0.3530 -0.3225 +v 0.2299 0.3937 -0.3261 +v 0.3056 0.4161 -0.2486 +v 0.0773 0.4219 -0.4994 +v 0.2636 0.4105 -0.4434 +v 0.0961 0.3644 -0.3783 +v 0.1044 0.4679 -0.3894 +v 0.2194 0.4251 -0.3446 +v -0.1040 0.4564 -0.4914 +v 0.0561 0.4222 -0.5031 +v -0.0457 0.3522 -0.3497 +v -0.0414 0.4494 -0.3830 +v 0.0715 0.4667 -0.3930 +v -0.2797 0.4456 -0.4323 +v -0.1247 0.4071 -0.4820 +v -0.1838 0.3880 -0.3288 +v -0.1909 0.4312 -0.3116 +v -0.0579 0.3959 -0.3619 +v -0.4036 0.4651 -0.3139 +v -0.2872 0.4427 -0.4303 +v -0.3183 0.4131 -0.2444 +v -0.3221 0.4619 -0.2309 +v -0.1990 0.4219 -0.3148 +v -0.5031 0.4716 -0.1768 +v -0.4167 0.4993 -0.2974 +v -0.3883 0.3569 -0.0952 +v -0.3982 0.4717 -0.1208 +v -0.3456 0.4961 -0.2312 +v -0.5367 0.3643 0.0237 +v -0.5078 0.4225 -0.1590 +v -0.4001 0.2984 0.0460 +v -0.4096 0.3422 0.0405 +v -0.3906 0.3888 -0.0901 +v -0.5329 0.4774 0.1883 +v -0.5392 0.3910 0.0434 +v -0.4034 0.3685 0.1830 +v -0.4295 0.4692 0.1743 +v -0.4242 0.3873 0.0582 +v -0.4234 0.4521 0.3792 +v -0.5254 0.4328 0.2065 +v -0.2914 0.3903 0.2724 +v -0.3180 0.4271 0.2855 +v -0.4071 0.4092 0.1902 +v -0.2870 0.4152 0.4749 +v -0.4163 0.4464 0.3903 +v -0.2110 0.3543 0.3665 +v -0.2165 0.3969 0.3784 +v -0.3118 0.4314 0.2946 +v -0.0974 0.4494 0.5697 +v -0.2724 0.4292 0.4805 +v -0.0900 0.3593 0.4516 +v -0.1055 0.4442 0.4559 +v -0.2071 0.4332 0.3991 +v 0.0968 0.4177 0.5620 +v -0.0780 0.4190 0.5682 +v 0.0511 0.3679 0.4246 +v 0.0458 0.4122 0.4406 +v -0.0866 0.4073 0.4437 +v 0.2522 0.3632 0.4892 +v 0.1089 0.4226 0.5586 +v 0.1989 0.3803 0.3805 +v 0.1923 0.4171 0.3887 +v 0.0570 0.4099 0.4374 +v 0.3957 0.4698 0.3731 +v 0.2680 0.3909 0.4796 +v 0.3325 0.3907 0.2763 +v 0.3189 0.4794 0.3095 +v 0.2208 0.4738 0.3916 +v 0.4904 0.4042 0.2336 +v 0.4100 0.4257 0.3578 +v 0.3615 0.3835 0.1362 +v 0.3614 0.4277 0.1583 +v 0.3193 0.4293 0.2817 +v 0.5321 0.3885 0.0660 +v 0.4897 0.4076 0.2253 +v 0.4069 0.4072 0.0139 +v 0.3668 0.4249 0.1471 +v 0.3755 0.4514 -0.1140 +v 0.3942 0.4194 0.0054 +v 0.2524 0.3949 -0.0647 +v 0.2534 0.4297 -0.0536 +v 0.2672 0.3963 0.0274 +v 0.2688 0.4329 0.0287 +v 0.3014 0.4301 -0.2290 +v 0.3724 0.4535 -0.1246 +v 0.2042 0.3714 -0.1467 +v 0.2140 0.4096 -0.1436 +v 0.2512 0.4332 -0.0637 +v 0.2242 0.4057 -0.3103 +v 0.2934 0.4242 -0.2375 +v 0.1339 0.3296 -0.1965 +v 0.1506 0.3671 -0.2091 +v 0.2116 0.4023 -0.1607 +v 0.0932 0.4038 -0.3622 +v 0.2136 0.3937 -0.3222 +v 0.0507 0.3524 -0.2483 +v 0.0523 0.3913 -0.2427 +v 0.1333 0.3715 -0.2138 +v -0.0412 0.3869 -0.3532 +v 0.0720 0.4063 -0.3624 +v -0.0449 0.3674 -0.2263 +v -0.0464 0.4097 -0.2490 +v 0.0351 0.3959 -0.2513 +v -0.1866 0.4333 -0.2988 +v -0.0535 0.3919 -0.3499 +v -0.1399 0.4018 -0.1845 +v -0.1428 0.4421 -0.1900 +v -0.0583 0.4086 -0.2368 +v -0.3134 0.4567 -0.2255 +v -0.1949 0.4224 -0.3024 +v -0.2100 0.3887 -0.1526 +v -0.2102 0.4238 -0.1404 +v -0.1520 0.4390 -0.1823 +v -0.3783 0.4089 -0.1095 +v -0.3276 0.4421 -0.2234 +v -0.2561 0.3364 -0.0938 +v -0.2667 0.3860 -0.1069 +v -0.2311 0.4298 -0.1392 +v -0.4000 0.3439 0.0266 +v -0.3838 0.3914 -0.0974 +v -0.2710 0.3468 -0.0026 +v -0.2926 0.3968 -0.0215 +v -0.2719 0.3806 -0.0994 +v -0.4002 0.4050 0.1734 +v -0.4003 0.3366 0.0522 +v -0.2820 0.3309 0.0941 +v -0.2861 0.3671 0.0837 +v -0.2800 0.3793 0.0027 +v -0.3190 0.4275 0.2768 +v -0.3992 0.4125 0.1906 +v -0.2109 0.3400 0.1852 +v -0.2363 0.3798 0.1923 +v -0.2900 0.3744 0.1051 +v -0.2069 0.3986 0.3723 +v -0.3039 0.4308 0.2857 +v -0.1274 0.4015 0.2858 +v -0.1547 0.4372 0.2904 +v -0.2152 0.3829 0.2013 +v -0.0931 0.3944 0.4427 +v -0.1912 0.3960 0.3901 +v -0.0216 0.3696 0.3082 +v -0.0401 0.4054 0.3225 +v -0.1381 0.4449 0.3161 +v 0.0453 0.4071 0.4281 +v -0.0829 0.3982 0.4345 +v 0.0715 0.3786 0.2924 +v 0.0497 0.4198 0.3085 +v -0.0286 0.4077 0.3061 +v 0.1888 0.4233 0.3785 +v 0.0568 0.4057 0.4253 +v 0.1547 0.3747 0.2631 +v 0.1348 0.4180 0.2686 +v 0.0622 0.4172 0.3063 +v 0.3030 0.4338 0.2865 +v 0.2095 0.4261 0.3650 +v 0.1989 0.3777 0.2022 +v 0.1935 0.4283 0.2148 +v 0.1544 0.4214 0.2620 +v 0.3518 0.4193 0.1507 +v 0.3041 0.4371 0.2784 +v 0.2288 0.3569 0.1149 +v 0.2397 0.4052 0.1304 +v 0.1941 0.4196 0.2040 +v 0.3855 0.4269 0.0321 +v 0.3514 0.4211 0.1440 +v 0.2708 0.4395 0.0534 +v 0.2453 0.3994 0.1227 +v 0.2411 0.4355 -0.0490 +v 0.2574 0.4318 0.0300 +v 0.1304 0.3644 -0.0176 +v 0.1304 0.3946 -0.0164 +v 0.1352 0.3567 0.0311 +v 0.1371 0.3904 0.0209 +v 0.2054 0.4193 -0.1361 +v 0.2390 0.4402 -0.0595 +v 0.1038 0.3712 -0.0610 +v 0.1051 0.4129 -0.0577 +v 0.1243 0.4038 -0.0271 +v 0.1362 0.3689 -0.1976 +v 0.1978 0.4147 -0.1460 +v 0.0640 0.3532 -0.0967 +v 0.0737 0.3879 -0.0912 +v 0.1004 0.4030 -0.0666 +v 0.0500 0.3891 -0.2320 +v 0.1268 0.3700 -0.2041 +v 0.0207 0.3721 -0.1095 +v 0.0289 0.4153 -0.1038 +v 0.0640 0.3969 -0.0946 +v -0.0442 0.4005 -0.2278 +v 0.0379 0.3943 -0.2328 +v -0.0286 0.3574 -0.1007 +v -0.0201 0.3933 -0.1078 +v 0.0179 0.4068 -0.1080 +v -0.1361 0.4414 -0.1819 +v -0.0555 0.4012 -0.2241 +v -0.0694 0.3919 -0.0758 +v -0.0677 0.4245 -0.0918 +v -0.0310 0.4002 -0.1048 +v -0.2009 0.4259 -0.1286 +v -0.1447 0.4326 -0.1744 +v -0.1085 0.4036 -0.0399 +v -0.1118 0.4357 -0.0528 +v -0.0783 0.4276 -0.0849 +v -0.2477 0.3737 -0.0977 +v -0.2079 0.4309 -0.1197 +v -0.1279 0.3798 0.0056 +v -0.1397 0.4214 -0.0033 +v -0.1213 0.4398 -0.0416 +v -0.2681 0.3884 -0.0062 +v -0.2505 0.3672 -0.0893 +v -0.1357 0.3506 0.0492 +v -0.1438 0.3885 0.0441 +v -0.1410 0.4101 0.0079 +v -0.2738 0.3711 0.0818 +v -0.2688 0.3841 0.0035 +v -0.1386 0.3856 0.0982 +v -0.1397 0.4166 0.0934 +v -0.1449 0.3904 0.0556 +v -0.2187 0.3752 0.1831 +v -0.2710 0.3741 0.0941 +v -0.1187 0.4070 0.1338 +v -0.1203 0.4445 0.1306 +v -0.1351 0.4285 0.1036 +v -0.1544 0.4412 0.2796 +v -0.2095 0.3826 0.1986 +v -0.0909 0.3877 0.1606 +v -0.0943 0.4249 0.1534 +v -0.1155 0.4377 0.1364 +v -0.0404 0.4098 0.2935 +v -0.1427 0.4413 0.2824 +v -0.0455 0.3992 0.1656 +v -0.0534 0.4357 0.1675 +v -0.0857 0.4254 0.1571 +v 0.0479 0.4171 0.2964 +v -0.0322 0.4158 0.2933 +v 0.0014 0.3748 0.1585 +v -0.0034 0.4155 0.1722 +v -0.0431 0.4396 0.1704 +v 0.1313 0.4079 0.2587 +v 0.0601 0.4146 0.2943 +v 0.0427 0.3433 0.1375 +v 0.0418 0.3779 0.1497 +v 0.0082 0.4010 0.1679 +v 0.1816 0.4086 0.2028 +v 0.1400 0.4055 0.2525 +v 0.0822 0.3788 0.1136 +v 0.0889 0.4129 0.1239 +v 0.0513 0.3796 0.1448 +v 0.2265 0.3913 0.1236 +v 0.1887 0.4020 0.1942 +v 0.1154 0.3780 0.0737 +v 0.1240 0.4196 0.0802 +v 0.0996 0.4186 0.1148 +v 0.2584 0.4363 0.0419 +v 0.2313 0.3866 0.1119 +v 0.1357 0.3990 0.0318 +v 0.1285 0.4185 0.0692 +v 0.1178 0.4028 -0.0122 +v 0.1252 0.3934 0.0207 +v -0.0021 0.3705 0.0273 +v 0.0266 0.4100 0.0269 +v 0.0947 0.4166 -0.0487 +v 0.1115 0.4129 -0.0221 +v 0.0225 0.4093 0.0159 +v 0.0678 0.3900 -0.0808 +v 0.0902 0.4063 -0.0577 +v 0.0151 0.4079 0.0066 +v 0.0264 0.4113 -0.0934 +v 0.0579 0.3969 -0.0846 +v 0.0052 0.4069 0.0005 +v -0.0182 0.3926 -0.0967 +v 0.0155 0.4039 -0.0973 +v -0.0061 0.4076 -0.0017 +v -0.0635 0.4303 -0.0835 +v -0.0293 0.3989 -0.0936 +v -0.0176 0.4099 0.0004 +v -0.1054 0.4454 -0.0487 +v -0.0748 0.4386 -0.0772 +v -0.0277 0.4126 0.0061 +v -0.1295 0.4252 -0.0019 +v -0.1141 0.4447 -0.0373 +v -0.0347 0.4138 0.0148 +v -0.1324 0.3896 0.0457 +v -0.1311 0.4155 0.0103 +v -0.0379 0.4134 0.0257 +v -0.1286 0.4174 0.0878 +v -0.1333 0.3893 0.0571 +v -0.0375 0.4130 0.0371 +v -0.1101 0.4495 0.1203 +v -0.1238 0.4308 0.0967 +v -0.0335 0.4141 0.0474 +v -0.0861 0.4249 0.1422 +v -0.1045 0.4434 0.1258 +v -0.0261 0.4160 0.0559 +v -0.0487 0.4320 0.1563 +v -0.0778 0.4238 0.1466 +v -0.0164 0.4160 0.0618 +v -0.0042 0.4258 0.1623 +v -0.0383 0.4379 0.1592 +v -0.0056 0.4131 0.0640 +v 0.0366 0.3882 0.1421 +v 0.0069 0.4138 0.1593 +v 0.0054 0.4092 0.0621 +v 0.0822 0.4141 0.1180 +v 0.0468 0.3882 0.1366 +v 0.0153 0.4069 0.0564 +v 0.1126 0.4137 0.0769 +v 0.0926 0.4193 0.1089 +v 0.0230 0.4075 0.0482 +v 0.1242 0.3997 0.0320 +v 0.1174 0.4136 0.0659 +v 0.0269 0.4091 0.0381 +v 0.5314 0.5997 -0.1457 +v 0.5396 0.5658 0.0213 +v 0.4163 0.6224 -0.0926 +v 0.4222 0.5656 0.0346 +v 0.4214 0.6841 -0.2878 +v 0.5120 0.6723 -0.1853 +v 0.3700 0.6925 -0.2162 +v 0.4363 0.7131 -0.1501 +v 0.2725 0.5847 -0.4162 +v 0.3839 0.6124 -0.3188 +v 0.2006 0.5582 -0.3340 +v 0.2980 0.5792 -0.2244 +v 0.1175 0.6689 -0.5082 +v 0.2361 0.6544 -0.4479 +v 0.0978 0.6707 -0.4206 +v 0.1810 0.6443 -0.3872 +v -0.0663 0.6881 -0.5137 +v 0.0582 0.6483 -0.5132 +v -0.0595 0.6722 -0.4310 +v 0.0319 0.6660 -0.4284 +v -0.2711 0.6245 -0.4462 +v -0.1137 0.5913 -0.5024 +v -0.2341 0.6068 -0.3282 +v -0.1055 0.5716 -0.3893 +v -0.4383 0.6628 -0.3182 +v -0.2948 0.6091 -0.4301 +v -0.3387 0.6456 -0.2502 +v -0.2577 0.5944 -0.3124 +v -0.4977 0.7040 -0.1917 +v -0.4658 0.7137 -0.2900 +v -0.4217 0.6899 -0.1495 +v -0.3885 0.7008 -0.2285 +v -0.5631 0.5507 0.0060 +v -0.5107 0.6157 -0.1470 +v -0.4456 0.5338 0.0150 +v -0.4095 0.5731 -0.0920 +v -0.5469 0.6911 0.1873 +v -0.5600 0.6268 0.0516 +v -0.4675 0.6707 0.1688 +v -0.4734 0.6313 0.0629 +v -0.4480 0.6383 0.3867 +v -0.5349 0.6234 0.2292 +v -0.3597 0.5979 0.3244 +v -0.4291 0.5870 0.2107 +v -0.2886 0.6194 0.5092 +v -0.4360 0.6383 0.4103 +v -0.2535 0.5703 0.4391 +v -0.3389 0.6101 0.3361 +v -0.1335 0.6927 0.5731 +v -0.2499 0.6771 0.5339 +v -0.1270 0.6875 0.4859 +v -0.2197 0.6572 0.4793 +v 0.0785 0.5999 0.5809 +v -0.0946 0.6274 0.5818 +v 0.0469 0.6150 0.4686 +v -0.0807 0.6116 0.4653 +v 0.2715 0.5651 0.5339 +v 0.1006 0.6080 0.5716 +v 0.1810 0.5824 0.4050 +v 0.0686 0.6117 0.4613 +v 0.3797 0.6976 0.4184 +v 0.3074 0.6342 0.5068 +v 0.3204 0.6896 0.3789 +v 0.2405 0.6721 0.4137 +v 0.4808 0.5811 0.2357 +v 0.4100 0.6287 0.3842 +v 0.3838 0.6145 0.2081 +v 0.3215 0.6001 0.3347 +v 0.5408 0.5623 0.0450 +v 0.4953 0.5937 0.2104 +v 0.4233 0.5691 0.0578 +v 0.3945 0.6023 0.1842 +v 0.3909 0.6291 -0.0769 +v 0.3976 0.5887 0.0369 +v 0.2705 0.5986 -0.0383 +v 0.2795 0.6061 0.0428 +v 0.3111 0.6078 -0.1920 +v 0.3899 0.6321 -0.0969 +v 0.2374 0.5781 -0.1448 +v 0.2673 0.6050 -0.0655 +v 0.1975 0.5821 -0.3127 +v 0.2833 0.5919 -0.2204 +v 0.1591 0.5424 -0.2301 +v 0.2252 0.5594 -0.1809 +v 0.0602 0.5797 -0.3664 +v 0.1670 0.5579 -0.3362 +v 0.0361 0.5798 -0.2482 +v 0.1157 0.5528 -0.2356 +v -0.0723 0.5690 -0.3681 +v 0.0279 0.5861 -0.3653 +v -0.0583 0.5913 -0.2707 +v 0.0062 0.5818 -0.2679 +v -0.2260 0.6140 -0.3095 +v -0.1055 0.5775 -0.3663 +v -0.1493 0.6054 -0.2146 +v -0.0883 0.5872 -0.2511 +v -0.3140 0.6473 -0.2410 +v -0.2488 0.5959 -0.2913 +v -0.2102 0.5960 -0.1394 +v -0.1632 0.6119 -0.1992 +v -0.3771 0.5986 -0.1104 +v -0.3406 0.6127 -0.2050 +v -0.2916 0.5862 -0.0744 +v -0.2498 0.5961 -0.1304 +v -0.4224 0.5359 -0.0037 +v -0.3951 0.5652 -0.0898 +v -0.3245 0.5746 0.0218 +v -0.3086 0.5770 -0.0435 +v -0.4074 0.5819 0.1830 +v -0.4199 0.5209 0.0452 +v -0.2903 0.5409 0.1576 +v -0.3028 0.5355 0.0783 +v -0.3522 0.6029 0.3000 +v -0.4040 0.5904 0.2188 +v -0.2910 0.5592 0.2573 +v -0.3046 0.5631 0.1930 +v -0.2431 0.5806 0.4142 +v -0.3199 0.6122 0.3157 +v -0.1822 0.5932 0.2998 +v -0.2562 0.5613 0.2700 +v -0.1037 0.5754 0.4455 +v -0.2035 0.5702 0.4403 +v -0.0969 0.5711 0.3469 +v -0.1514 0.6059 0.3345 +v 0.0369 0.5934 0.4444 +v -0.0817 0.5888 0.4411 +v 0.0195 0.5956 0.3301 +v -0.0668 0.5756 0.3263 +v 0.1678 0.5966 0.3776 +v 0.0598 0.5889 0.4374 +v 0.1136 0.5957 0.2803 +v 0.0391 0.5868 0.3243 +v 0.2906 0.6080 0.3238 +v 0.2045 0.6022 0.3575 +v 0.2089 0.6204 0.2248 +v 0.1596 0.6097 0.2663 +v 0.3616 0.6068 0.2085 +v 0.3051 0.6118 0.3165 +v 0.2592 0.6070 0.1564 +v 0.2078 0.6053 0.2061 +v 0.3855 0.5968 0.0765 +v 0.3642 0.6035 0.1801 +v 0.2868 0.6057 0.0823 +v 0.2760 0.5928 0.1446 +v 0.2473 0.5640 -0.0335 +v 0.2569 0.5609 0.0397 +v 0.1336 0.5235 -0.0158 +v 0.1399 0.5230 0.0129 +v 0.2164 0.5534 -0.1323 +v 0.2431 0.5733 -0.0602 +v 0.1151 0.5493 -0.0618 +v 0.1265 0.5380 -0.0383 +v 0.1296 0.5173 -0.1635 +v 0.1754 0.5547 -0.1294 +v 0.0911 0.5293 -0.0805 +v 0.1061 0.5371 -0.0705 +v 0.0393 0.5205 -0.2230 +v 0.1109 0.5061 -0.2102 +v 0.0403 0.5556 -0.1077 +v 0.0659 0.5435 -0.0987 +v -0.0562 0.5344 -0.2314 +v 0.0144 0.5303 -0.2271 +v -0.0142 0.5276 -0.1147 +v 0.0158 0.5371 -0.1124 +v -0.1355 0.5741 -0.1931 +v -0.0788 0.5352 -0.2274 +v -0.0642 0.5553 -0.1017 +v -0.0364 0.5441 -0.1115 +v -0.1969 0.5517 -0.1073 +v -0.1535 0.5607 -0.1708 +v -0.1131 0.5542 -0.0639 +v -0.0869 0.5497 -0.0880 +v -0.2549 0.5124 -0.0301 +v -0.2097 0.5599 -0.0904 +v -0.1494 0.5547 -0.0084 +v -0.1316 0.5673 -0.0419 +v -0.2699 0.5221 0.0407 +v -0.2606 0.4997 -0.0134 +v -0.1813 0.5203 0.0376 +v -0.1799 0.5315 0.0121 +v -0.2674 0.5005 0.1480 +v -0.2782 0.5111 0.0799 +v -0.1551 0.5435 0.1008 +v -0.1613 0.5310 0.0761 +v -0.2522 0.5068 0.2408 +v -0.2648 0.5084 0.1749 +v -0.1333 0.5671 0.1345 +v -0.1469 0.5600 0.1162 +v -0.1819 0.5708 0.2806 +v -0.2414 0.5205 0.2602 +v -0.1066 0.5517 0.1621 +v -0.1224 0.5560 0.1484 +v -0.1046 0.5430 0.2707 +v -0.1476 0.5722 0.2625 +v -0.0791 0.5705 0.1903 +v -0.0987 0.5570 0.1808 +v -0.0021 0.5531 0.3060 +v -0.0737 0.5455 0.3022 +v -0.0156 0.5522 0.1898 +v -0.0404 0.5745 0.1886 +v 0.0809 0.5452 0.2651 +v 0.0193 0.5475 0.3012 +v 0.0360 0.5097 0.1765 +v 0.0052 0.5214 0.1867 +v 0.1584 0.5493 0.2089 +v 0.0999 0.5422 0.2503 +v 0.0930 0.5414 0.1365 +v 0.0615 0.5163 0.1614 +v 0.2333 0.5298 0.1480 +v 0.1762 0.5355 0.1971 +v 0.1294 0.5637 0.0854 +v 0.1131 0.5553 0.1144 +v 0.2579 0.5692 0.0629 +v 0.2458 0.5198 0.1269 +v 0.1411 0.5407 0.0349 +v 0.1371 0.5587 0.0624 +v 0.1113 0.5748 -0.0071 +v 0.1154 0.5684 0.0128 +v 0.0538 0.6034 0.0264 +v 0.0947 0.5970 -0.0419 +v 0.1037 0.5946 -0.0271 +v 0.0456 0.6038 0.0050 +v 0.0689 0.5656 -0.0677 +v 0.0822 0.5769 -0.0567 +v 0.0317 0.5878 -0.0126 +v 0.0336 0.5889 -0.0836 +v 0.0513 0.5785 -0.0775 +v 0.0122 0.5790 -0.0243 +v -0.0103 0.5675 -0.0898 +v 0.0110 0.5752 -0.0884 +v -0.0107 0.5796 -0.0292 +v -0.0556 0.6012 -0.0803 +v -0.0341 0.5802 -0.0869 +v -0.0344 0.5899 -0.0262 +v -0.0994 0.6222 -0.0545 +v -0.0801 0.6185 -0.0685 +v -0.0557 0.5923 -0.0158 +v -0.1280 0.6070 -0.0149 +v -0.1166 0.6194 -0.0349 +v -0.0713 0.5860 0.0013 +v -0.1393 0.5689 0.0357 +v -0.1363 0.5877 0.0110 +v -0.0789 0.5730 0.0233 +v -0.1338 0.5870 0.0760 +v -0.1381 0.5678 0.0594 +v -0.0776 0.5658 0.0469 +v -0.1150 0.6263 0.1111 +v -0.1254 0.6140 0.0942 +v -0.0685 0.5762 0.0691 +v -0.0847 0.6027 0.1395 +v -0.0994 0.6152 0.1269 +v -0.0527 0.5870 0.0880 +v -0.0480 0.6039 0.1608 +v -0.0665 0.5992 0.1520 +v -0.0319 0.5905 0.1014 +v -0.0044 0.6084 0.1680 +v -0.0251 0.6154 0.1674 +v -0.0088 0.5989 0.1074 +v 0.0377 0.5683 0.1548 +v 0.0178 0.5850 0.1630 +v 0.0144 0.5980 0.1040 +v 0.0805 0.5856 0.1252 +v 0.0613 0.5683 0.1411 +v 0.0344 0.5949 0.0916 +v 0.1066 0.5907 0.0822 +v 0.0965 0.5959 0.1037 +v 0.0485 0.5963 0.0726 +v 0.1162 0.5800 0.0359 +v 0.1135 0.5899 0.0574 +v 0.0550 0.5982 0.0497 +v 0.5479 0.7483 -0.1691 +v 0.5760 0.7086 0.0100 +v 0.4401 0.7446 -0.1190 +v 0.4595 0.7193 0.0004 +v 0.4681 0.8070 -0.3118 +v 0.5189 0.8159 -0.2235 +v 0.4174 0.7994 -0.2485 +v 0.4441 0.8165 -0.1812 +v 0.3322 0.7650 -0.4781 +v 0.4282 0.7857 -0.3641 +v 0.2426 0.7170 -0.3812 +v 0.3505 0.7486 -0.2854 +v 0.1445 0.8501 -0.5265 +v 0.2598 0.8450 -0.4973 +v 0.1277 0.7900 -0.4513 +v 0.1985 0.8136 -0.4237 +v -0.0594 0.8124 -0.5495 +v 0.0525 0.8232 -0.5418 +v -0.0421 0.7830 -0.4713 +v 0.0429 0.7847 -0.4620 +v -0.2625 0.7772 -0.5037 +v -0.1237 0.7418 -0.5708 +v -0.2391 0.7837 -0.4142 +v -0.1018 0.7227 -0.4474 +v -0.4622 0.8138 -0.3669 +v -0.2990 0.7685 -0.4781 +v -0.3623 0.7720 -0.2806 +v -0.2748 0.7673 -0.3936 +v -0.5462 0.8302 -0.1927 +v -0.4837 0.8432 -0.3029 +v -0.4622 0.7867 -0.1803 +v -0.4188 0.8329 -0.2485 +v -0.6211 0.7309 0.0491 +v -0.5959 0.7700 -0.1236 +v -0.5022 0.6855 0.0139 +v -0.4755 0.7287 -0.1053 +v -0.5510 0.8187 0.2068 +v -0.5956 0.7823 0.1030 +v -0.4856 0.7809 0.1671 +v -0.5182 0.7638 0.0806 +v -0.4908 0.8096 0.4047 +v -0.5630 0.8241 0.2707 +v -0.3789 0.7663 0.3430 +v -0.4244 0.7523 0.2277 +v -0.3320 0.8103 0.5565 +v -0.4566 0.8305 0.4231 +v -0.2786 0.7312 0.4101 +v -0.3612 0.7599 0.3667 +v -0.1610 0.8415 0.5866 +v -0.2613 0.8592 0.5696 +v -0.1435 0.8191 0.5147 +v -0.2251 0.8074 0.4715 +v 0.0505 0.7519 0.6368 +v -0.1017 0.8207 0.6335 +v 0.0466 0.7612 0.5240 +v -0.0808 0.7340 0.5133 +v 0.2541 0.7222 0.5545 +v 0.0874 0.7501 0.6322 +v 0.2051 0.7237 0.4594 +v 0.0864 0.7728 0.5142 +v 0.3994 0.8247 0.4394 +v 0.3118 0.7905 0.5088 +v 0.3541 0.7984 0.3936 +v 0.2754 0.7932 0.4420 +v 0.5729 0.7615 0.2328 +v 0.4502 0.8001 0.3893 +v 0.4684 0.7534 0.2172 +v 0.3966 0.7197 0.3394 +v 0.5785 0.7271 0.0504 +v 0.5860 0.7851 0.1989 +v 0.4633 0.7198 0.0392 +v 0.4764 0.7543 0.1740 +v 0.4037 0.7443 -0.0916 +v 0.4217 0.6961 0.0152 +v 0.2959 0.7290 -0.0618 +v 0.3032 0.7442 0.0137 +v 0.3457 0.7581 -0.2319 +v 0.3829 0.7682 -0.1250 +v 0.2491 0.7334 -0.1661 +v 0.2806 0.7587 -0.1015 +v 0.2288 0.6941 -0.3371 +v 0.3111 0.7099 -0.2644 +v 0.1965 0.7077 -0.2493 +v 0.2437 0.7048 -0.2147 +v 0.0856 0.7004 -0.3877 +v 0.1874 0.6976 -0.3706 +v 0.0699 0.7370 -0.2717 +v 0.1419 0.6988 -0.2596 +v -0.0560 0.7182 -0.3934 +v 0.0370 0.7034 -0.3835 +v -0.0406 0.7114 -0.2972 +v 0.0201 0.7126 -0.2902 +v -0.2209 0.7463 -0.3939 +v -0.1066 0.7061 -0.4045 +v -0.1499 0.7137 -0.2780 +v -0.0840 0.7163 -0.2872 +v -0.3299 0.7846 -0.2590 +v -0.2537 0.7314 -0.3723 +v -0.2430 0.7208 -0.2230 +v -0.1812 0.7125 -0.2646 +v -0.4137 0.7311 -0.1302 +v -0.3587 0.7507 -0.2188 +v -0.3264 0.7293 -0.1294 +v -0.2889 0.7193 -0.1889 +v -0.4525 0.6849 -0.0037 +v -0.4325 0.7178 -0.0865 +v -0.3582 0.6729 -0.0071 +v -0.3474 0.7080 -0.0799 +v -0.4181 0.7087 0.1800 +v -0.4592 0.6858 0.0573 +v -0.3212 0.6746 0.1168 +v -0.3416 0.6547 0.0546 +v -0.3419 0.7352 0.2974 +v -0.3900 0.7278 0.2279 +v -0.2770 0.7065 0.2127 +v -0.3117 0.7177 0.1641 +v -0.2534 0.7060 0.3789 +v -0.3190 0.7505 0.3271 +v -0.1632 0.6989 0.2886 +v -0.2252 0.6974 0.2334 +v -0.1180 0.7424 0.4546 +v -0.2049 0.7088 0.4111 +v -0.0815 0.7145 0.3687 +v -0.1327 0.7032 0.3404 +v 0.0402 0.7632 0.4861 +v -0.0756 0.7548 0.4790 +v 0.0397 0.7303 0.3767 +v -0.0346 0.7175 0.3677 +v 0.1853 0.7173 0.4248 +v 0.0773 0.7614 0.4760 +v 0.1607 0.7000 0.3264 +v 0.0818 0.7108 0.3660 +v 0.3198 0.7469 0.3262 +v 0.2292 0.7283 0.3844 +v 0.2567 0.7533 0.2739 +v 0.2112 0.7244 0.3087 +v 0.4300 0.7496 0.2135 +v 0.3694 0.7380 0.3088 +v 0.3124 0.7549 0.1586 +v 0.2840 0.7356 0.2247 +v 0.4104 0.7110 0.0676 +v 0.4158 0.7305 0.1643 +v 0.3154 0.7298 0.0680 +v 0.3203 0.7504 0.1236 +v 0.2643 0.6412 -0.0429 +v 0.2713 0.6440 0.0217 +v 0.1540 0.6205 -0.0289 +v 0.1575 0.6200 -0.0084 +v 0.2452 0.6341 -0.1508 +v 0.2578 0.6530 -0.0883 +v 0.1347 0.6314 -0.0781 +v 0.1432 0.6250 -0.0630 +v 0.1424 0.6037 -0.1778 +v 0.1842 0.6209 -0.1523 +v 0.1137 0.6350 -0.1009 +v 0.1211 0.6374 -0.0960 +v 0.0508 0.6165 -0.2410 +v 0.1131 0.6017 -0.2349 +v 0.0602 0.6442 -0.1225 +v 0.0782 0.6470 -0.1167 +v -0.0480 0.6300 -0.2468 +v 0.0120 0.6245 -0.2446 +v -0.0003 0.6087 -0.1329 +v 0.0213 0.6104 -0.1317 +v -0.1300 0.6429 -0.2174 +v -0.0856 0.6231 -0.2433 +v -0.0595 0.6454 -0.1210 +v -0.0376 0.6436 -0.1269 +v -0.1947 0.6333 -0.1530 +v -0.1556 0.6487 -0.1962 +v -0.1185 0.6117 -0.0849 +v -0.0982 0.6049 -0.1017 +v -0.2658 0.6166 -0.0761 +v -0.2204 0.6270 -0.1257 +v -0.1661 0.6275 -0.0302 +v -0.1532 0.6310 -0.0503 +v -0.2824 0.6097 0.0067 +v -0.2729 0.6022 -0.0299 +v -0.2060 0.6100 0.0132 +v -0.2037 0.6113 -0.0013 +v -0.2856 0.5782 0.1372 +v -0.2979 0.5749 0.0772 +v -0.1790 0.6201 0.0893 +v -0.1847 0.6276 0.0680 +v -0.2576 0.5967 0.2257 +v -0.2763 0.6035 0.1630 +v -0.1541 0.6231 0.1406 +v -0.1644 0.6255 0.1238 +v -0.1731 0.6369 0.2855 +v -0.2322 0.6069 0.2532 +v -0.1196 0.6108 0.1761 +v -0.1332 0.6138 0.1655 +v -0.0913 0.6117 0.2824 +v -0.1216 0.6396 0.2744 +v -0.0776 0.6409 0.2122 +v -0.0926 0.6294 0.2047 +v 0.0261 0.6417 0.3299 +v -0.0409 0.6215 0.3252 +v -0.0053 0.6473 0.2162 +v -0.0228 0.6574 0.2157 +v 0.1179 0.6362 0.2832 +v 0.0610 0.6296 0.3192 +v 0.0481 0.6073 0.1964 +v 0.0269 0.6071 0.2055 +v 0.1970 0.6563 0.2102 +v 0.1519 0.6472 0.2525 +v 0.1048 0.6205 0.1521 +v 0.0861 0.6201 0.1717 +v 0.2504 0.6395 0.1482 +v 0.2135 0.6346 0.1887 +v 0.1453 0.6633 0.0957 +v 0.1336 0.6489 0.1147 +v 0.2733 0.6424 0.0611 +v 0.2672 0.6209 0.1237 +v 0.1581 0.6333 0.0293 +v 0.1553 0.6469 0.0518 +v 0.1096 0.6968 0.0098 +v 0.1112 0.6952 0.0164 +v 0.0882 0.7104 0.0243 +v 0.0941 0.7267 -0.0251 +v 0.0972 0.7251 -0.0189 +v 0.0762 0.7363 -0.0104 +v 0.0678 0.6941 -0.0588 +v 0.0724 0.6983 -0.0542 +v 0.0536 0.7084 -0.0379 +v 0.0267 0.7202 -0.0759 +v 0.0343 0.7153 -0.0739 +v 0.0215 0.7136 -0.0543 +v -0.0137 0.6986 -0.0857 +v -0.0069 0.7018 -0.0845 +v -0.0144 0.6993 -0.0636 +v -0.0654 0.7242 -0.0846 +v -0.0570 0.7175 -0.0855 +v -0.0556 0.7231 -0.0625 +v -0.1058 0.7474 -0.0725 +v -0.1002 0.7462 -0.0754 +v -0.0887 0.7509 -0.0520 +v -0.1369 0.7443 -0.0470 +v -0.1321 0.7485 -0.0523 +v -0.1178 0.7322 -0.0311 +v -0.1536 0.7030 0.0023 +v -0.1529 0.7096 -0.0071 +v -0.1317 0.7032 0.0065 +v -0.1476 0.7111 0.0462 +v -0.1498 0.7043 0.0408 +v -0.1275 0.6985 0.0465 +v -0.1224 0.7563 0.0875 +v -0.1279 0.7519 0.0795 +v -0.1083 0.7356 0.0806 +v -0.0805 0.7358 0.1337 +v -0.0875 0.7397 0.1270 +v -0.0748 0.7285 0.1181 +v -0.0332 0.7352 0.1694 +v -0.0413 0.7335 0.1644 +v -0.0380 0.7152 0.1473 +v 0.0156 0.7415 0.1858 +v 0.0085 0.7455 0.1855 +v 0.0051 0.7420 0.1640 +v 0.0487 0.6966 0.1733 +v 0.0436 0.7022 0.1767 +v 0.0393 0.7210 0.1563 +v 0.0869 0.7077 0.1460 +v 0.0806 0.7003 0.1510 +v 0.0684 0.7143 0.1336 +v 0.1088 0.7245 0.1080 +v 0.1068 0.7259 0.1149 +v 0.0863 0.7217 0.1018 +v 0.1135 0.7165 0.0610 +v 0.1133 0.7209 0.0696 +v 0.0919 0.7128 0.0634 +v 0.6046 0.9133 -0.1681 +v 0.6073 0.8969 -0.0185 +v 0.5031 0.9040 -0.1256 +v 0.4987 0.9076 -0.0004 +v 0.5006 0.9193 -0.3086 +v 0.5491 0.9324 -0.2105 +v 0.4462 0.8886 -0.2701 +v 0.4853 0.9091 -0.1994 +v 0.3177 0.9299 -0.5147 +v 0.4566 0.9751 -0.3772 +v 0.2810 0.8833 -0.4186 +v 0.3894 0.9286 -0.3412 +v 0.1367 0.9694 -0.5539 +v 0.2214 0.9640 -0.5104 +v 0.1354 0.9182 -0.4923 +v 0.2140 0.9199 -0.4619 +v -0.0518 0.9289 -0.5650 +v 0.0480 0.9454 -0.5630 +v -0.0357 0.8946 -0.4868 +v 0.0429 0.9013 -0.4989 +v -0.3163 0.9541 -0.4895 +v -0.1232 0.9033 -0.5918 +v -0.2425 0.9598 -0.4269 +v -0.1075 0.8857 -0.4791 +v -0.4602 0.9809 -0.3877 +v -0.3700 0.9629 -0.4529 +v -0.3636 0.9487 -0.2898 +v -0.2773 0.9462 -0.3665 +v -0.5411 0.9509 -0.2178 +v -0.4842 0.9553 -0.3219 +v -0.4715 0.9081 -0.2171 +v -0.4285 0.9348 -0.2683 +v -0.6370 0.9274 0.0268 +v -0.5778 0.9276 -0.1352 +v -0.5250 0.8866 -0.0093 +v -0.4837 0.8851 -0.1410 +v -0.5705 0.9354 0.1969 +v -0.6111 0.9093 0.0980 +v -0.5073 0.8991 0.1474 +v -0.5440 0.8656 0.0821 +v -0.5263 0.9739 0.3995 +v -0.5682 0.9900 0.2646 +v -0.4470 0.9549 0.3493 +v -0.4808 0.9070 0.2030 +v -0.3304 0.9500 0.5965 +v -0.4788 0.9898 0.4542 +v -0.2665 0.9077 0.5116 +v -0.4131 0.9203 0.4041 +v -0.1650 0.9510 0.5948 +v -0.2531 0.9655 0.5824 +v -0.1325 0.9170 0.5298 +v -0.2043 0.9055 0.5316 +v 0.0555 0.9185 0.6340 +v -0.0806 1.0098 0.6694 +v 0.0714 0.9082 0.5339 +v -0.0529 0.9091 0.5477 +v 0.2763 0.8934 0.5603 +v 0.1092 0.9153 0.6147 +v 0.2499 0.8723 0.4822 +v 0.1285 0.9099 0.5104 +v 0.4119 0.9438 0.4549 +v 0.3407 0.9029 0.5026 +v 0.3422 0.8991 0.3923 +v 0.3104 0.8778 0.4465 +v 0.5589 0.9471 0.2842 +v 0.4630 0.9525 0.4298 +v 0.4635 0.9079 0.2249 +v 0.3633 0.8737 0.3337 +v 0.5997 0.9160 0.0389 +v 0.6078 0.9628 0.2324 +v 0.4915 0.8944 0.0457 +v 0.5026 0.9200 0.1820 +v 0.4453 0.8785 -0.1068 +v 0.4397 0.8442 -0.0030 +v 0.3435 0.8693 -0.0802 +v 0.3364 0.8831 -0.0157 +v 0.3775 0.9157 -0.2644 +v 0.4330 0.9134 -0.1643 +v 0.2946 0.9056 -0.1933 +v 0.3334 0.9223 -0.1362 +v 0.2478 0.8417 -0.3370 +v 0.3277 0.8658 -0.2982 +v 0.2206 0.8810 -0.2704 +v 0.2536 0.8692 -0.2359 +v 0.1036 0.8520 -0.4215 +v 0.2045 0.8731 -0.3823 +v 0.0968 0.8694 -0.3209 +v 0.1563 0.8443 -0.2780 +v -0.0395 0.8708 -0.3974 +v 0.0432 0.8519 -0.4089 +v -0.0274 0.8420 -0.3052 +v 0.0248 0.8342 -0.3141 +v -0.1977 0.9072 -0.3714 +v -0.1079 0.8565 -0.4162 +v -0.1406 0.8640 -0.2959 +v -0.0824 0.8541 -0.3015 +v -0.3206 0.9294 -0.2381 +v -0.2439 0.8906 -0.3073 +v -0.2533 0.8561 -0.1798 +v -0.1960 0.8336 -0.2610 +v -0.4045 0.8755 -0.1638 +v -0.3540 0.9119 -0.2003 +v -0.3220 0.8729 -0.0834 +v -0.3040 0.8600 -0.1326 +v -0.4614 0.8334 -0.0108 +v -0.4240 0.8778 -0.1084 +v -0.3771 0.8124 0.0110 +v -0.3521 0.8364 -0.0352 +v -0.4366 0.8489 0.1463 +v -0.4821 0.8553 0.0381 +v -0.3469 0.8121 0.1445 +v -0.3767 0.8070 0.0769 +v -0.4040 0.8879 0.3129 +v -0.4085 0.8891 0.2064 +v -0.3053 0.8442 0.2659 +v -0.3220 0.8695 0.2266 +v -0.2666 0.8567 0.4489 +v -0.3817 0.9056 0.3921 +v -0.2355 0.8478 0.3217 +v -0.2752 0.8403 0.3019 +v -0.1012 0.9070 0.4517 +v -0.1924 0.8683 0.4417 +v -0.1292 0.8675 0.3794 +v -0.1695 0.8255 0.3472 +v 0.0693 0.9220 0.4867 +v -0.0327 0.9055 0.4972 +v -0.0017 0.8850 0.3855 +v -0.0664 0.8672 0.4007 +v 0.2074 0.8731 0.4365 +v 0.1201 0.9259 0.4586 +v 0.1155 0.8457 0.3532 +v 0.0498 0.8719 0.3568 +v 0.2717 0.9024 0.3228 +v 0.2346 0.8834 0.3861 +v 0.2140 0.8810 0.2757 +v 0.1739 0.8516 0.3291 +v 0.4184 0.8921 0.2028 +v 0.3193 0.8860 0.2868 +v 0.3239 0.8738 0.1554 +v 0.2709 0.8794 0.2146 +v 0.4227 0.8595 0.0569 +v 0.4320 0.8764 0.1416 +v 0.3391 0.8841 0.0474 +v 0.3427 0.8769 0.1016 +v 0.2679 0.7521 -0.0466 +v 0.2706 0.7562 0.0011 +v 0.1617 0.7454 0.0099 +v 0.1627 0.7438 0.0199 +v 0.2188 0.7577 -0.1269 +v 0.2473 0.7729 -0.0911 +v 0.1425 0.7380 -0.0527 +v 0.1477 0.7374 -0.0436 +v 0.1580 0.7168 -0.1814 +v 0.1777 0.7235 -0.1629 +v 0.1116 0.7512 -0.1154 +v 0.1170 0.7515 -0.1101 +v 0.0755 0.7385 -0.2382 +v 0.1218 0.7223 -0.2244 +v 0.0360 0.7547 -0.1309 +v 0.0449 0.7593 -0.1294 +v -0.0269 0.7444 -0.2455 +v 0.0215 0.7419 -0.2417 +v -0.0088 0.7072 -0.1396 +v 0.0022 0.7069 -0.1383 +v -0.1276 0.7439 -0.2538 +v -0.0800 0.7338 -0.2541 +v -0.0954 0.7648 -0.1381 +v -0.0845 0.7622 -0.1381 +v -0.2247 0.7462 -0.2104 +v -0.1850 0.7582 -0.2409 +v -0.1349 0.7045 -0.1177 +v -0.1244 0.7017 -0.1223 +v -0.2839 0.7319 -0.1236 +v -0.2567 0.7281 -0.1665 +v -0.1835 0.7314 -0.0846 +v -0.1777 0.7325 -0.0933 +v -0.2931 0.7262 -0.0259 +v -0.2859 0.7226 -0.0563 +v -0.2283 0.7304 -0.0295 +v -0.2268 0.7308 -0.0359 +v -0.2929 0.6879 0.0845 +v -0.3089 0.6802 0.0416 +v -0.1999 0.7312 0.0398 +v -0.2052 0.7405 0.0270 +v -0.2298 0.7149 0.1708 +v -0.2599 0.7247 0.1279 +v -0.1601 0.7248 0.1064 +v -0.1676 0.7274 0.0949 +v -0.1511 0.7388 0.2428 +v -0.1882 0.7230 0.2119 +v -0.1099 0.7076 0.1710 +v -0.1199 0.7062 0.1626 +v -0.0646 0.7193 0.2901 +v -0.0913 0.7396 0.2709 +v -0.0508 0.7390 0.2306 +v -0.0581 0.7354 0.2254 +v 0.0305 0.7586 0.3467 +v -0.0117 0.7392 0.3421 +v 0.0262 0.7693 0.2421 +v 0.0150 0.7708 0.2421 +v 0.1400 0.7435 0.3144 +v 0.0930 0.7392 0.3311 +v 0.0882 0.7321 0.2225 +v 0.0779 0.7305 0.2276 +v 0.2243 0.7748 0.2662 +v 0.1832 0.7661 0.2964 +v 0.1375 0.7341 0.1858 +v 0.1317 0.7392 0.1932 +v 0.2774 0.7553 0.1583 +v 0.2626 0.7444 0.2048 +v 0.1615 0.7733 0.1458 +v 0.1604 0.7632 0.1525 +v 0.2743 0.7444 0.0552 +v 0.2797 0.7366 0.1024 +v 0.1666 0.7428 0.0738 +v 0.1665 0.7493 0.0877 +v 0.1114 0.8381 0.0167 +v 0.1127 0.8399 0.0072 +v 0.1361 0.8379 0.0152 +v 0.1172 0.8678 -0.0437 +v 0.1156 0.8696 -0.0519 +v 0.1384 0.8613 -0.0530 +v 0.0873 0.8414 -0.0733 +v 0.0789 0.8369 -0.0766 +v 0.0976 0.8465 -0.0950 +v 0.0498 0.8579 -0.0910 +v 0.0436 0.8633 -0.0913 +v 0.0559 0.8723 -0.1186 +v -0.0027 0.8449 -0.0809 +v -0.0123 0.8414 -0.0786 +v -0.0131 0.8428 -0.1030 +v -0.0411 0.8602 -0.0747 +v -0.0458 0.8674 -0.0748 +v -0.0516 0.8719 -0.1002 +v -0.0728 0.8891 -0.0722 +v -0.0793 0.8904 -0.0698 +v -0.0997 0.8582 -0.0892 +v -0.1095 0.8915 -0.0500 +v -0.1163 0.8869 -0.0432 +v -0.1306 0.8763 -0.0597 +v -0.1466 0.8528 -0.0051 +v -0.1517 0.8457 0.0031 +v -0.1722 0.8409 -0.0074 +v -0.1583 0.8469 0.0413 +v -0.1560 0.8543 0.0493 +v -0.1797 0.8547 0.0479 +v -0.1304 0.8945 0.0818 +v -0.1232 0.8993 0.0893 +v -0.1461 0.8769 0.0970 +v -0.0905 0.8828 0.1308 +v -0.0833 0.8786 0.1396 +v -0.0996 0.8634 0.1502 +v -0.0457 0.8763 0.1715 +v -0.0372 0.8782 0.1759 +v -0.0483 0.8768 0.1936 +v 0.0026 0.8885 0.1825 +v 0.0103 0.8842 0.1810 +v 0.0051 0.8844 0.2053 +v 0.0429 0.8453 0.1659 +v 0.0498 0.8393 0.1613 +v 0.0589 0.8280 0.1859 +v 0.0770 0.8429 0.1312 +v 0.0823 0.8510 0.1227 +v 0.1002 0.8441 0.1461 +v 0.0990 0.8688 0.0889 +v 0.1006 0.8674 0.0828 +v 0.1262 0.8809 0.0952 +v 0.1067 0.8639 0.0503 +v 0.1075 0.8592 0.0448 +v 0.1314 0.8712 0.0512 +v 0.6063 0.9264 -0.1614 +v 0.6062 0.9101 -0.0169 +v 0.5051 0.9169 -0.1189 +v 0.4968 0.9205 0.0086 +v 0.5004 0.9279 -0.3035 +v 0.5470 0.9411 -0.2047 +v 0.4471 0.8971 -0.2727 +v 0.4867 0.9176 -0.1965 +v 0.3090 0.9430 -0.5116 +v 0.4525 0.9882 -0.3725 +v 0.2830 0.8962 -0.4194 +v 0.3877 0.9415 -0.3402 +v 0.1354 0.9780 -0.5506 +v 0.2192 0.9727 -0.5065 +v 0.1310 0.9267 -0.4922 +v 0.2127 0.9284 -0.4623 +v -0.0551 0.9375 -0.5641 +v 0.0450 0.9541 -0.5596 +v -0.0396 0.9030 -0.4882 +v 0.0385 0.9098 -0.4983 +v -0.3234 0.9673 -0.4973 +v -0.1266 0.9165 -0.5940 +v -0.2464 0.9727 -0.4340 +v -0.1128 0.8986 -0.4813 +v -0.4649 0.9940 -0.3838 +v -0.3758 0.9760 -0.4554 +v -0.3669 0.9616 -0.2869 +v -0.2798 0.9591 -0.3748 +v -0.5439 0.9596 -0.2207 +v -0.4866 0.9639 -0.3195 +v -0.4691 0.9166 -0.2170 +v -0.4310 0.9432 -0.2645 +v -0.6404 0.9406 0.0252 +v -0.5779 0.9407 -0.1375 +v -0.5252 0.8995 -0.0112 +v -0.4798 0.8980 -0.1428 +v -0.5682 0.9440 0.1937 +v -0.6117 0.9179 0.0980 +v -0.5058 0.9076 0.1473 +v -0.5429 0.8741 0.0789 +v -0.5279 0.9871 0.4025 +v -0.5627 1.0032 0.2613 +v -0.4422 0.9678 0.3554 +v -0.4770 0.9199 0.2049 +v -0.3310 0.9632 0.5939 +v -0.4797 1.0029 0.4564 +v -0.2694 0.9206 0.5074 +v -0.4136 0.9332 0.4069 +v -0.1617 0.9596 0.5960 +v -0.2518 0.9741 0.5778 +v -0.1329 0.9255 0.5289 +v -0.2044 0.9140 0.5301 +v 0.0561 0.9316 0.6370 +v -0.0784 1.0229 0.6753 +v 0.0713 0.9211 0.5363 +v -0.0530 0.9220 0.5469 +v 0.2773 0.9065 0.5608 +v 0.1097 0.9285 0.6145 +v 0.2523 0.8852 0.4772 +v 0.1279 0.9228 0.5108 +v 0.4085 0.9524 0.4580 +v 0.3413 0.9115 0.5026 +v 0.3414 0.9076 0.3907 +v 0.3122 0.8862 0.4447 +v 0.5661 0.9602 0.2927 +v 0.4603 0.9657 0.4368 +v 0.4675 0.9208 0.2293 +v 0.3608 0.8866 0.3295 +v 0.5987 0.9292 0.0428 +v 0.6103 0.9760 0.2385 +v 0.4919 0.9073 0.0538 +v 0.5047 0.9329 0.1893 +v 0.4488 0.8913 -0.1088 +v 0.4418 0.8570 -0.0048 +v 0.3456 0.8819 -0.0836 +v 0.3364 0.8956 -0.0184 +v 0.3752 0.9285 -0.2646 +v 0.4346 0.9261 -0.1647 +v 0.2968 0.9182 -0.1915 +v 0.3333 0.9348 -0.1334 +v 0.2513 0.8546 -0.3414 +v 0.3295 0.8786 -0.3012 +v 0.2211 0.8936 -0.2751 +v 0.2563 0.8818 -0.2391 +v 0.1059 0.8648 -0.4260 +v 0.2080 0.8859 -0.3887 +v 0.0997 0.8820 -0.3232 +v 0.1597 0.8569 -0.2850 +v -0.0388 0.8835 -0.3993 +v 0.0446 0.8647 -0.4111 +v -0.0239 0.8545 -0.3067 +v 0.0282 0.8468 -0.3163 +v -0.1965 0.9199 -0.3760 +v -0.1058 0.8692 -0.4184 +v -0.1381 0.8766 -0.2970 +v -0.0788 0.8666 -0.3039 +v -0.3238 0.9422 -0.2400 +v -0.2413 0.9033 -0.3090 +v -0.2490 0.8686 -0.1747 +v -0.1927 0.8461 -0.2563 +v -0.3998 0.8883 -0.1639 +v -0.3554 0.9245 -0.1981 +v -0.3176 0.8856 -0.0801 +v -0.2987 0.8728 -0.1278 +v -0.4595 0.8452 -0.0155 +v -0.4215 0.8901 -0.1075 +v -0.3760 0.8247 0.0138 +v -0.3489 0.8489 -0.0306 +v -0.4357 0.8617 0.1409 +v -0.4804 0.8680 0.0330 +v -0.3479 0.8247 0.1485 +v -0.3774 0.8195 0.0792 +v -0.4027 0.9006 0.3142 +v -0.4063 0.9018 0.2070 +v -0.3078 0.8564 0.2717 +v -0.3205 0.8819 0.2294 +v -0.2664 0.8695 0.4540 +v -0.3804 0.9184 0.3920 +v -0.2413 0.8603 0.3248 +v -0.2813 0.8529 0.3092 +v -0.1043 0.9196 0.4502 +v -0.1919 0.8807 0.4414 +v -0.1316 0.8800 0.3766 +v -0.1744 0.8378 0.3484 +v 0.0652 0.9348 0.4904 +v -0.0349 0.9183 0.4965 +v -0.0033 0.8976 0.3857 +v -0.0686 0.8797 0.3987 +v 0.2082 0.8859 0.4302 +v 0.1154 0.9387 0.4613 +v 0.1105 0.8583 0.3462 +v 0.0475 0.8844 0.3547 +v 0.2721 0.9150 0.3235 +v 0.2332 0.8960 0.3845 +v 0.2136 0.8933 0.2740 +v 0.1688 0.8639 0.3235 +v 0.4207 0.9049 0.2004 +v 0.3194 0.8988 0.2836 +v 0.3254 0.8863 0.1531 +v 0.2717 0.8919 0.2135 +v 0.4247 0.8720 0.0552 +v 0.4341 0.8890 0.1392 +v 0.3404 0.8965 0.0447 +v 0.3450 0.8893 0.0990 +v 0.2692 0.7637 -0.0458 +v 0.2707 0.7678 0.0015 +v 0.1620 0.7569 0.0147 +v 0.1627 0.7554 0.0248 +v 0.2161 0.7692 -0.1236 +v 0.2478 0.7845 -0.0899 +v 0.1431 0.7495 -0.0487 +v 0.1486 0.7489 -0.0393 +v 0.1567 0.7267 -0.1794 +v 0.1751 0.7334 -0.1607 +v 0.1111 0.7620 -0.1173 +v 0.1169 0.7623 -0.1117 +v 0.0750 0.7500 -0.2393 +v 0.1205 0.7338 -0.2227 +v 0.0327 0.7662 -0.1322 +v 0.0421 0.7708 -0.1309 +v -0.0271 0.7559 -0.2441 +v 0.0214 0.7535 -0.2415 +v -0.0137 0.7187 -0.1385 +v -0.0027 0.7185 -0.1373 +v -0.1292 0.7555 -0.2546 +v -0.0805 0.7454 -0.2536 +v -0.0978 0.7763 -0.1360 +v -0.0872 0.7738 -0.1361 +v -0.2290 0.7578 -0.2093 +v -0.1878 0.7698 -0.2402 +v -0.1380 0.7161 -0.1211 +v -0.1279 0.7132 -0.1253 +v -0.2852 0.7434 -0.1210 +v -0.2609 0.7397 -0.1657 +v -0.1828 0.7430 -0.0872 +v -0.1772 0.7441 -0.0958 +v -0.2937 0.7376 -0.0252 +v -0.2861 0.7340 -0.0561 +v -0.2288 0.7419 -0.0311 +v -0.2272 0.7423 -0.0376 +v -0.2920 0.6994 0.0812 +v -0.3095 0.6917 0.0378 +v -0.2010 0.7427 0.0376 +v -0.2064 0.7520 0.0261 +v -0.2262 0.7264 0.1696 +v -0.2579 0.7362 0.1294 +v -0.1593 0.7364 0.1032 +v -0.1673 0.7390 0.0920 +v -0.1531 0.7503 0.2411 +v -0.1864 0.7345 0.2097 +v -0.1061 0.7191 0.1682 +v -0.1164 0.7177 0.1593 +v -0.0634 0.7302 0.2909 +v -0.0923 0.7500 0.2712 +v -0.0489 0.7502 0.2325 +v -0.0561 0.7465 0.2271 +v 0.0256 0.7701 0.3466 +v -0.0150 0.7508 0.3435 +v 0.0239 0.7808 0.2427 +v 0.0125 0.7824 0.2432 +v 0.1364 0.7550 0.3151 +v 0.0897 0.7507 0.3300 +v 0.0901 0.7436 0.2217 +v 0.0800 0.7421 0.2270 +v 0.2205 0.7863 0.2687 +v 0.1785 0.7777 0.2990 +v 0.1393 0.7457 0.1871 +v 0.1332 0.7507 0.1936 +v 0.2774 0.7669 0.1602 +v 0.2634 0.7560 0.2086 +v 0.1597 0.7848 0.1474 +v 0.1593 0.7748 0.1547 +v 0.2730 0.7560 0.0555 +v 0.2791 0.7481 0.1030 +v 0.1653 0.7543 0.0789 +v 0.1650 0.7608 0.0923 +v 0.1133 0.8507 0.0106 +v 0.1148 0.8524 0.0013 +v 0.1382 0.8504 0.0082 +v 0.1186 0.8804 -0.0479 +v 0.1170 0.8821 -0.0557 +v 0.1407 0.8738 -0.0588 +v 0.0911 0.8540 -0.0773 +v 0.0829 0.8495 -0.0806 +v 0.1021 0.8590 -0.0994 +v 0.0542 0.8705 -0.0931 +v 0.0479 0.8758 -0.0929 +v 0.0607 0.8848 -0.1197 +v 0.0025 0.8574 -0.0829 +v -0.0072 0.8540 -0.0805 +v -0.0070 0.8553 -0.1050 +v -0.0367 0.8727 -0.0768 +v -0.0419 0.8800 -0.0771 +v -0.0467 0.8844 -0.1024 +v -0.0718 0.9016 -0.0744 +v -0.0786 0.9029 -0.0719 +v -0.0956 0.8707 -0.0915 +v -0.1099 0.9040 -0.0520 +v -0.1164 0.8995 -0.0453 +v -0.1295 0.8888 -0.0618 +v -0.1448 0.8653 -0.0064 +v -0.1499 0.8582 0.0023 +v -0.1702 0.8534 -0.0066 +v -0.1567 0.8594 0.0404 +v -0.1543 0.8669 0.0479 +v -0.1780 0.8672 0.0475 +v -0.1290 0.9070 0.0798 +v -0.1218 0.9118 0.0875 +v -0.1440 0.8894 0.0949 +v -0.0886 0.8954 0.1284 +v -0.0813 0.8911 0.1371 +v -0.0978 0.8759 0.1478 +v -0.0438 0.8889 0.1695 +v -0.0354 0.8907 0.1741 +v -0.0467 0.8893 0.1915 +v 0.0045 0.9010 0.1823 +v 0.0121 0.8968 0.1808 +v 0.0069 0.8969 0.2050 +v 0.0438 0.8579 0.1632 +v 0.0504 0.8518 0.1583 +v 0.0577 0.8405 0.1827 +v 0.0784 0.8555 0.1273 +v 0.0841 0.8635 0.1191 +v 0.1012 0.8566 0.1417 +v 0.1011 0.8814 0.0851 +v 0.1027 0.8799 0.0786 +v 0.1283 0.8934 0.0910 +v 0.1083 0.8765 0.0451 +v 0.1091 0.8717 0.0392 +v 0.1328 0.8837 0.0450 +v 0.6063 0.9398 -0.1538 +v 0.6041 0.9234 -0.0136 +v 0.5057 0.9301 -0.1115 +v 0.4939 0.9337 0.0183 +v 0.4993 0.9367 -0.2983 +v 0.5442 0.9498 -0.1998 +v 0.4473 0.9058 -0.2747 +v 0.4870 0.9262 -0.1931 +v 0.3008 0.9564 -0.5074 +v 0.4469 1.0016 -0.3672 +v 0.2842 0.9094 -0.4187 +v 0.3848 0.9547 -0.3377 +v 0.1350 0.9868 -0.5474 +v 0.2182 0.9814 -0.5020 +v 0.1263 0.9353 -0.4912 +v 0.2107 0.9371 -0.4615 +v -0.0585 0.9463 -0.5622 +v 0.0427 0.9628 -0.5565 +v -0.0442 0.9117 -0.4892 +v 0.0335 0.9184 -0.4967 +v -0.3285 0.9806 -0.5039 +v -0.1312 0.9298 -0.5958 +v -0.2504 0.9859 -0.4394 +v -0.1192 0.9118 -0.4832 +v -0.4709 1.0074 -0.3823 +v -0.3794 0.9894 -0.4584 +v -0.3709 0.9748 -0.2844 +v -0.2830 0.9723 -0.3827 +v -0.5471 0.9683 -0.2241 +v -0.4900 0.9727 -0.3178 +v -0.4677 0.9252 -0.2156 +v -0.4340 0.9519 -0.2603 +v -0.6444 0.9539 0.0218 +v -0.5795 0.9541 -0.1411 +v -0.5265 0.9127 -0.0120 +v -0.4770 0.9112 -0.1429 +v -0.5670 0.9528 0.1895 +v -0.6128 0.9267 0.0969 +v -0.5043 0.9162 0.1483 +v -0.5418 0.8827 0.0762 +v -0.5263 1.0004 0.4044 +v -0.5571 1.0165 0.2599 +v -0.4380 0.9810 0.3607 +v -0.4722 0.9331 0.2086 +v -0.3314 0.9765 0.5914 +v -0.4785 1.0163 0.4566 +v -0.2739 0.9338 0.5010 +v -0.4137 0.9464 0.4099 +v -0.1578 0.9684 0.5985 +v -0.2512 0.9829 0.5719 +v -0.1338 0.9341 0.5286 +v -0.2057 0.9226 0.5270 +v 0.0581 0.9450 0.6413 +v -0.0778 1.0363 0.6799 +v 0.0705 0.9343 0.5400 +v -0.0539 0.9352 0.5472 +v 0.2784 0.9198 0.5629 +v 0.1116 0.9418 0.6161 +v 0.2530 0.8984 0.4736 +v 0.1263 0.9360 0.5127 +v 0.4062 0.9612 0.4611 +v 0.3414 0.9203 0.5036 +v 0.3408 0.9163 0.3900 +v 0.3130 0.8949 0.4437 +v 0.5726 0.9736 0.2998 +v 0.4580 0.9790 0.4426 +v 0.4724 0.9340 0.2345 +v 0.3599 0.8998 0.3262 +v 0.5968 0.9425 0.0480 +v 0.6112 0.9893 0.2423 +v 0.4916 0.9205 0.0630 +v 0.5063 0.9461 0.1971 +v 0.4512 0.9044 -0.1099 +v 0.4433 0.8701 -0.0060 +v 0.3468 0.8948 -0.0859 +v 0.3354 0.9086 -0.0199 +v 0.3717 0.9416 -0.2633 +v 0.4348 0.9393 -0.1639 +v 0.2976 0.9311 -0.1882 +v 0.3318 0.9478 -0.1294 +v 0.2548 0.8677 -0.3455 +v 0.3305 0.8917 -0.3033 +v 0.2207 0.9067 -0.2789 +v 0.2582 0.8947 -0.2414 +v 0.1077 0.8779 -0.4298 +v 0.2108 0.8990 -0.3938 +v 0.1017 0.8949 -0.3243 +v 0.1626 0.8698 -0.2920 +v -0.0387 0.8966 -0.4009 +v 0.0456 0.8778 -0.4126 +v -0.0205 0.8676 -0.3084 +v 0.0317 0.8598 -0.3183 +v -0.1964 0.9331 -0.3819 +v -0.1041 0.8823 -0.4209 +v -0.1365 0.8895 -0.2990 +v -0.0757 0.8796 -0.3066 +v -0.3279 0.9553 -0.2426 +v -0.2397 0.9164 -0.3134 +v -0.2453 0.8816 -0.1720 +v -0.1895 0.8591 -0.2529 +v -0.3959 0.9014 -0.1624 +v -0.3578 0.9374 -0.1959 +v -0.3139 0.8986 -0.0781 +v -0.2936 0.8859 -0.1246 +v -0.4577 0.8575 -0.0197 +v -0.4200 0.9030 -0.1048 +v -0.3742 0.8374 0.0172 +v -0.3458 0.8618 -0.0261 +v -0.4342 0.8748 0.1369 +v -0.4789 0.8812 0.0295 +v -0.3476 0.8376 0.1530 +v -0.3768 0.8325 0.0821 +v -0.3996 0.9137 0.3157 +v -0.4033 0.9149 0.2092 +v -0.3092 0.8691 0.2765 +v -0.3186 0.8948 0.2309 +v -0.2668 0.8826 0.4566 +v -0.3778 0.9315 0.3908 +v -0.2458 0.8733 0.3264 +v -0.2859 0.8658 0.3149 +v -0.1086 0.9326 0.4495 +v -0.1924 0.8936 0.4396 +v -0.1336 0.8929 0.3737 +v -0.1794 0.8505 0.3487 +v 0.0599 0.9479 0.4951 +v -0.0387 0.9314 0.4968 +v -0.0045 0.9105 0.3871 +v -0.0704 0.8927 0.3972 +v 0.2075 0.8990 0.4250 +v 0.1096 0.9518 0.4652 +v 0.1063 0.8712 0.3393 +v 0.0458 0.8974 0.3539 +v 0.2737 0.9278 0.3253 +v 0.2311 0.9089 0.3840 +v 0.2150 0.9059 0.2734 +v 0.1647 0.8767 0.3179 +v 0.4240 0.9180 0.1992 +v 0.3219 0.9119 0.2816 +v 0.3274 0.8993 0.1521 +v 0.2740 0.9049 0.2138 +v 0.4266 0.8849 0.0540 +v 0.4363 0.9019 0.1376 +v 0.3413 0.9092 0.0429 +v 0.3470 0.9021 0.0973 +v 0.2708 0.7760 -0.0450 +v 0.2710 0.7801 0.0018 +v 0.1626 0.7692 0.0189 +v 0.1629 0.7677 0.0292 +v 0.2142 0.7816 -0.1209 +v 0.2487 0.7968 -0.0895 +v 0.1441 0.7618 -0.0453 +v 0.1498 0.7612 -0.0354 +v 0.1551 0.7373 -0.1774 +v 0.1724 0.7439 -0.1584 +v 0.1112 0.7736 -0.1197 +v 0.1172 0.7739 -0.1138 +v 0.0742 0.7623 -0.2408 +v 0.1188 0.7461 -0.2215 +v 0.0301 0.7786 -0.1338 +v 0.0401 0.7831 -0.1328 +v -0.0275 0.7683 -0.2423 +v 0.0210 0.7658 -0.2416 +v -0.0190 0.7310 -0.1374 +v -0.0079 0.7308 -0.1363 +v -0.1309 0.7678 -0.2545 +v -0.0812 0.7577 -0.2525 +v -0.0992 0.7886 -0.1333 +v -0.0891 0.7861 -0.1335 +v -0.2329 0.7701 -0.2065 +v -0.1901 0.7821 -0.2379 +v -0.1410 0.7284 -0.1241 +v -0.1315 0.7255 -0.1280 +v -0.2860 0.7557 -0.1164 +v -0.2648 0.7520 -0.1630 +v -0.1817 0.7553 -0.0884 +v -0.1764 0.7564 -0.0970 +v -0.2942 0.7497 -0.0234 +v -0.2861 0.7460 -0.0548 +v -0.2292 0.7542 -0.0319 +v -0.2274 0.7546 -0.0384 +v -0.2914 0.7117 0.0794 +v -0.3101 0.7041 0.0351 +v -0.2024 0.7550 0.0370 +v -0.2078 0.7643 0.0268 +v -0.2235 0.7388 0.1702 +v -0.2566 0.7485 0.1328 +v -0.1590 0.7487 0.1010 +v -0.1675 0.7513 0.0902 +v -0.1566 0.7627 0.2410 +v -0.1861 0.7469 0.2091 +v -0.1030 0.7314 0.1659 +v -0.1133 0.7300 0.1564 +v -0.0631 0.7417 0.2920 +v -0.0941 0.7612 0.2722 +v -0.0477 0.7619 0.2348 +v -0.0547 0.7583 0.2293 +v 0.0198 0.7824 0.3464 +v -0.0197 0.7631 0.3451 +v 0.0203 0.7931 0.2433 +v 0.0089 0.7947 0.2443 +v 0.1313 0.7674 0.3153 +v 0.0849 0.7630 0.3284 +v 0.0909 0.7560 0.2204 +v 0.0809 0.7544 0.2260 +v 0.2158 0.7986 0.2695 +v 0.1728 0.7900 0.3003 +v 0.1402 0.7580 0.1878 +v 0.1336 0.7630 0.1934 +v 0.2764 0.7792 0.1618 +v 0.2630 0.7683 0.2123 +v 0.1572 0.7971 0.1477 +v 0.1575 0.7871 0.1559 +v 0.2715 0.7683 0.0559 +v 0.2779 0.7604 0.1038 +v 0.1639 0.7666 0.0833 +v 0.1633 0.7731 0.0961 +v 0.1151 0.8636 0.0044 +v 0.1166 0.8654 -0.0048 +v 0.1400 0.8633 0.0009 +v 0.1191 0.8933 -0.0509 +v 0.1175 0.8951 -0.0582 +v 0.1420 0.8867 -0.0637 +v 0.0945 0.8670 -0.0809 +v 0.0868 0.8624 -0.0843 +v 0.1064 0.8719 -0.1032 +v 0.0580 0.8835 -0.0943 +v 0.0514 0.8888 -0.0936 +v 0.0646 0.8977 -0.1196 +v 0.0076 0.8704 -0.0847 +v -0.0019 0.8669 -0.0824 +v -0.0009 0.8682 -0.1068 +v -0.0329 0.8857 -0.0788 +v -0.0389 0.8929 -0.0791 +v -0.0427 0.8973 -0.1044 +v -0.0719 0.9146 -0.0760 +v -0.0792 0.9159 -0.0734 +v -0.0920 0.8837 -0.0940 +v -0.1114 0.9170 -0.0536 +v -0.1176 0.9124 -0.0472 +v -0.1294 0.9017 -0.0641 +v -0.1437 0.8783 -0.0083 +v -0.1484 0.8712 0.0007 +v -0.1685 0.8664 -0.0069 +v -0.1551 0.8724 0.0388 +v -0.1527 0.8798 0.0459 +v -0.1764 0.8802 0.0462 +v -0.1282 0.9200 0.0783 +v -0.1212 0.9248 0.0864 +v -0.1421 0.9024 0.0926 +v -0.0870 0.9083 0.1265 +v -0.0795 0.9041 0.1350 +v -0.0959 0.8888 0.1453 +v -0.0419 0.9018 0.1678 +v -0.0335 0.9037 0.1728 +v -0.0447 0.9023 0.1898 +v 0.0064 0.9140 0.1831 +v 0.0140 0.9097 0.1815 +v 0.0093 0.9099 0.2056 +v 0.0453 0.8709 0.1612 +v 0.0518 0.8648 0.1557 +v 0.0574 0.8534 0.1796 +v 0.0803 0.8684 0.1240 +v 0.0862 0.8765 0.1162 +v 0.1029 0.8695 0.1377 +v 0.1031 0.8943 0.0825 +v 0.1046 0.8929 0.0755 +v 0.1300 0.9063 0.0881 +v 0.1096 0.8895 0.0407 +v 0.1103 0.8847 0.0342 +v 0.1338 0.8966 0.0399 +# 2072 vertices + +vn 0.9852 0.1448 -0.0919 +vn 0.8590 0.3251 -0.3955 +vn 0.9203 0.1254 -0.3706 +vn 0.9998 0.0140 0.0142 +vn 0.7300 0.1081 -0.6748 +vn 0.7516 -0.1800 -0.6346 +vn 0.5521 0.1356 -0.8227 +vn 0.4478 0.0003 -0.8941 +vn 0.3040 0.3320 -0.8929 +vn 0.2162 0.1143 -0.9696 +vn -0.2289 -0.3031 -0.9250 +vn -0.2029 -0.0643 -0.9771 +vn -0.4871 0.0240 -0.8730 +vn -0.6398 -0.0910 -0.7631 +vn -0.7222 0.0954 -0.6850 +vn -0.7136 0.1291 -0.6886 +vn -0.9481 -0.2526 -0.1929 +vn -0.9662 -0.0634 -0.2498 +vn -0.9967 -0.0804 -0.0120 +vn -0.9968 -0.0640 0.0474 +vn -0.9885 0.0697 0.1343 +vn -0.9763 0.1612 0.1446 +vn -0.7219 -0.3072 0.6201 +vn -0.7927 0.0999 0.6014 +vn -0.3969 -0.2668 0.8782 +vn -0.3979 0.0051 0.9174 +vn -0.2516 0.2174 0.9431 +vn -0.1188 -0.0431 0.9920 +vn 0.2093 -0.1523 0.9659 +vn 0.1403 0.0419 0.9892 +vn 0.4151 0.2619 0.8713 +vn 0.4735 0.0931 0.8759 +vn 0.7309 0.1457 0.6667 +vn 0.5644 0.2537 0.7855 +vn 0.9239 -0.1326 0.3590 +vn 0.8884 -0.1313 0.4398 +vn 0.9266 -0.1546 -0.3429 +vn 0.9998 0.0177 0.0081 +vn 0.7402 -0.3543 -0.5715 +vn 0.4679 -0.1758 -0.8661 +vn 0.0961 -0.1520 -0.9837 +vn -0.0464 0.1620 -0.9857 +vn -0.5808 -0.1117 -0.8063 +vn -0.7485 0.0428 -0.6618 +vn -0.9316 0.1089 -0.3467 +vn -0.9971 -0.0107 0.0754 +vn -0.9644 0.0262 0.2631 +vn -0.7484 0.2127 0.6283 +vn -0.4742 0.3774 0.7954 +vn -0.1059 -0.1149 0.9877 +vn 0.1827 0.1255 0.9751 +vn 0.5810 -0.0542 0.8121 +vn 0.7213 0.0416 0.6913 +vn 0.8850 -0.0197 0.4652 +vn 0.9135 -0.2466 -0.3236 +vn 0.9929 0.1161 0.0250 +vn 0.7755 -0.2721 -0.5697 +vn 0.4252 -0.3185 -0.8472 +vn 0.0599 -0.2081 -0.9763 +vn -0.0505 0.0979 -0.9939 +vn -0.5450 -0.0726 -0.8353 +vn -0.7814 -0.0393 -0.6228 +vn -0.8860 0.1444 -0.4405 +vn -0.9958 -0.0656 0.0641 +vn -0.9356 -0.1033 0.3377 +vn -0.7072 0.0108 0.7069 +vn -0.5065 0.2300 0.8310 +vn -0.1520 0.0058 0.9884 +vn 0.2282 0.0631 0.9716 +vn 0.5625 0.0674 0.8241 +vn 0.7508 -0.0611 0.6577 +vn 0.8895 0.0630 0.4525 +vn -0.2607 -0.9654 -0.0003 +vn -0.2160 -0.9755 -0.0425 +vn -0.1717 -0.9808 -0.0927 +vn -0.0791 -0.9965 -0.0274 +vn 0.0487 -0.9902 0.1310 +vn 0.1605 -0.9769 0.1409 +vn 0.0587 -0.9948 0.0829 +vn 0.0731 -0.9973 0.0063 +vn -0.0809 -0.9956 0.0475 +vn -0.0340 -0.9984 -0.0461 +vn -0.0835 -0.9922 -0.0931 +vn -0.0831 -0.9961 -0.0285 +vn -0.1863 -0.9822 -0.0217 +vn -0.1608 -0.9808 0.1099 +vn -0.0488 -0.9977 -0.0463 +vn -0.0225 -0.9815 -0.1902 +vn -0.1426 -0.9086 -0.3926 +vn -0.0975 -0.8344 -0.5425 +vn -0.1292 -0.9909 0.0375 +vn 0.0666 -0.9968 0.0437 +vn -0.0494 -0.9678 0.2468 +vn -0.0001 -0.9540 0.2998 +vn -0.1311 -0.9891 0.0675 +vn -0.1809 -0.9783 0.1011 +vn -0.1290 -0.9900 0.0569 +vn 0.0043 -0.9995 -0.0301 +vn -0.0171 -0.9875 0.1569 +vn 0.0041 -1.0000 0.0090 +vn -0.1130 -0.9891 0.0943 +vn -0.0160 -0.9980 -0.0605 +vn -0.0464 -0.9529 -0.2999 +vn 0.0428 -0.9794 -0.1975 +vn 0.0069 -0.9958 -0.0910 +vn 0.0215 -0.9995 0.0240 +vn -0.1473 -0.9881 0.0448 +vn -0.0498 -0.9969 0.0610 +vn 0.0399 -0.9752 -0.2177 +vn 0.2388 -0.9703 0.0387 +vn 0.2577 -0.9548 0.1480 +vn 0.1077 -0.9928 0.0522 +vn -0.1618 -0.9868 0.0061 +vn -0.1907 -0.9730 0.1298 +vn -0.1812 -0.9819 0.0553 +vn 0.1482 -0.9226 -0.3562 +vn 0.2465 -0.9088 -0.3365 +vn 0.1613 -0.9869 -0.0057 +vn -0.0533 -0.9983 -0.0227 +vn 0.2104 -0.9703 0.1196 +vn 0.2847 -0.9562 -0.0674 +vn -0.0782 -0.9905 -0.1127 +vn 0.0223 -0.9982 -0.0554 +vn 0.0220 -0.9965 0.0812 +vn 0.0594 -0.9928 0.1036 +vn -0.0204 -0.9995 -0.0256 +vn 0.1065 -0.9831 0.1487 +vn 0.0301 -0.9915 -0.1262 +vn 0.0499 -0.9958 0.0765 +vn -0.1285 -0.9805 0.1484 +vn -0.0637 -0.9980 0.0053 +vn -0.0903 -0.9951 0.0402 +vn -0.2696 -0.9547 0.1260 +vn 0.0986 -0.9852 -0.1403 +vn 0.1321 -0.8969 -0.4220 +vn 0.2026 -0.9790 0.0212 +vn 0.3837 -0.8191 0.4265 +vn 0.0660 -0.9920 0.1078 +vn -0.2037 -0.9715 -0.1214 +vn -0.0425 -0.9975 0.0562 +vn -0.4628 -0.8811 0.0974 +vn -0.0371 -0.9988 -0.0317 +vn 0.2667 -0.9231 -0.2769 +vn -0.0366 -0.9973 0.0638 +vn -0.0753 -0.9967 0.0299 +vn 0.0295 0.9988 0.0399 +vn -0.0471 0.9920 0.1170 +vn 0.0108 0.9982 0.0588 +vn 0.0865 0.9961 -0.0180 +vn -0.4365 0.8995 0.0194 +vn -0.4909 0.8651 0.1029 +vn -0.4632 0.8843 0.0595 +vn -0.3996 0.9161 -0.0336 +vn -0.5570 0.7881 0.2621 +vn -0.5637 0.7494 0.3472 +vn -0.5619 0.7636 0.3179 +vn -0.5487 0.8125 0.1968 +vn -0.2732 0.6941 0.6660 +vn -0.2978 0.7356 0.6085 +vn -0.2826 0.7100 0.6450 +vn -0.2537 0.6603 0.7068 +vn -0.1006 0.8435 0.5276 +vn -0.1625 0.8716 0.4624 +vn -0.1137 0.8500 0.5143 +vn -0.0348 0.8060 0.5909 +vn 0.3969 0.9174 -0.0299 +vn 0.1432 0.9593 -0.2432 +vn 0.2572 0.9543 -0.1525 +vn 0.5178 0.8509 0.0889 +vn 0.1828 0.9804 0.0731 +vn 0.2422 0.9677 0.0702 +vn 0.1820 0.9806 0.0732 +vn 0.1184 0.9901 0.0760 +vn 0.2088 0.9088 0.3611 +vn 0.4019 0.8680 0.2917 +vn 0.1730 0.9120 0.3720 +vn -0.1463 0.8844 0.4433 +vn 0.3590 0.9226 0.1410 +vn 0.3519 0.9248 0.1445 +vn 0.3566 0.9234 0.1422 +vn 0.3643 0.9210 0.1384 +vn 0.3084 0.8317 -0.4617 +vn 0.2808 0.8731 -0.3985 +vn 0.3034 0.8398 -0.4503 +vn 0.3305 0.7919 -0.5135 +vn 0.4483 0.8664 -0.2199 +vn 0.2389 0.9693 0.0581 +vn 0.3811 0.9161 -0.1249 +vn 0.5410 0.7578 -0.3647 +vn 0.4197 0.8083 -0.4128 +vn 0.4108 0.8940 -0.1787 +vn 0.4185 0.8585 -0.2964 +vn 0.4091 0.7097 -0.5736 +vn 0.1452 0.7922 -0.5927 +vn 0.2657 0.8974 -0.3522 +vn 0.1544 0.8021 -0.5769 +vn -0.0189 0.5727 -0.8195 +vn 0.2450 0.8861 -0.3934 +vn 0.5361 0.8427 -0.0506 +vn 0.2777 0.8901 -0.3615 +vn -0.0135 0.7972 -0.6036 +vn 0.1798 0.9763 -0.1206 +vn 0.0545 0.9705 -0.2350 +vn 0.1257 0.9772 -0.1710 +vn 0.2720 0.9618 -0.0309 +vn -0.5760 0.8171 -0.0254 +vn -0.5469 0.8368 -0.0263 +vn -0.5859 0.8100 -0.0251 +vn -0.6346 0.7725 -0.0235 +vn -0.3371 0.9124 -0.2320 +vn -0.2290 0.9462 -0.2287 +vn -0.3225 0.9178 -0.2318 +vn -0.4226 0.8760 -0.2325 +vn -0.2898 0.9413 -0.1734 +vn -0.2405 0.9475 -0.2108 +vn -0.2696 0.9443 -0.1889 +vn -0.3336 0.9324 -0.1388 +vn 0.1211 0.9806 0.1539 +vn -0.0180 0.9495 0.3131 +vn 0.1846 0.9798 0.0766 +vn 0.3384 0.9327 -0.1245 +vn -0.0502 0.9970 -0.0590 +vn -0.0707 0.9950 0.0708 +vn -0.0449 0.9948 -0.0916 +vn -0.0159 0.9647 -0.2629 +vn 0.0732 0.9607 -0.2677 +vn 0.0149 0.8708 -0.4915 +vn 0.0961 0.9808 -0.1697 +vn 0.1591 0.9777 0.1372 +vn -0.0078 0.9990 0.0444 +vn -0.1444 0.9762 -0.1615 +vn 0.0452 0.9913 0.1234 +vn 0.2130 0.9043 0.3699 +vn 0.2197 0.9482 0.2295 +vn 0.2386 0.9409 0.2405 +vn 0.2080 0.9524 0.2228 +vn 0.1795 0.9619 0.2062 +vn 0.3844 0.9218 0.0496 +vn 0.4952 0.8648 0.0827 +vn 0.3136 0.9491 0.0289 +vn 0.1551 0.9878 -0.0160 +vn 0.5469 0.8121 0.2034 +vn 0.5130 0.8329 0.2076 +vn 0.5507 0.8096 0.2030 +vn 0.5945 0.7797 0.1969 +vn -0.1670 0.9116 0.3756 +vn -0.4121 0.7965 0.4424 +vn 0.2861 0.9391 0.1901 +vn 0.5572 0.8296 0.0372 +vn -0.0433 0.8711 0.4892 +vn -0.0542 0.8688 0.4922 +vn -0.0371 0.8724 0.4875 +vn -0.0227 0.8751 0.4833 +vn 0.4708 0.8619 -0.1882 +vn 0.4215 0.8980 -0.1261 +vn 0.4796 0.8545 -0.1996 +vn 0.5340 0.8001 -0.2732 +vn 0.3662 0.9202 0.1386 +vn 0.4610 0.8873 -0.0128 +vn 0.3260 0.9248 0.1963 +vn 0.1143 0.8832 0.4548 +vn 0.3527 0.9234 -0.1513 +vn 0.4199 0.9076 -0.0014 +vn 0.2444 0.9040 -0.3509 +vn -0.0022 0.7294 -0.6840 +vn -0.4030 0.8322 -0.3808 +vn -0.3593 0.8686 -0.3413 +vn -0.4180 0.8184 -0.3943 +vn -0.4618 0.7736 -0.4339 +vn -0.1944 0.9480 -0.2521 +vn -0.1565 0.9579 -0.2406 +vn -0.2267 0.9381 -0.2617 +vn -0.2735 0.9217 -0.2752 +vn 0.1988 0.8446 -0.4972 +vn 0.2006 0.8442 -0.4970 +vn 0.1973 0.8448 -0.4973 +vn 0.1948 0.8453 -0.4976 +vn -0.4037 0.9148 0.0099 +vn -0.3606 0.9327 0.0053 +vn -0.4168 0.9089 0.0113 +vn -0.4538 0.8910 0.0153 +vn -0.0857 0.9913 -0.0996 +vn -0.1401 0.9850 -0.1003 +vn -0.0936 0.9906 -0.0997 +vn -0.0128 0.9951 -0.0983 +vn 0.1777 0.9780 -0.1090 +vn 0.2883 0.9304 -0.2263 +vn 0.1178 0.9919 -0.0464 +vn -0.0599 0.9889 0.1360 +vn -0.1140 0.9904 -0.0785 +vn -0.1160 0.9892 -0.0899 +vn -0.0797 0.9913 0.1050 +vn -0.0720 0.9869 0.1443 +vn -0.3327 0.9422 -0.0395 +vn -0.3411 0.9380 -0.0610 +vn -0.2576 0.9568 0.1347 +vn -0.2322 0.9543 0.1881 +vn 0.2058 0.8690 -0.4500 +vn 0.1993 0.8661 -0.4585 +vn 0.2696 0.8924 -0.3617 +vn 0.2873 0.8971 -0.3356 +vn 0.3137 0.9488 -0.0363 +vn 0.3477 0.9376 0.0031 +vn -0.1161 0.8830 -0.4548 +vn -0.2857 0.7603 -0.5833 +vn 0.0527 0.9415 0.3328 +vn 0.0571 0.9407 0.3344 +vn 0.0100 0.9484 0.3168 +vn -0.0055 0.9504 0.3109 +vn 0.2045 0.9547 -0.2160 +vn 0.2026 0.9551 -0.2164 +vn 0.2300 0.9500 -0.2112 +vn 0.2382 0.9483 -0.2096 +vn 0.0802 0.9056 0.4164 +vn 0.0616 0.9037 0.4237 +vn 0.3291 0.8950 0.3013 +vn 0.3936 0.8801 0.2654 +vn 0.0115 0.9980 -0.0619 +vn 0.0188 0.9973 -0.0711 +vn -0.0650 0.9973 0.0343 +vn -0.0920 0.9934 0.0684 +vn -0.0989 0.9868 -0.1282 +vn -0.0949 0.9858 -0.1388 +vn -0.1367 0.9902 -0.0268 +vn -0.1505 0.9885 0.0115 +vn -0.4313 0.8952 0.1117 +vn -0.4315 0.9014 0.0372 +vn -0.3478 0.6787 0.6468 +vn -0.2955 0.5592 0.7745 +vn 0.0765 0.9771 0.1983 +vn 0.0771 0.9768 0.1998 +vn 0.0729 0.9792 0.1893 +vn 0.0712 0.9801 0.1851 +vn -0.0443 0.9200 -0.3895 +vn -0.0550 0.9119 -0.4068 +vn 0.0344 0.9657 -0.2572 +vn 0.0643 0.9767 -0.2047 +vn 0.2232 0.9149 0.3365 +vn 0.2725 0.8742 0.4019 +vn -0.0715 0.9956 -0.0601 +vn -0.2433 0.9238 -0.2957 +vn -0.3972 0.9116 0.1062 +vn -0.4400 0.8941 0.0840 +vn 0.0139 0.9585 0.2848 +vn 0.1694 0.9259 0.3377 +vn -0.1190 0.9898 -0.0777 +vn -0.1123 0.9907 -0.0771 +vn -0.1761 0.9808 -0.0833 +vn -0.2061 0.9747 -0.0861 +vn -0.2846 0.9375 -0.2001 +vn -0.3223 0.9277 -0.1883 +vn 0.1900 0.9310 -0.3117 +vn 0.3879 0.8575 -0.3379 +vn 0.0862 0.9599 0.2667 +vn 0.1128 0.9670 0.2286 +vn -0.1616 0.7975 0.5812 +vn -0.2713 0.6655 0.6954 +vn 0.0373 0.9937 0.1054 +vn 0.0290 0.9873 0.1565 +vn 0.1050 0.9321 -0.3465 +vn 0.1217 0.8720 -0.4741 +vn 0.0521 0.9782 0.2011 +vn 0.3516 0.9231 0.1555 +vn -0.5006 0.8606 -0.0936 +vn 0.5784 0.6220 0.5279 +vn -0.3451 0.9384 0.0187 +vn 0.7224 0.6906 0.0338 +vn -0.1751 0.5933 -0.7857 +vn -0.6523 0.7552 -0.0648 +vn -0.3557 0.8094 0.4672 +vn -0.0073 0.6846 -0.7289 +vn -0.7246 0.6594 0.2002 +vn -0.2946 0.7040 0.6462 +vn -0.1888 0.9813 -0.0373 +vn 0.4873 0.8701 0.0740 +vn 0.7577 0.6309 0.1669 +vn -0.3523 0.7594 0.5469 +vn -0.3595 0.9008 -0.2438 +vn -0.2675 0.7875 -0.5552 +vn 0.9788 0.1430 -0.1468 +vn 0.0222 0.3124 -0.9497 +vn -0.9824 0.0310 0.1841 +vn -0.4158 0.0148 0.9093 +vn 0.9350 0.1115 -0.3367 +vn -0.5984 0.2170 -0.7713 +vn -0.8559 0.1520 0.4944 +vn 0.1224 0.1040 0.9870 +vn 0.4599 0.3853 -0.8000 +vn -0.9124 0.0956 -0.3980 +vn -0.6852 0.0151 0.7282 +vn 0.6158 0.0402 0.7869 +vn 0.2767 0.1237 -0.9530 +vn -0.9691 0.1275 0.2113 +vn -0.3399 0.1789 0.9233 +vn 0.9064 0.1936 0.3755 +vn -0.1167 -0.0143 -0.9931 +vn -0.8249 0.2367 0.5134 +vn 0.1177 0.2436 0.9627 +vn 0.9591 0.1613 -0.2326 +vn -0.1163 0.3625 -0.9247 +vn -0.7717 -0.4053 0.4901 +vn 0.2539 0.0005 0.9672 +vn 0.8660 0.0466 -0.4978 +vn -0.7443 0.0600 -0.6652 +vn -0.6397 -0.0212 0.7683 +vn 0.5106 -0.1624 0.8443 +vn 0.7143 0.5511 -0.4313 +vn -0.7936 -0.0628 -0.6052 +vn -0.4382 0.1874 0.8791 +vn 0.8632 0.1917 0.4672 +vn 0.6087 0.2274 -0.7601 +vn -0.9907 0.0618 -0.1216 +vn -0.0684 0.1892 0.9796 +vn 0.9738 0.1521 0.1691 +vn 0.5002 0.0716 -0.8629 +vn -0.9901 -0.0764 0.1175 +vn 0.2112 0.2049 0.9557 +vn 0.9590 0.2562 -0.1215 +vn 0.1053 0.1302 -0.9859 +vn -0.8750 0.0479 0.4818 +vn 0.6813 0.3058 0.6650 +vn 0.5719 0.4100 -0.7105 +vn -0.1776 0.0222 -0.9839 +vn -0.4930 0.0042 0.8700 +vn 0.8018 -0.0581 0.5948 +vn 0.7197 0.4408 -0.5364 +vn -0.6907 -0.0187 -0.7229 +vn -0.4993 0.0416 0.8654 +vn 0.9920 0.1225 -0.0309 +vn 0.5123 0.2231 -0.8293 +vn -0.7479 0.2934 -0.5954 +vn 0.0862 0.1952 0.9770 +vn 0.9332 0.0980 -0.3456 +vn -0.1132 0.0845 -0.9900 +vn -0.9753 0.2205 -0.0125 +vn 0.4169 0.0611 0.9069 +vn 0.8816 0.2648 -0.3908 +vn -0.3177 0.2423 -0.9167 +vn -0.9274 0.1882 0.3232 +vn 0.6597 0.0347 0.7507 +vn 0.6332 0.3429 -0.6939 +vn -0.6210 0.2123 -0.7545 +vn -0.8203 0.1179 0.5597 +vn 0.8148 0.1839 0.5498 +vn 0.5319 0.3385 -0.7762 +vn -0.9637 -0.0688 -0.2579 +vn -0.6449 -0.2512 0.7218 +vn 0.9249 0.3356 0.1789 +vn 0.4435 0.2373 -0.8643 +vn -0.9306 0.2001 -0.3066 +vn -0.5473 -0.1408 0.8250 +vn 0.9691 0.2271 -0.0965 +vn -0.4718 0.3063 -0.8268 +vn -0.9853 0.0056 0.1705 +vn 0.1877 -0.1006 0.9770 +vn 0.7467 0.3515 -0.5646 +vn -0.6970 0.1818 -0.6936 +vn -0.8908 0.0750 0.4482 +vn 0.4622 -0.0401 0.8859 +vn 0.5993 0.3111 -0.7376 +vn -0.8179 0.1351 -0.5592 +vn -0.6882 0.4604 0.5607 +vn 0.6696 0.1268 0.7319 +vn 0.3649 0.2521 -0.8963 +vn -0.9446 0.0733 -0.3199 +vn -0.4083 0.1370 0.9025 +vn 0.7588 0.2420 0.6047 +vn -0.1601 0.1179 -0.9800 +vn -0.9993 0.0300 -0.0245 +vn 0.1789 0.3144 0.9323 +vn 0.8736 0.3561 0.3316 +vn -0.1606 0.3087 -0.9375 +vn -0.9283 -0.1591 0.3360 +vn 0.5050 0.2625 0.8222 +vn 0.9675 0.2522 -0.0178 +vn -0.4095 0.4340 -0.8025 +vn -0.6601 -0.2413 0.7114 +vn 0.5104 -0.0852 0.8557 +vn 0.8526 0.4078 -0.3267 +vn -0.9135 0.0421 -0.4047 +vn 0.0309 0.2610 0.9648 +vn 0.6079 0.2092 0.7660 +vn 0.5996 0.5477 -0.5835 +vn -0.9952 0.0333 -0.0918 +vn 0.1935 0.4026 0.8947 +vn 0.9096 0.3948 0.1298 +vn -0.0156 -0.1008 -0.9948 +vn -0.9987 0.0390 -0.0332 +vn 0.6330 0.2129 0.7443 +vn 0.9728 0.1954 0.1245 +vn -0.3945 0.0967 -0.9138 +vn -0.6163 -0.2855 0.7339 +vn 0.7606 0.4541 0.4639 +vn 0.7307 0.4110 -0.5451 +vn -0.5654 0.1474 -0.8115 +vn -0.7363 -0.2160 0.6413 +vn 0.7288 0.1243 0.6734 +vn 0.5831 0.4173 -0.6970 +vn -0.6712 0.1223 -0.7312 +vn -0.5310 -0.0462 0.8461 +vn 0.8753 0.2361 0.4221 +vn 0.3029 0.5492 -0.7789 +vn -0.7974 0.3812 -0.4678 +vn 0.1105 0.1700 0.9792 +vn 0.9478 0.2953 0.1205 +vn -0.0945 0.1389 -0.9858 +vn -0.9035 -0.1049 -0.4155 +vn 0.3060 0.0318 0.9515 +vn 0.8651 0.3164 -0.3893 +vn -0.3922 0.0778 -0.9166 +vn -0.9942 -0.0269 -0.1040 +vn 0.6085 0.1751 0.7740 +vn 0.4576 0.3673 -0.8098 +vn -0.7931 0.0257 -0.6085 +vn -0.9010 0.1722 0.3982 +vn 0.9006 0.3731 0.2232 +vn 0.1042 0.3317 -0.9376 +vn -0.8829 0.1460 -0.4462 +vn -0.4875 -0.2212 0.8447 +vn 0.9431 0.1674 0.2874 +vn -0.1007 0.5184 -0.8492 +vn -0.9259 0.3048 -0.2231 +vn -0.1380 -0.1775 0.9744 +vn 0.9391 0.3005 -0.1665 +vn -0.3631 0.1586 -0.9181 +vn -0.9892 0.0483 0.1382 +vn -0.0547 0.1035 0.9931 +vn 0.8483 0.1957 -0.4921 +vn -0.6298 0.1357 -0.7648 +vn -0.8515 -0.0108 0.5242 +vn 0.2869 0.1154 0.9510 +vn 0.5976 0.0269 -0.8013 +vn -0.8142 0.1648 -0.5567 +vn -0.6884 0.0660 0.7223 +vn 0.6305 0.1315 0.7650 +vn 0.4717 0.1451 -0.8697 +vn -0.9663 0.1482 -0.2103 +vn -0.2955 -0.0575 0.9536 +vn 0.8511 0.1050 0.5144 +vn -0.1290 0.1627 -0.9782 +vn -0.9736 0.1520 0.1705 +vn 0.0809 0.0721 0.9941 +vn 0.9730 0.1614 0.1649 +vn -0.4247 0.0197 -0.9051 +vn -0.7974 0.1677 0.5797 +vn 0.5584 0.2195 0.8000 +vn 0.9746 0.1620 -0.1548 +vn -0.5236 0.4083 -0.7477 +vn -0.6984 -0.0552 0.7136 +vn 0.6910 0.3321 0.6420 +vn 0.8159 0.1780 -0.5501 +vn -0.8248 0.2876 -0.4868 +vn -0.6532 0.0940 0.7513 +vn 0.7923 0.3209 0.5189 +vn 0.6425 0.3575 -0.6777 +vn -0.9724 0.1167 -0.2018 +vn -0.3660 0.0771 0.9274 +vn 0.9051 0.2942 0.3070 +vn 0.5939 0.1602 -0.7884 +vn -0.9895 0.1262 -0.0699 +vn -0.1422 0.2437 0.9594 +vn 0.9811 0.1456 -0.1278 +vn 0.3594 0.1812 -0.9154 +vn -0.8252 0.0485 0.5627 +vn 0.4080 0.1188 0.9052 +vn 0.8771 -0.0083 -0.4803 +vn 0.0254 0.0589 -0.9979 +vn -0.6719 -0.2690 0.6901 +vn 0.8728 0.3938 0.2882 +vn 0.6467 -0.0501 -0.7611 +vn -0.6047 0.2069 -0.7691 +vn -0.1039 0.1776 0.9786 +vn 0.9459 0.3179 -0.0647 +vn 0.1987 -0.0147 -0.9800 +vn -0.9319 -0.1506 -0.3300 +vn 0.0636 0.1522 0.9863 +vn 0.8307 0.3884 -0.3988 +vn 0.0652 0.2241 -0.9724 +vn -0.9902 -0.0797 0.1143 +vn 0.3904 0.2289 0.8917 +vn 0.6765 0.3183 -0.6641 +vn -0.2239 0.3462 -0.9110 +vn -0.8923 -0.1440 0.4279 +vn 0.6939 0.4494 0.5627 +vn 0.6119 0.2261 -0.7580 +vn -0.6696 0.3132 -0.6735 +vn -0.7534 -0.0358 0.6566 +vn 0.9153 0.1910 0.3545 +vn 0.3905 0.1489 -0.9085 +vn -0.7565 0.2963 -0.5830 +vn -0.6173 0.1501 0.7723 +vn 0.9192 0.0191 0.3934 +vn -0.0288 0.1777 -0.9837 +vn -0.9161 0.1343 -0.3779 +vn -0.3200 0.1709 0.9319 +vn 0.9561 0.2812 -0.0831 +vn -0.3416 0.1301 -0.9308 +vn 0.0272 0.1338 0.9906 +vn 0.8330 0.2872 -0.4729 +vn -0.6493 0.1284 -0.7496 +vn 0.3481 0.1459 0.9260 +vn 0.5708 0.2835 -0.7706 +vn -0.8385 0.2042 -0.5052 +vn 0.6379 0.1491 0.7555 +vn 0.3852 0.2982 -0.8733 +vn -0.9731 0.1414 -0.1818 +vn 0.8713 0.0764 0.4849 +vn -0.1853 0.2455 -0.9515 +vn -0.9786 0.1392 0.1516 +vn 0.9675 0.1742 0.1835 +vn -0.4091 0.0192 -0.9123 +vn -0.8342 0.1344 0.5348 +vn 0.9715 0.1498 -0.1835 +vn -0.6896 -0.1001 -0.7173 +vn -0.5014 0.1694 0.8485 +vn 0.8583 0.1765 -0.4818 +vn -0.8937 -0.0997 -0.4374 +vn -0.1548 0.1605 0.9748 +vn 0.5725 0.1646 -0.8032 +vn -0.9937 0.0019 -0.1124 +vn 0.1564 0.1231 0.9800 +vn 0.1718 0.1233 -0.9774 +vn -0.9795 0.1680 -0.1113 +vn 0.4756 0.1702 0.8630 +vn -0.2017 0.1285 -0.9710 +vn -0.9029 0.2944 0.3131 +vn 0.7002 0.1320 0.7017 +vn -0.4545 0.1012 -0.8850 +vn -0.4287 0.4008 0.8097 +vn 0.8282 0.1241 0.5465 +vn -0.6461 0.1120 -0.7550 +vn -0.2687 0.3431 0.9000 +vn 0.9506 0.1206 0.2861 +vn -0.8091 0.1321 -0.5726 +vn 0.0634 0.0278 0.9976 +vn 0.9936 0.1095 -0.0290 +vn -0.9247 0.1704 -0.3405 +vn 0.4370 -0.0552 0.8978 +vn 0.9309 0.1436 -0.3359 +vn -0.9875 0.1570 0.0157 +vn 0.5309 -0.0639 0.8450 +vn 0.6804 0.1692 -0.7131 +vn -0.9142 0.1049 0.3915 +vn 0.7993 -0.0673 0.5972 +vn 0.3211 0.2078 -0.9240 +vn -0.6921 0.1704 0.7014 +vn 0.9534 0.1329 0.2709 +vn 0.0042 0.1401 -0.9901 +vn -0.3394 0.1041 0.9349 +vn 0.9867 -0.1103 -0.1195 +vn -0.2612 0.0621 -0.9633 +vn -0.9826 0.1094 0.1502 +vn -0.1553 0.0128 0.9878 +vn 0.8622 -0.0094 -0.5064 +vn -0.6845 0.1380 -0.7158 +vn -0.7947 0.1283 0.5933 +vn 0.2783 0.0625 0.9584 +vn 0.5966 0.1351 -0.7911 +vn -0.8402 -0.0668 -0.5381 +vn -0.7156 -0.1150 0.6890 +vn 0.6728 -0.0039 0.7398 +vn 0.3535 -0.0345 -0.9348 +vn -0.9969 0.0762 0.0186 +vn -0.3243 0.1290 0.9371 +vn 0.8386 0.1720 0.5170 +vn -0.0563 -0.0656 -0.9963 +vn -0.9320 0.0945 0.3499 +vn 0.0249 0.1971 0.9801 +vn 0.9955 0.0906 0.0267 +vn -0.3347 -0.0711 -0.9397 +vn -0.8863 -0.0467 0.4608 +vn 0.4320 0.2211 0.8744 +vn 0.9526 0.0570 -0.2990 +vn -0.6717 -0.0863 -0.7358 +vn -0.6424 -0.0390 0.7654 +vn 0.6222 0.1676 0.7647 +vn 0.8780 0.1753 -0.4454 +vn -0.8690 -0.0929 -0.4860 +vn -0.4717 0.0660 0.8793 +vn 0.8864 0.1659 0.4322 +vn 0.6539 0.1612 -0.7392 +vn -0.9619 -0.0784 -0.2620 +vn -0.0889 0.0988 0.9911 +vn 0.9478 0.1586 0.2767 +vn 0.5068 0.0523 -0.8605 +vn -0.9907 -0.0787 0.1110 +vn 0.1803 0.0379 0.9829 +vn 0.9758 0.1907 -0.1067 +vn 0.1284 0.0455 -0.9907 +vn -0.8567 -0.1176 0.5022 +vn 0.6306 0.0163 0.7759 +vn 0.7567 0.2414 -0.6075 +vn -0.1249 0.1050 -0.9866 +vn -0.5647 -0.1418 0.8130 +vn 0.8338 -0.0528 0.5496 +vn 0.7420 0.3079 -0.5954 +vn -0.6376 0.0473 -0.7689 +vn -0.3883 -0.1163 0.9142 +vn 0.9929 0.1185 -0.0142 +vn 0.2547 0.2395 -0.9369 +vn -0.7948 0.1805 -0.5794 +vn 0.0134 -0.0817 0.9966 +vn 0.9407 0.0821 -0.3291 +vn -0.0030 0.1210 -0.9927 +vn -0.9995 -0.0243 -0.0195 +vn 0.2753 -0.1493 0.9497 +vn 0.8441 0.0701 -0.5317 +vn -0.3808 0.1011 -0.9191 +vn -0.9395 -0.0245 0.3417 +vn 0.7400 -0.1379 0.6583 +vn 0.5902 0.2226 -0.7760 +vn -0.5557 0.2090 -0.8047 +vn -0.8299 0.0489 0.5557 +vn 0.8731 -0.0146 0.4873 +vn 0.4351 0.1122 -0.8934 +vn -0.9124 0.1697 -0.3726 +vn -0.5494 -0.1707 0.8179 +vn 0.9647 -0.0124 0.2631 +vn 0.1653 0.0548 -0.9847 +vn -0.9390 0.1902 -0.2865 +vn -0.4245 -0.0163 0.9053 +vn 0.9926 -0.0307 -0.1177 +vn -0.4037 0.1737 -0.8982 +vn -0.9874 0.0681 0.1429 +vn 0.1011 -0.1352 0.9856 +vn 0.7929 0.0494 -0.6073 +vn -0.6546 0.1395 -0.7430 +vn -0.9278 0.1109 0.3561 +vn 0.3698 -0.1037 0.9233 +vn 0.7158 0.1059 -0.6903 +vn -0.8358 -0.0795 -0.5433 +vn -0.6380 0.1364 0.7579 +vn 0.6392 0.0006 0.7691 +vn 0.2973 0.0184 -0.9546 +vn -0.9537 -0.1359 -0.2682 +vn -0.2360 0.0500 0.9705 +vn 0.8153 0.2073 0.5407 +vn -0.0206 -0.0535 -0.9984 +vn -0.9916 -0.1103 0.0678 +vn 0.0129 0.1050 0.9944 +vn 0.9390 0.2019 0.2783 +vn -0.4297 -0.1727 -0.8863 +vn -0.8588 -0.0625 0.5084 +vn 0.5307 0.1515 0.8339 +vn 0.9741 0.2124 -0.0776 +vn -0.5970 -0.0987 -0.7961 +vn -0.6630 0.0287 0.7480 +vn 0.6855 0.0558 0.7259 +vn 0.8357 0.1480 -0.5288 +vn -0.9216 -0.0115 -0.3881 +vn -0.2068 -0.0917 0.9741 +vn 0.7476 0.0139 0.6640 +vn 0.6527 0.1217 -0.7478 +vn -0.9657 -0.1038 -0.2379 +vn 0.1175 -0.0177 0.9929 +vn 0.9648 0.1141 0.2368 +vn 0.2130 0.1918 -0.9581 +vn -0.9936 -0.0742 0.0853 +vn 0.3804 -0.2024 0.9024 +vn 0.9946 0.0975 -0.0356 +vn -0.1113 0.1831 -0.9768 +vn -0.7595 -0.1731 0.6271 +vn 0.6523 -0.0267 0.7575 +vn 0.8634 0.3233 -0.3873 +vn -0.3903 0.2593 -0.8834 +vn -0.7480 -0.2308 0.6223 +vn 0.8542 0.0831 0.5133 +vn 0.5202 0.2940 -0.8019 +vn -0.5972 0.1232 -0.7926 +vn -0.2739 -0.1591 0.9485 +vn 0.9504 0.1639 0.2644 +vn 0.2020 0.1698 -0.9646 +vn -0.8696 0.0346 -0.4926 +vn 0.0160 -0.0606 0.9980 +vn 0.9927 0.1110 -0.0482 +vn 0.0139 0.1235 -0.9922 +vn -0.9593 -0.0784 -0.2714 +vn 0.4066 -0.0083 0.9136 +vn 0.8786 0.1197 -0.4624 +vn -0.4862 0.0127 -0.8738 +vn -0.9961 -0.0620 0.0633 +vn 0.5321 -0.0454 0.8455 +vn 0.6650 0.0905 -0.7414 +vn -0.7135 0.0649 -0.6976 +vn -0.8890 0.0044 0.4579 +vn 0.9012 -0.1357 0.4115 +vn 0.3046 0.1786 -0.9356 +vn -0.7757 0.1113 -0.6213 +vn -0.6607 -0.0565 0.7485 +vn 0.9643 -0.0919 0.2484 +vn -0.1017 0.2163 -0.9710 +vn -0.9666 0.1546 -0.2045 +vn -0.2606 -0.1180 0.9582 +vn 0.9858 -0.0054 -0.1680 +vn -0.2423 0.0699 -0.9677 +vn -0.9804 0.0279 0.1952 +vn -0.1481 -0.0052 0.9890 +vn 0.9300 -0.0486 -0.3643 +vn -0.5954 0.0456 -0.8022 +vn -0.8581 0.0676 0.5091 +vn 0.2174 0.0382 0.9753 +vn 0.5128 0.1982 -0.8353 +vn -0.8699 0.1069 -0.4814 +vn -0.6501 0.0357 0.7590 +vn 0.6384 0.0034 0.7697 +vn 0.2730 0.0377 -0.9613 +vn -0.9965 0.0046 -0.0835 +vn -0.2680 0.0393 0.9626 +vn 0.9039 0.0603 0.4235 +vn -0.0044 0.0070 -1.0000 +vn -0.9633 -0.0115 0.2680 +vn -0.0440 0.0434 0.9981 +vn 0.9930 0.0951 0.0695 +vn -0.5246 -0.0907 -0.8465 +vn -0.7852 0.0615 0.6161 +vn 0.3623 0.0585 0.9302 +vn 0.9572 0.0888 -0.2753 +vn -0.7421 0.0516 -0.6683 +vn -0.5655 -0.0281 0.8242 +vn 0.6916 0.0711 0.7188 +vn 0.7928 0.0560 -0.6069 +vn -0.7916 0.1842 -0.5826 +vn -0.3886 -0.2295 0.8924 +vn 0.8765 0.0773 0.4752 +vn 0.5977 0.1180 -0.7930 +vn -0.9768 0.0525 -0.2078 +vn -0.2146 -0.1776 0.9604 +vn 0.9347 0.2837 0.2143 +vn 0.4091 0.3452 -0.8447 +vn -0.9989 -0.0309 0.0349 +vn 0.2295 -0.2610 0.9377 +vn 0.9549 0.1407 -0.2615 +vn 0.1474 0.3493 -0.9253 +vn -0.8847 -0.2835 0.3701 +vn 0.6177 -0.0767 0.7826 +vn 0.8147 0.1166 -0.5681 +vn -0.3040 0.3101 -0.9008 +vn -0.4585 -0.2976 0.8374 +vn 0.8760 0.1184 0.4675 +vn 0.6650 0.1145 -0.7380 +vn -0.6571 0.1144 -0.7451 +vn -0.0729 0.1408 0.9873 +vn 0.9389 0.3153 0.1381 +vn 0.2666 0.2032 -0.9421 +vn -0.8922 -0.0541 -0.4484 +vn -0.0402 -0.0830 0.9957 +vn 0.9370 0.2388 -0.2550 +vn 0.1417 0.1343 -0.9808 +vn -0.9837 -0.1320 -0.1221 +vn 0.4783 0.1184 0.8702 +vn 0.7661 0.2338 -0.5987 +vn -0.3263 0.1570 -0.9321 +vn -0.9380 -0.1917 0.2887 +vn 0.6586 0.1400 0.7394 +vn 0.6866 0.0993 -0.7203 +vn -0.6160 0.1191 -0.7787 +vn -0.8192 -0.1191 0.5611 +vn 0.7797 -0.0466 0.6245 +vn 0.4729 0.0717 -0.8782 +vn -0.8442 0.0660 -0.5320 +vn -0.7294 -0.0034 0.6841 +vn 0.9713 -0.0817 0.2235 +vn 0.1341 0.0844 -0.9874 +vn -0.9796 0.0460 -0.1954 +vn -0.4489 0.0113 0.8935 +vn 0.9791 0.0444 -0.1983 +vn -0.4315 0.0355 -0.9014 +vn 0.1274 0.0167 0.9917 +vn 0.8499 0.0212 -0.5265 +vn -0.6765 0.0335 -0.7357 +vn 0.4310 0.0207 0.9021 +vn 0.6707 0.0437 -0.7404 +vn -0.8411 0.0325 -0.5399 +vn 0.6545 0.0233 0.7557 +vn 0.3092 0.0443 -0.9500 +vn -0.9638 0.0276 -0.2651 +vn 0.8338 0.0265 0.5515 +vn -0.0009 0.0454 -0.9990 +vn -0.9973 0.0139 0.0722 +vn 0.9628 0.0400 0.2673 +vn -0.2616 0.0295 -0.9647 +vn -0.8988 0.0065 0.4384 +vn 0.9953 0.0548 -0.0804 +vn -0.6480 0.0074 -0.7616 +vn -0.6015 0.0249 0.7985 +vn 0.8934 0.0666 -0.4442 +vn -0.8964 -0.0156 -0.4429 +vn -0.2013 0.0534 0.9781 +vn 0.5918 0.0409 -0.8050 +vn -0.9945 -0.0367 -0.0977 +vn 0.1935 0.0633 0.9791 +vn 0.1831 0.0202 -0.9829 +vn -0.9773 -0.0225 0.2106 +vn 0.4847 0.0733 0.8716 +vn -0.2047 0.0085 -0.9788 +vn -0.8597 0.0010 0.5108 +vn 0.7018 0.0565 0.7101 +vn -0.4507 0.0016 -0.8927 +vn -0.6512 0.0155 0.7588 +vn 0.8331 0.0134 0.5530 +vn -0.6471 0.0331 -0.7617 +vn -0.3580 -0.0141 0.9336 +vn 0.9541 0.0028 0.2993 +vn -0.8104 0.0650 -0.5823 +vn -0.0782 -0.0354 0.9963 +vn 0.9992 0.0141 -0.0377 +vn -0.9455 0.0709 -0.3177 +vn 0.4141 -0.0564 0.9085 +vn 0.9267 0.0301 -0.3746 +vn -0.9981 0.0508 0.0342 +vn 0.5593 -0.0479 0.8276 +vn 0.6438 0.0587 -0.7629 +vn -0.9062 0.0375 0.4211 +vn 0.8712 0.0051 0.4908 +vn 0.2499 0.0651 -0.9661 +vn -0.6156 0.0080 0.7880 +vn 0.9873 0.0349 0.1553 +vn -0.1163 0.0482 -0.9920 +vn -0.2314 0.0069 0.9728 +vn 0.9707 -0.1932 -0.1427 +vn -0.4251 -0.1024 -0.8993 +vn -0.9510 0.2506 0.1812 +vn 0.0222 0.1465 0.9890 +vn 0.7672 -0.2881 -0.5731 +vn -0.7844 0.1756 -0.5949 +vn -0.8114 0.3532 0.4657 +vn 0.4926 0.2079 0.8451 +vn 0.7009 -0.3876 -0.5987 +vn -0.7443 0.0087 -0.6678 +vn -0.6980 0.3973 0.5957 +vn 0.7252 0.0088 0.6885 +vn 0.3338 -0.2126 -0.9184 +vn -0.9741 0.1581 -0.1619 +vn -0.3507 0.2667 0.8977 +vn 0.7426 0.0735 0.6657 +vn 0.0078 -0.2104 -0.9776 +vn -0.9684 0.1614 0.1901 +vn -0.0558 0.3125 0.9483 +vn 0.9758 0.0285 0.2166 +vn -0.4276 -0.3482 -0.8342 +vn -0.9495 0.1339 0.2838 +vn 0.4259 0.3656 0.8276 +vn 0.9907 -0.0344 -0.1317 +vn -0.6223 -0.2835 -0.7296 +vn -0.5824 0.1289 0.8026 +vn 0.7315 0.3231 0.6004 +vn 0.9544 -0.0534 -0.2937 +vn -0.8717 -0.2497 -0.4218 +vn -0.3200 0.0075 0.9474 +vn 0.7656 0.3557 0.5361 +vn 0.6339 0.0196 -0.7732 +vn -0.8936 -0.3197 -0.3151 +vn 0.0843 -0.0965 0.9918 +vn 0.8574 0.3592 0.3687 +vn 0.3793 0.2145 -0.9000 +vn -0.9274 -0.2076 0.3110 +vn 0.3601 -0.0360 0.9322 +vn 0.9300 0.2581 -0.2617 +vn -0.0469 0.2205 -0.9743 +vn -0.8526 -0.2372 0.4656 +vn 0.5281 0.0047 0.8492 +vn 0.8864 0.0874 -0.4546 +vn -0.1811 0.1438 -0.9729 +vn -0.6513 -0.2229 0.7253 +vn 0.9436 0.1689 0.2849 +vn 0.6778 0.1072 -0.7274 +vn -0.5480 0.0370 -0.8356 +vn -0.2487 -0.1711 0.9534 +vn 0.9829 0.1356 0.1241 +vn 0.2534 0.0912 -0.9630 +vn -0.9193 -0.0134 -0.3934 +vn -0.0978 -0.3052 0.9473 +vn 0.9797 0.1447 -0.1385 +vn 0.0083 0.3592 -0.9332 +vn -0.9873 0.0269 -0.1567 +vn 0.2729 -0.2258 0.9352 +vn 0.8478 0.1111 -0.5186 +vn -0.3038 0.3557 -0.8838 +vn -0.9896 -0.0368 0.1389 +vn 0.7329 -0.1170 0.6702 +vn 0.6375 -0.0277 -0.7700 +vn -0.4764 0.2969 -0.8276 +vn -0.8318 0.0579 0.5520 +vn 0.7680 -0.2925 0.5698 +vn 0.1982 -0.0907 -0.9760 +vn -0.7951 0.5088 -0.3301 +vn -0.6744 0.2439 0.6969 +vn 0.9219 -0.3285 0.2052 +vn -0.0065 -0.0400 -0.9992 +vn -0.9221 0.3575 -0.1482 +vn -0.2503 0.1858 0.9502 +vn 0.9644 -0.1897 -0.1841 +vn -0.2655 -0.1078 -0.9581 +vn -0.9784 0.1933 0.0738 +vn 0.0704 0.1890 0.9795 +vn 0.8649 -0.1932 -0.4633 +vn -0.5308 -0.0883 -0.8429 +vn -0.9281 0.1392 0.3452 +vn 0.2001 0.2075 0.9576 +vn 0.6801 -0.3637 -0.6366 +vn -0.9190 0.1721 -0.3546 +vn -0.5967 0.2381 0.7664 +vn 0.5427 0.1489 0.8266 +vn 0.1881 -0.2367 -0.9532 +vn -0.9658 0.1747 -0.1917 +vn -0.0867 0.1708 0.9815 +vn 0.9081 -0.0634 0.4140 +vn 0.0669 -0.1670 -0.9837 +vn -0.9792 0.1501 0.1368 +vn -0.0636 0.1986 0.9780 +vn 0.9781 -0.0578 0.1999 +vn -0.3693 -0.3906 -0.8432 +vn -0.7249 0.3705 0.5807 +vn 0.3541 0.3568 0.8644 +vn 0.9848 -0.0589 -0.1633 +vn -0.8065 -0.2555 -0.5332 +vn -0.4664 0.2434 0.8504 +vn 0.5519 0.5429 0.6330 +vn 0.7470 -0.2961 -0.5953 +vn -0.8528 -0.2304 -0.4687 +vn -0.1862 0.2123 0.9593 +vn 0.7460 0.4255 0.5124 +vn 0.5154 -0.1222 -0.8482 +vn -0.9211 -0.2022 -0.3327 +vn -0.1252 0.0835 0.9886 +vn 0.8930 0.3595 0.2707 +vn 0.2953 -0.0317 -0.9549 +vn -0.9528 -0.1712 0.2508 +vn 0.4374 0.2167 0.8728 +vn 0.9468 0.1961 -0.2553 +vn 0.1285 -0.0050 -0.9917 +vn -0.8355 0.0624 0.5459 +vn 0.7245 0.0532 0.6872 +vn 0.9072 -0.1189 -0.4036 +vn -0.4584 -0.0492 -0.8874 +vn -0.7157 0.0377 0.6974 +vn 0.8001 0.0890 0.5932 +vn 0.5571 -0.2705 -0.7851 +vn -0.6603 0.0074 -0.7510 +vn -0.2617 0.0500 0.9639 +vn 0.9723 -0.0264 0.2324 +vn 0.3694 0.0547 -0.9277 +vn -0.8177 0.0028 -0.5756 +vn -0.0305 -0.2296 0.9728 +vn 0.9958 -0.0558 -0.0721 +vn 0.0145 0.3007 -0.9536 +vn -0.9429 0.1879 -0.2749 +vn 0.3953 -0.3009 0.8679 +vn 0.9252 -0.1156 -0.3614 +vn -0.4188 0.4648 -0.7801 +vn -0.9810 0.1921 0.0259 +vn 0.4734 -0.1914 0.8598 +vn 0.7162 -0.0712 -0.6942 +vn -0.6636 0.4787 -0.5749 +vn -0.9175 0.1903 0.3492 +vn 0.8028 -0.3917 0.4496 +vn 0.4288 -0.1575 -0.8895 +vn -0.7868 0.4011 -0.4690 +vn -0.6903 0.3515 0.6324 +vn 0.9504 -0.2898 0.1129 +vn -0.0444 -0.0864 -0.9953 +vn -0.9681 0.2422 -0.0648 +vn -0.3615 0.2386 0.9013 +vn 0.9705 -0.2103 -0.1181 +vn -0.1112 -0.1043 -0.9883 +vn -0.9557 0.2220 0.1935 +vn -0.2950 0.2534 0.9213 +vn 0.9338 -0.3066 -0.1847 +vn -0.5603 -0.0107 -0.8283 +vn -0.7849 0.3001 0.5420 +vn 0.1179 0.2797 0.9528 +vn 0.6499 -0.2659 -0.7120 +vn -0.9086 0.0938 -0.4070 +vn -0.6165 0.2771 0.7370 +vn 0.6513 0.1243 0.7486 +vn 0.0893 -0.2227 -0.9708 +vn -0.9859 0.1673 -0.0012 +vn -0.2755 0.2065 0.9389 +vn 0.9447 0.0012 0.3279 +vn 0.0361 -0.1718 -0.9845 +vn -0.9081 0.1853 0.3756 +vn -0.1187 0.2483 0.9614 +vn 0.9984 -0.0292 -0.0478 +vn -0.5864 -0.2058 -0.7834 +vn -0.7706 0.2141 0.6003 +vn 0.3353 0.1635 0.9278 +vn 0.9326 -0.0204 -0.3603 +vn -0.7338 -0.2624 -0.6267 +vn -0.5028 0.3639 0.7841 +vn 0.6704 0.3064 0.6758 +vn 0.8039 -0.0852 -0.5886 +vn -0.5889 -0.4060 -0.6989 +vn -0.3655 0.2827 0.8868 +vn 0.7713 0.3354 0.5409 +vn 0.6498 -0.0922 -0.7545 +vn -0.9749 -0.1668 -0.1472 +vn -0.0170 0.3091 0.9509 +vn 0.9336 0.3083 0.1824 +vn 0.3583 -0.0817 -0.9300 +vn -0.9573 -0.2413 0.1595 +vn 0.3160 0.2198 0.9230 +vn 0.9369 0.2252 -0.2674 +vn -0.0325 -0.0759 -0.9966 +vn -0.9709 -0.0548 0.2330 +vn 0.6083 0.1578 0.7779 +vn 0.7691 0.3053 -0.5615 +vn -0.3651 -0.0914 -0.9265 +vn -0.4406 0.0641 0.8954 +vn 0.8657 -0.0462 0.4985 +vn 0.6505 0.3159 -0.6907 +vn -0.6790 0.0438 -0.7328 +vn -0.2787 -0.0862 0.9565 +vn 0.9692 -0.1506 0.1949 +vn 0.2485 0.2838 -0.9261 +vn -0.8228 0.3111 -0.4756 +vn -0.0035 -0.2725 0.9622 +vn 0.9696 -0.1510 -0.1924 +vn 0.2262 0.2475 -0.9421 +vn -0.9353 0.3337 -0.1181 +vn 0.4895 -0.3858 0.7820 +vn 0.8502 -0.1179 -0.5132 +vn -0.2886 0.2484 -0.9247 +vn -0.9367 0.3259 0.1281 +vn 0.6293 -0.2808 0.7247 +vn 0.6517 -0.1086 -0.7506 +vn -0.7098 0.2350 -0.6641 +vn -0.8535 0.2876 0.4345 +vn 0.6816 -0.1494 0.7163 +vn 0.4756 -0.0313 -0.8791 +vn -0.8840 0.1896 -0.4272 +vn -0.6918 0.2359 0.6825 +vn 0.9783 -0.2058 0.0248 +vn 0.2629 -0.0945 -0.9602 +vn -0.9582 0.1656 -0.2333 +vn -0.4832 0.1637 0.8601 +vn 0.9794 0.0396 -0.1980 +vn -0.4663 0.1234 -0.8760 +vn 0.2247 -0.0354 0.9738 +vn 0.8697 0.0705 -0.4885 +vn -0.6644 0.0799 -0.7431 +vn 0.4534 -0.0172 0.8911 +vn 0.6224 0.0625 -0.7802 +vn -0.8213 0.0310 -0.5696 +vn 0.6632 0.0373 0.7475 +vn 0.3388 0.0697 -0.9383 +vn -0.9487 -0.0180 -0.3158 +vn 0.8105 0.0797 0.5803 +vn 0.0783 0.0373 -0.9962 +vn -0.9995 -0.0296 -0.0094 +vn 0.9330 0.1238 0.3379 +vn -0.2821 -0.0462 -0.9583 +vn -0.9278 -0.0540 0.3692 +vn 0.9869 0.1558 -0.0415 +vn -0.5747 -0.1397 -0.8063 +vn -0.6877 0.0427 0.7247 +vn 0.9107 0.1092 -0.3983 +vn -0.7669 -0.1843 -0.6147 +vn -0.3298 0.1474 0.9325 +vn 0.7079 0.0317 -0.7056 +vn -0.9611 -0.1611 -0.2244 +vn 0.0862 0.2066 0.9746 +vn 0.3014 -0.0484 -0.9523 +vn -0.9465 -0.0327 0.3211 +vn 0.4245 0.2086 0.8811 +vn -0.0893 -0.0907 -0.9919 +vn -0.8550 0.0426 0.5169 +vn 0.7192 0.1456 0.6793 +vn -0.3359 -0.0580 -0.9401 +vn -0.6386 0.0572 0.7674 +vn 0.8740 0.0141 0.4857 +vn -0.5960 0.0682 -0.8000 +vn -0.4615 -0.0007 0.8871 +vn 0.9842 -0.0685 0.1633 +vn -0.8259 0.1813 -0.5340 +vn -0.0780 -0.1195 0.9898 +vn 0.9828 -0.0751 -0.1689 +vn -0.9530 0.2221 -0.2063 +vn 0.2867 -0.1670 0.9434 +vn 0.8993 -0.0057 -0.4373 +vn -0.9739 0.1623 0.1585 +vn 0.7117 -0.1543 0.6853 +vn 0.5932 0.1083 -0.7977 +vn -0.8424 0.0679 0.5345 +vn 0.9062 -0.1009 0.4107 +vn 0.1942 0.1747 -0.9653 +vn -0.5408 -0.0309 0.8406 +vn 0.9952 -0.0031 0.0978 +vn -0.1604 0.1719 -0.9720 +vn -0.1712 -0.0781 0.9821 +vn 0.9594 -0.2492 -0.1324 +vn -0.4077 0.1349 -0.9031 +vn -0.9557 0.2823 0.0838 +vn 0.0442 0.0693 0.9966 +vn 0.8731 -0.2082 -0.4408 +vn -0.7157 0.1556 -0.6809 +vn -0.8650 0.3998 0.3031 +vn 0.3726 -0.1039 0.9222 +vn 0.7411 -0.1215 -0.6603 +vn -0.8189 -0.0685 -0.5698 +vn -0.6588 0.3291 0.6765 +vn 0.6070 0.0377 0.7938 +vn 0.3361 -0.0940 -0.9371 +vn -0.9848 -0.0465 -0.1676 +vn -0.3897 0.3293 0.8600 +vn 0.7906 0.2114 0.5747 +vn 0.0645 -0.1523 -0.9862 +vn -0.9655 0.0923 0.2435 +vn 0.0053 0.2234 0.9747 +vn 0.9901 0.0505 0.1309 +vn -0.4716 -0.0919 -0.8770 +vn -0.8298 -0.1365 0.5412 +vn 0.3549 0.1305 0.9258 +vn 0.9873 -0.0098 -0.1588 +vn -0.5852 -0.1019 -0.8045 +vn -0.6690 0.0659 0.7403 +vn 0.7366 -0.0260 0.6758 +vn 0.8134 0.2348 -0.5322 +vn -0.8685 -0.0753 -0.4899 +vn 0.0566 0.2481 0.9671 +vn 0.7177 0.2279 0.6580 +vn 0.6485 -0.1058 -0.7538 +vn -0.9690 -0.0175 -0.2464 +vn 0.3391 0.1394 0.9303 +vn 0.9517 0.1286 0.2789 +vn -0.0005 -0.1490 -0.9888 +vn -0.9048 -0.1050 0.4128 +vn 0.6354 0.2050 0.7445 +vn 0.8788 0.1522 -0.4523 +vn -0.2819 -0.0659 -0.9572 +vn -0.9200 -0.1004 0.3788 +vn 0.5362 0.1550 0.8297 +vn 0.8893 0.3040 -0.3417 +vn -0.5117 -0.1790 -0.8403 +vn -0.7174 -0.2075 0.6651 +vn 0.7895 -0.2789 0.5468 +vn 0.5564 0.3720 -0.7430 +vn -0.5105 0.0654 -0.8574 +vn -0.1686 -0.0923 0.9814 +vn 0.9269 -0.0725 0.3682 +vn 0.2012 0.3228 -0.9248 +vn -0.6937 0.3274 -0.6416 +vn 0.0569 -0.0967 0.9937 +vn 0.9938 -0.0958 0.0564 +vn -0.0264 0.1404 -0.9897 +vn -0.9245 0.1885 -0.3313 +vn 0.3660 -0.0153 0.9305 +vn 0.9120 -0.1571 -0.3789 +vn -0.2750 0.1467 -0.9502 +vn -0.9774 0.2014 -0.0648 +vn 0.6305 -0.1432 0.7629 +vn 0.6700 0.0457 -0.7409 +vn -0.6893 0.0980 -0.7178 +vn -0.8635 0.2836 0.4171 +vn 0.7887 -0.1585 0.5940 +vn 0.3079 0.1793 -0.9344 +vn -0.7854 -0.0932 -0.6119 +vn -0.6102 -0.1295 0.7816 +vn 0.9932 -0.1160 -0.0099 +vn 0.0215 -0.0169 -0.9996 +vn -0.9864 0.1554 0.0534 +vn -0.3080 -0.0717 0.9487 +vn 0.9647 -0.2208 -0.1432 +vn -0.2558 -0.0353 -0.9661 +vn -0.9617 0.2688 -0.0537 +vn 0.0012 0.1633 0.9866 +vn 0.8681 -0.3241 -0.3761 +vn -0.6064 -0.0018 -0.7952 +vn -0.8634 0.3240 0.3866 +vn 0.2445 0.1481 0.9583 +vn 0.5857 -0.1571 -0.7952 +vn -0.9169 0.0978 -0.3870 +vn -0.6276 0.1583 0.7622 +vn 0.6177 0.0831 0.7820 +vn 0.2775 -0.1619 -0.9470 +vn -0.9843 0.1174 -0.1316 +vn -0.2615 0.2643 0.9283 +vn 0.9182 -0.0533 0.3925 +vn -0.0273 -0.0953 -0.9951 +vn -0.9803 0.1099 0.1639 +vn 0.0239 0.1235 0.9921 +vn 0.9828 -0.0059 0.1844 +vn -0.2406 0.0506 -0.9693 +vn -0.8143 0.0765 0.5754 +vn 0.1239 0.1057 0.9867 +vn 0.9792 -0.0193 -0.2021 +vn -0.6822 0.2379 -0.6913 +vn -0.6231 -0.1768 0.7619 +vn 0.7092 -0.0590 0.7026 +vn 0.8136 0.1516 -0.5613 +vn -0.7651 0.0032 -0.6439 +vn -0.4315 -0.0187 0.9019 +vn 0.8702 -0.1373 0.4732 +vn 0.6976 0.1950 -0.6894 +vn -0.9485 -0.0312 -0.3153 +vn -0.1108 -0.0489 0.9926 +vn 0.9555 0.0149 0.2945 +vn 0.4691 0.0634 -0.8808 +vn -0.9330 -0.0645 0.3542 +vn 0.3536 0.0764 0.9323 +vn 0.8848 0.2532 -0.3911 +vn 0.1739 0.0406 -0.9839 +vn -0.9294 -0.2333 0.2859 +vn 0.6304 0.0128 0.7762 +vn 0.8755 0.2755 -0.3969 +vn -0.2368 0.1048 -0.9659 +vn -0.6188 -0.4406 0.6504 +vn 0.8727 0.0834 0.4811 +vn 0.4989 0.4640 -0.7320 +vn -0.6409 0.0988 -0.7613 +vn -0.2654 -0.0583 0.9624 +vn 0.9952 0.0966 0.0122 +vn 0.4594 0.1957 -0.8664 +vn -0.8678 -0.0089 -0.4969 +vn 0.0228 -0.0660 0.9976 +vn 0.9410 0.0469 -0.3350 +vn -0.0704 0.1192 -0.9904 +vn -0.9976 0.0459 -0.0520 +vn 0.3292 -0.0504 0.9429 +vn 0.8191 0.1339 -0.5579 +vn -0.2896 -0.0177 -0.9570 +vn -0.9608 0.0541 0.2719 +vn 0.6708 0.0963 0.7353 +vn 0.6097 0.1905 -0.7694 +vn -0.6614 -0.1434 -0.7362 +vn -0.8359 -0.1363 0.5318 +vn 0.7162 0.2266 0.6601 +vn 0.4361 -0.0474 -0.8986 +vn -0.8366 -0.0328 -0.5469 +vn -0.7537 -0.0916 0.6508 +vn 0.9929 -0.1032 -0.0601 +vn 0.0250 -0.1060 -0.9941 +vn -0.9839 0.1701 0.0554 +vn -0.3729 0.2017 0.9057 +vn 0.9962 -0.0221 -0.0847 +vn -0.3234 0.1547 -0.9335 +vn -0.9893 0.0122 0.1451 +vn -0.0457 -0.0314 0.9985 +vn 0.8862 0.1713 -0.4306 +vn -0.6227 0.1154 -0.7739 +vn -0.8729 -0.0503 0.4854 +vn 0.3365 -0.0586 0.9399 +vn 0.6006 -0.0778 -0.7958 +vn -0.8823 0.0150 -0.4705 +vn -0.6307 0.0787 0.7720 +vn 0.6806 0.1160 0.7234 +vn 0.1887 0.0280 -0.9816 +vn -0.9912 -0.0010 -0.1323 +vn -0.2717 0.0210 0.9622 +vn 0.8966 0.0989 0.4316 +vn 0.0566 0.0108 -0.9983 +vn -0.9513 0.0636 0.3018 +vn -0.0793 0.0565 0.9952 +vn 0.9974 0.0455 0.0567 +vn -0.3260 -0.1936 -0.9253 +vn -0.8983 -0.0299 0.4384 +vn 0.1971 0.1831 0.9631 +vn 0.9650 0.1533 -0.2128 +vn -0.5119 -0.4673 -0.7208 +vn -0.6490 0.1774 0.7398 +vn 0.6071 0.3393 0.7185 +vn 0.8895 0.0982 -0.4462 +vn -0.7019 -0.4132 -0.5802 +vn -0.3823 0.3380 0.8600 +vn 0.7352 0.4069 0.5422 +vn 0.7126 -0.0745 -0.6976 +vn -0.9649 -0.1502 -0.2155 +vn -0.0294 0.2991 0.9538 +vn 0.9516 0.2415 0.1901 +vn 0.3727 -0.1757 -0.9112 +vn -0.9644 0.0261 0.2632 +vn 0.2210 0.4326 0.8741 +vn 0.9590 0.0662 -0.2755 +vn 0.0642 -0.3226 -0.9444 +vn -0.8401 0.3198 0.4382 +vn 0.6030 0.2472 0.7585 +vn 0.8288 -0.1312 -0.5440 +vn -0.2959 -0.2469 -0.9227 +vn -0.6295 0.4382 0.6416 +vn 0.8821 -0.0276 0.4703 +vn 0.6192 -0.1079 -0.7777 +vn -0.6332 0.0095 -0.7739 +vn -0.3703 0.0833 0.9252 +vn 0.9592 -0.2626 0.1046 +vn 0.4832 0.0226 -0.8752 +vn -0.8234 0.2989 -0.4823 +vn -0.0341 -0.1375 0.9899 +vn 0.9787 -0.1169 -0.1688 +vn 0.0925 0.1898 -0.9775 +vn -0.9492 0.2954 -0.1082 +vn 0.4569 -0.2816 0.8438 +vn 0.8325 -0.0878 -0.5471 +vn -0.4041 0.3153 -0.8587 +vn -0.9361 0.3094 0.1674 +vn 0.6317 -0.4280 0.6463 +vn 0.5564 0.1703 -0.8133 +vn -0.6548 0.3759 -0.6557 +vn -0.8530 0.1367 0.5037 +vn 0.8357 -0.3323 0.4372 +vn 0.3096 0.1895 -0.9318 +vn -0.9402 0.2645 -0.2146 +vn -0.5706 -0.0041 0.8212 +vn 0.9980 -0.0628 -0.0105 +vn 0.0498 0.1778 -0.9828 +vn -0.9752 0.1518 -0.1613 +vn -0.3623 -0.0234 0.9318 +vn -0.6918 0.0022 -0.7221 +vn -0.9811 0.1820 0.0662 +vn 0.9783 -0.1696 0.1194 +vn -0.8011 0.0081 -0.5985 +vn -0.8757 0.3559 0.3263 +vn 0.9448 -0.3113 -0.1022 +vn 0.3166 0.0927 0.9440 +vn -0.4358 -0.1264 -0.8911 +vn 0.6910 0.0803 0.7184 +vn 0.7496 -0.1582 -0.6427 +vn 0.9622 -0.2272 -0.1501 +vn -0.9423 0.2049 0.2646 +vn 0.7761 -0.0386 0.6295 +vn 0.0119 -0.1189 -0.9928 +vn -0.3960 0.1021 0.9126 +vn -0.2859 0.1042 -0.9526 +vn 0.7950 -0.1369 -0.5909 +vn -0.2716 0.1005 0.9572 +vn -0.4984 0.0762 0.8636 +vn 0.0603 -0.1515 -0.9866 +vn 0.0832 0.1210 0.9892 +vn 0.6245 -0.1111 0.7730 +vn -0.9820 0.0291 -0.1866 +vn 0.9981 -0.0147 -0.0597 +vn -0.2651 -0.0019 0.9642 +vn -0.1960 -0.0951 -0.9760 +vn 0.9386 0.1390 0.3156 +vn 0.9961 0.0598 -0.0642 +vn -0.9267 -0.2035 -0.3159 +vn 0.8705 0.1507 0.4685 +vn -0.3208 0.0100 -0.9471 +vn -0.7749 -0.1032 -0.6236 +vn 0.8481 0.0491 0.5275 +vn 0.9937 0.0241 -0.1096 +vn -0.7072 -0.0144 -0.7069 +vn 0.7350 -0.0553 0.6758 +vn -0.8962 -0.0056 -0.4436 +vn -0.3219 0.1259 -0.9384 +vn 0.4631 -0.1553 0.8726 +vn -0.9598 -0.0451 -0.2770 +vn -0.1817 0.1199 -0.9760 +vn 0.3513 -0.1237 0.9280 +vn -0.5639 -0.0653 -0.8233 +vn -0.3616 -0.0610 0.9304 +vn 0.6738 -0.0285 -0.7383 +vn -0.9615 0.0140 0.2745 +vn -0.5472 0.0526 0.8354 +vn 0.7930 -0.1284 -0.5956 +vn 0.8674 0.1348 0.4790 +vn -0.2318 0.1048 0.9671 +vn 0.1186 -0.1399 -0.9830 +vn 0.9828 0.0206 -0.1833 +vn -0.7893 0.1292 0.6003 +vn 0.3117 -0.1527 -0.9378 +vn 0.9998 -0.0185 -0.0112 +vn -0.3789 0.4640 -0.8007 +vn -0.9980 0.0379 -0.0515 +vn 0.1494 -0.3594 0.9211 +vn 0.8064 0.3928 -0.4420 +vn -0.5918 0.1422 -0.7935 +vn -0.8888 0.1090 0.4452 +vn 0.2929 -0.4219 0.8580 +vn 0.5383 0.4663 -0.7020 +vn -0.8979 -0.1939 -0.3952 +vn -0.5921 -0.0008 0.8059 +vn 0.5015 -0.0779 0.8616 +vn 0.4397 0.4191 -0.7944 +vn -0.9285 -0.2597 -0.2654 +vn -0.3486 -0.1011 0.9318 +vn 0.9514 0.1386 0.2749 +vn -0.0087 0.2393 -0.9709 +vn -0.9219 -0.3871 0.0165 +vn 0.1299 0.1103 0.9854 +vn 0.8972 0.3175 0.3069 +vn -0.4954 -0.4741 -0.7279 +vn -0.6393 0.1588 0.7524 +vn 0.5179 0.4511 0.7268 +vn 0.9495 0.3045 -0.0763 +vn -0.6192 -0.2079 -0.7572 +vn -0.7150 -0.3737 0.5909 +vn 0.6626 0.2925 0.6895 +vn 0.6483 -0.1056 -0.7541 +vn -0.8342 -0.2693 -0.4813 +vn 0.0662 0.1628 0.9844 +vn 0.7995 -0.1312 0.5861 +vn 0.7097 0.4105 -0.5725 +vn -0.9222 -0.1728 -0.3461 +vn 0.3557 0.1746 0.9182 +vn 0.9457 -0.0902 0.3123 +vn -0.1175 -0.1365 -0.9837 +vn -0.9212 0.1569 0.3559 +vn 0.6137 0.0183 0.7893 +vn 0.8967 -0.2098 -0.3897 +vn -0.3415 -0.1598 -0.9262 +vn -0.9489 0.1444 0.2807 +vn 0.4155 -0.3475 0.8406 +vn 0.9517 -0.2777 -0.1307 +vn -0.4735 0.1259 -0.8718 +vn -0.6896 -0.0296 0.7236 +vn 0.8360 0.2416 0.4926 +vn 0.5832 0.0342 -0.8116 +vn -0.5004 0.1377 -0.8547 +vn -0.1301 0.2218 0.9664 +vn 0.8607 -0.1607 0.4830 +vn 0.0019 -0.1390 -0.9903 +vn -0.7928 -0.1520 -0.5902 +vn 0.0388 -0.3238 0.9453 +vn 0.9858 -0.0549 0.1585 +vn -0.0966 0.0622 -0.9934 +vn -0.9416 0.1348 -0.3087 +vn 0.3030 -0.0336 0.9524 +vn 0.9512 -0.1700 -0.2577 +vn -0.2829 -0.1467 -0.9479 +vn -0.9841 0.0023 -0.1773 +vn 0.5744 -0.0502 0.8170 +vn 0.5935 0.2172 -0.7750 +vn -0.8617 -0.0492 -0.5050 +vn -0.9028 0.1679 0.3960 +vn 0.7301 -0.4375 0.5250 +vn 0.4494 0.2362 -0.8616 +vn -0.7172 0.0455 -0.6953 +vn -0.6123 -0.2099 0.7622 +vn 0.9982 -0.0436 -0.0401 +vn -0.1580 0.4112 -0.8978 +vn -0.9957 0.0503 0.0777 +vn -0.2484 -0.4082 0.8785 +vn 0.9768 -0.2137 -0.0109 +vn -0.2296 -0.1502 -0.9616 +vn -0.9894 0.0522 -0.1353 +vn -0.0581 0.1761 0.9827 +vn 0.8670 0.0121 -0.4982 +vn -0.6694 0.0458 -0.7415 +vn -0.8321 -0.0329 0.5537 +vn 0.2736 -0.1047 0.9561 +vn 0.5010 -0.3332 -0.7987 +vn -0.9177 0.0008 -0.3973 +vn -0.6311 0.3070 0.7124 +vn 0.6454 0.0700 0.7606 +vn 0.3957 -0.4325 -0.8102 +vn -0.9804 0.1742 -0.0923 +vn -0.3909 0.4049 0.8266 +vn 0.9097 -0.0292 0.4142 +vn -0.1687 -0.1401 -0.9757 +vn -0.9633 0.1821 0.1974 +vn 0.1870 0.0920 0.9780 +vn 0.9761 -0.1578 0.1494 +vn -0.5018 -0.1624 -0.8496 +vn -0.7009 0.2544 0.6664 +vn 0.1237 0.1083 0.9864 +vn 0.9420 -0.2526 -0.2211 +vn -0.6827 -0.1146 -0.7217 +vn -0.6888 -0.0579 0.7226 +vn 0.6769 -0.4359 0.5931 +vn 0.6720 -0.0717 -0.7371 +vn -0.6606 0.1454 -0.7365 +vn -0.6940 0.1624 0.7015 +vn 0.7953 -0.4385 0.4186 +vn 0.8047 0.0391 -0.5924 +vn -0.9406 0.1207 -0.3174 +vn -0.2645 0.1080 0.9583 +vn 0.8903 -0.2655 0.3700 +vn 0.7177 -0.0103 -0.6962 +vn -0.8883 0.2497 0.3855 +vn -0.0100 0.0548 0.9984 +vn 0.9016 0.1598 -0.4020 +vn 0.3288 -0.1156 -0.9373 +vn -0.9903 0.1333 0.0388 +vn 0.3103 -0.2500 0.9172 +vn 0.9559 0.1304 -0.2630 +vn 0.2589 0.0917 -0.9615 +vn -0.5017 -0.1376 0.8540 +vn 0.9678 0.1507 0.2017 +vn 0.2796 0.4796 -0.8318 +vn -0.5961 0.1137 -0.7948 +vn -0.1276 0.0546 0.9903 +vn 0.9026 0.1278 -0.4110 +vn 0.5181 0.0978 -0.8497 +vn -0.9771 -0.1652 -0.1344 +vn 0.0960 -0.0901 0.9913 +vn 0.7527 0.2608 -0.6045 +vn -0.1856 -0.0954 -0.9780 +vn -0.9226 -0.1192 0.3670 +vn 0.3789 0.1887 0.9060 +vn 0.6804 -0.2494 -0.6891 +vn -0.2431 -0.3934 -0.8866 +vn -0.7542 -0.2247 0.6170 +vn 0.8444 0.0532 0.5330 +vn 0.6459 -0.0313 -0.7628 +vn -0.6153 -0.3489 -0.7069 +vn -0.6933 0.0278 0.7201 +vn 0.6334 0.1053 0.7666 +vn 0.4695 -0.2279 -0.8530 +vn -0.7466 -0.0201 -0.6650 +vn -0.8278 0.1210 0.5478 +vn 0.9825 -0.1704 -0.0749 +vn 0.0643 -0.1811 -0.9814 +vn -0.9821 0.1626 0.0955 +vn -0.3967 0.2452 0.8846 +vn 0.9975 -0.0596 -0.0380 +vn -0.4784 0.2391 -0.8449 +vn -0.9965 -0.0204 0.0809 +vn 0.2115 -0.2225 0.9517 +vn 0.6932 0.2051 -0.6909 +vn -0.7180 0.1510 -0.6795 +vn -0.8617 -0.1237 0.4921 +vn 0.4955 -0.2294 0.8377 +vn 0.6206 0.2760 -0.7340 +vn -0.8276 -0.0684 -0.5571 +vn -0.6955 0.0973 0.7119 +vn 0.6673 0.0651 0.7420 +vn 0.3295 0.0495 -0.9429 +vn -0.9263 -0.1907 -0.3249 +vn -0.1879 0.0710 0.9796 +vn 0.7880 0.1390 0.5998 +vn 0.0688 0.0703 -0.9951 +vn -0.9724 -0.2236 0.0662 +vn -0.1183 -0.1394 0.9831 +vn 0.9449 0.1951 0.2629 +vn 0.0049 -0.0149 -0.9999 +vn -0.9402 -0.1822 0.2877 +vn -0.0363 -0.1840 0.9823 +vn 0.9905 0.1368 0.0146 +vn -0.5776 -0.1163 -0.8080 +vn -0.7347 -0.1671 0.6575 +vn 0.4471 0.3554 0.8208 +vn 0.9064 0.2125 -0.3651 +vn -0.8594 -0.1294 -0.4946 +vn -0.3377 -0.0125 0.9412 +vn 0.8260 0.0824 0.5576 +vn 0.6580 0.0524 -0.7512 +vn -0.9725 -0.0241 -0.2315 +vn 0.0703 0.0448 0.9965 +vn 0.9692 0.0703 0.2362 +vn 0.3203 -0.0535 -0.9458 +vn -0.9327 0.1181 0.3407 +vn 0.3361 0.2199 0.9158 +vn 0.9269 0.0435 -0.3727 +vn -0.0079 -0.1996 -0.9798 +vn -0.7689 0.1802 0.6134 +vn 0.6910 0.0075 0.7228 +vn 0.7885 -0.1922 -0.5843 +vn -0.3580 -0.0240 -0.9334 +vn -0.6867 0.1134 0.7181 +vn 0.8592 0.0306 0.5107 +vn 0.6307 -0.3780 -0.6778 +vn -0.5927 -0.0564 -0.8035 +vn -0.5893 -0.0352 0.8071 +vn 0.9707 -0.1580 0.1811 +vn 0.5813 0.0307 -0.8131 +vn -0.7826 0.0970 -0.6149 +vn -0.0574 -0.0763 0.9954 +vn 0.9543 0.2988 0.0031 +vn -0.0147 0.0710 -0.9974 +vn -0.9286 -0.1974 -0.3142 +vn 0.3070 0.1095 0.9454 +vn 0.8789 0.0623 -0.4729 +vn -0.4560 0.0261 -0.8896 +vn -0.9914 -0.0451 0.1226 +vn 0.5829 0.0373 0.8117 +vn 0.6366 0.1784 -0.7503 +vn -0.6967 0.1485 -0.7019 +vn -0.8739 -0.1791 0.4519 +vn 0.9582 -0.0999 0.2680 +vn 0.1302 0.1588 -0.9787 +vn -0.9721 -0.0858 -0.2184 +vn -0.4784 -0.2276 0.8481 +vn 0.9908 0.0846 -0.1060 +vn -0.1904 0.2000 -0.9611 +vn -0.9894 -0.1361 0.0496 +vn -0.1333 -0.2269 0.9648 +vn -0.9872 0.0950 -0.1284 +vn 0.0756 0.4506 0.8895 +vn 0.2286 -0.4749 -0.8498 +vn -0.9560 0.1826 0.2298 +vn 0.4719 0.2637 0.8413 +vn -0.1977 -0.3219 -0.9259 +vn -0.5204 0.4033 0.7527 +vn 0.9007 -0.1639 0.4024 +vn -0.7010 0.0027 -0.7131 +vn 0.0858 0.1172 0.9894 +vn 0.9401 -0.3387 0.0391 +vn -0.9011 0.2906 -0.3219 +vn 0.2131 0.0637 0.9749 +vn 0.8369 -0.4315 -0.3366 +vn -0.9088 0.4159 0.0337 +vn 0.1413 0.1234 0.9822 +vn 0.7861 -0.3777 -0.4893 +vn -0.8995 0.3584 0.2499 +vn 0.3612 0.1316 0.9232 +vn 0.7387 -0.2635 -0.6204 +vn -0.8685 0.2420 0.4327 +vn 0.6588 0.1369 0.7397 +vn 0.5181 -0.1528 -0.8416 +vn -0.8020 0.1313 0.5827 +vn 0.8842 -0.0859 0.4592 +vn 0.0651 -0.0329 -0.9973 +vn -0.4420 0.0706 0.8942 +vn 0.9760 -0.1431 -0.1641 +vn -0.3073 -0.0073 -0.9516 +vn -0.0359 0.0750 0.9965 +vn 0.7697 -0.1763 -0.6136 +vn -0.6917 -0.0191 -0.7220 +vn 0.2063 0.1197 0.9711 +vn 0.6852 -0.2403 -0.6876 +vn -0.9271 0.0665 -0.3689 +vn 0.4704 0.1021 0.8765 +vn 0.4929 -0.2035 -0.8459 +vn -0.9852 0.1167 -0.1253 +vn 0.8441 -0.0331 0.5352 +vn -0.1858 0.0130 -0.9825 +vn -0.9803 0.1480 0.1307 +vn 0.9683 -0.1377 0.2083 +vn -0.6450 -0.1282 -0.7533 +vn -0.7206 0.1482 0.6773 +vn 0.9366 -0.0636 -0.3446 +vn -0.7967 -0.0779 -0.5993 +vn -0.5204 0.3133 0.7944 +vn 0.7192 -0.2854 -0.6335 +vn -0.9625 0.0815 -0.2587 +vn -0.3440 0.3341 0.8775 +vn 0.5497 -0.3446 -0.7610 +vn -0.9837 0.0466 -0.1739 +vn -0.1381 0.4231 0.8955 +vn 0.4213 -0.4256 -0.8008 +vn 0.9973 0.0720 0.0161 +vn -0.3806 0.4631 -0.8004 +vn -0.9964 -0.0358 -0.0772 +vn 0.1963 -0.3997 0.8954 +vn 0.7986 0.4245 -0.4267 +vn -0.5133 0.1284 -0.8485 +vn -0.8922 -0.0135 0.4514 +vn 0.2674 -0.3881 0.8820 +vn 0.5100 0.5090 -0.6934 +vn -0.9308 -0.1853 -0.3151 +vn -0.5726 -0.1330 0.8090 +vn 0.4931 -0.0965 0.8646 +vn 0.4551 0.3848 -0.8030 +vn -0.9353 -0.2035 -0.2895 +vn -0.3254 -0.2219 0.9192 +vn 0.9646 0.0853 0.2495 +vn 0.0032 0.2738 -0.9618 +vn -0.9084 -0.4179 -0.0120 +vn 0.1091 0.0317 0.9935 +vn 0.9009 0.2863 0.3263 +vn -0.4777 -0.4160 -0.7738 +vn -0.6354 0.1267 0.7617 +vn 0.4915 0.4038 0.7716 +vn 0.9254 0.3761 -0.0459 +vn -0.6410 -0.2720 -0.7177 +vn -0.7117 -0.3588 0.6040 +vn 0.6945 0.3209 0.6440 +vn 0.6051 -0.1605 -0.7798 +vn -0.7995 -0.3457 -0.4911 +vn -0.0140 0.1155 0.9932 +vn 0.8132 -0.1075 0.5720 +vn 0.7123 0.4430 -0.5444 +vn -0.8927 -0.2842 -0.3497 +vn 0.3507 0.2163 0.9112 +vn 0.9395 -0.0397 0.3403 +vn -0.0939 -0.1381 -0.9860 +vn -0.9095 0.1231 0.3970 +vn 0.5937 0.0534 0.8029 +vn 0.9019 -0.1734 -0.3956 +vn -0.3802 -0.1966 -0.9038 +vn -0.9377 0.2481 0.2434 +vn 0.3832 -0.3162 0.8678 +vn 0.9512 -0.2807 -0.1279 +vn -0.3581 0.2198 -0.9074 +vn -0.6618 0.0878 0.7445 +vn 0.8523 0.2992 0.4291 +vn 0.5584 -0.0090 -0.8295 +vn -0.4970 0.1250 -0.8587 +vn -0.1956 0.2357 0.9519 +vn 0.8758 -0.2023 0.4383 +vn 0.0328 -0.1911 -0.9810 +vn -0.8339 -0.2780 -0.4767 +vn 0.0524 -0.3201 0.9459 +vn 0.9860 -0.0845 0.1438 +vn -0.0695 0.1427 -0.9873 +vn -0.9782 0.0274 -0.2059 +vn 0.2814 -0.1599 0.9462 +vn 0.9621 -0.0767 -0.2616 +vn -0.2978 -0.0742 -0.9517 +vn -0.9870 0.0306 -0.1579 +vn 0.5950 -0.1142 0.7956 +vn 0.6347 0.2101 -0.7436 +vn -0.8777 -0.0351 -0.4780 +vn -0.9056 0.0468 0.4215 +vn 0.7237 -0.3876 0.5710 +vn 0.4788 0.1915 -0.8568 +vn -0.6778 0.1574 -0.7182 +vn -0.6872 -0.1476 0.7113 +vn 0.9945 0.0652 -0.0817 +vn -0.2005 0.4536 -0.8683 +vn -0.9944 -0.0170 0.1044 +vn -0.2498 -0.3695 0.8950 +vn 0.9887 -0.1484 0.0224 +vn -0.2215 -0.0972 -0.9703 +vn -0.9883 -0.0151 -0.1519 +vn -0.0890 0.1066 0.9903 +vn 0.8435 0.1506 -0.5155 +vn -0.6998 0.0523 -0.7124 +vn -0.8187 -0.1774 0.5462 +vn 0.2902 -0.1619 0.9432 +vn 0.5203 -0.2851 -0.8050 +vn -0.9047 -0.0216 -0.4255 +vn -0.6619 0.2072 0.7204 +vn 0.6489 0.0552 0.7589 +vn 0.3788 -0.3569 -0.8539 +vn -0.9878 0.1335 -0.0798 +vn -0.3639 0.3405 0.8670 +vn 0.9055 -0.0044 0.4243 +vn -0.1620 -0.1087 -0.9808 +vn -0.9628 0.1561 0.2207 +vn 0.1950 0.0882 0.9768 +vn 0.9797 -0.1543 0.1277 +vn -0.5007 -0.2345 -0.8332 +vn -0.7158 0.2442 0.6542 +vn 0.1426 0.1470 0.9788 +vn 0.9468 -0.2208 -0.2342 +vn -0.6789 -0.2468 -0.6915 +vn -0.6624 -0.0164 0.7490 +vn 0.7296 -0.3349 0.5962 +vn 0.6655 -0.1488 -0.7314 +vn -0.6982 0.1392 -0.7022 +vn -0.7087 0.1122 0.6966 +vn 0.8213 -0.3632 0.4401 +vn 0.7780 0.0515 -0.6261 +vn -0.9325 0.1052 -0.3454 +vn -0.3501 0.0802 0.9333 +vn 0.8734 -0.2867 0.3936 +vn 0.7409 0.0555 -0.6693 +vn -0.8970 0.2162 0.3855 +vn -0.1386 -0.0089 0.9903 +vn 0.9174 0.0798 -0.3898 +vn 0.4126 -0.0542 -0.9093 +vn -0.9738 0.2246 0.0357 +vn 0.2912 -0.2431 0.9253 +vn 0.9741 0.0373 -0.2230 +vn 0.2686 0.0870 -0.9593 +vn -0.4967 -0.0086 0.8679 +vn 0.9744 0.1555 0.1623 +vn 0.2443 0.3389 -0.9086 +vn -0.5986 0.0905 -0.7959 +vn -0.1402 0.0707 0.9876 +vn 0.9010 0.1636 -0.4019 +vn 0.4830 0.0442 -0.8745 +vn -0.9745 -0.2161 -0.0602 +vn 0.0655 -0.1628 0.9845 +vn 0.7482 0.3209 -0.5807 +vn -0.1665 -0.0252 -0.9857 +vn -0.9110 -0.1785 0.3718 +vn 0.4177 0.1482 0.8964 +vn 0.6677 -0.2089 -0.7145 +vn -0.3090 -0.3355 -0.8899 +vn -0.7514 -0.2838 0.5957 +vn 0.8288 -0.0156 0.5594 +vn 0.6620 -0.0373 -0.7486 +vn -0.5987 -0.2491 -0.7613 +vn -0.6977 0.0040 0.7164 +vn 0.6325 -0.0436 0.7733 +vn 0.4611 -0.1694 -0.8711 +vn -0.7424 0.1045 -0.6617 +vn -0.8162 0.1853 0.5472 +vn 0.9833 -0.1635 -0.0797 +vn 0.0907 -0.1221 -0.9884 +vn -0.9863 0.1237 0.1092 +vn -0.4040 0.1808 0.8967 +vn 0.9972 -0.0741 -0.0113 +vn -0.4990 0.2111 -0.8405 +vn -0.9988 0.0125 0.0470 +vn 0.2450 -0.1859 0.9515 +vn 0.6688 0.1155 -0.7344 +vn -0.7354 0.1399 -0.6630 +vn -0.8648 -0.0673 0.4976 +vn 0.5113 -0.1892 0.8383 +vn 0.6443 0.2840 -0.7101 +vn -0.8185 -0.0680 -0.5705 +vn -0.6934 0.1456 0.7057 +vn 0.6546 0.0634 0.7533 +vn 0.3769 0.0230 -0.9260 +vn -0.9228 -0.1677 -0.3469 +vn -0.1647 0.1056 0.9807 +vn 0.7738 0.1310 0.6197 +vn 0.0376 0.0700 -0.9968 +vn -0.9744 -0.2239 0.0221 +vn -0.1098 -0.1322 0.9851 +vn 0.9321 0.1993 0.3024 +vn 0.0418 0.0557 -0.9976 +vn -0.9494 -0.1502 0.2759 +vn -0.0401 -0.2151 0.9758 +vn 0.9945 0.0970 0.0383 +vn -0.5979 0.0144 -0.8014 +vn -0.7147 -0.1913 0.6728 +vn 0.4360 0.3126 0.8439 +vn 0.9044 0.2086 -0.3722 +vn -0.8954 -0.0425 -0.4433 +vn -0.2850 -0.1228 0.9506 +vn 0.8423 -0.0131 0.5389 +vn 0.6112 0.1243 -0.7817 +vn -0.9693 0.0142 -0.2456 +vn 0.1132 -0.0371 0.9929 +vn 0.9646 0.0416 0.2604 +vn 0.2822 0.0218 -0.9591 +vn -0.9264 0.0679 0.3704 +vn 0.3874 0.1049 0.9159 +vn 0.9228 0.1073 -0.3700 +vn -0.0472 -0.0843 -0.9953 +vn -0.7651 0.0193 0.6436 +vn 0.7208 -0.0459 0.6917 +vn 0.7844 -0.0974 -0.6125 +vn -0.4075 0.0812 -0.9096 +vn -0.6906 -0.0678 0.7200 +vn 0.8381 0.0667 0.5414 +vn 0.6557 -0.3133 -0.6869 +vn -0.5900 -0.0307 -0.8068 +vn -0.5975 -0.1128 0.7939 +vn 0.9712 -0.0926 0.2196 +vn 0.5825 0.0907 -0.8078 +vn -0.7499 0.0742 -0.6574 +vn -0.0218 -0.0688 0.9974 +vn 0.9342 0.3553 0.0312 +vn -0.0584 0.0547 -0.9968 +vn -0.9022 -0.2697 -0.3367 +vn 0.2690 0.1633 0.9492 +vn 0.8934 0.1369 -0.4278 +vn -0.4653 -0.0518 -0.8836 +vn -0.9857 -0.1492 0.0784 +vn 0.5540 0.1625 0.8165 +vn 0.6739 0.1521 -0.7230 +vn -0.6680 0.0545 -0.7421 +vn -0.8897 -0.2071 0.4069 +vn 0.9640 -0.0024 0.2659 +vn 0.1268 0.0948 -0.9874 +vn -0.9668 -0.1548 -0.2033 +vn -0.4845 -0.2101 0.8492 +vn 0.9875 0.1114 -0.1112 +vn -0.2289 0.1624 -0.9598 +vn -0.9891 -0.1421 0.0383 +vn -0.1005 -0.1943 0.9758 +vn -0.9875 0.0684 -0.1422 +vn 0.1107 0.4472 0.8875 +vn 0.1901 -0.4710 -0.8614 +vn -0.9718 0.0807 0.2214 +vn 0.5042 0.2227 0.8344 +vn -0.2539 -0.2533 -0.9335 +vn -0.5297 0.3648 0.7657 +vn 0.8912 -0.1424 0.4306 +vn -0.7001 0.0142 -0.7139 +vn 0.1034 0.0412 0.9938 +vn 0.9557 -0.2813 0.0864 +vn -0.8993 0.2524 -0.3572 +vn 0.2164 0.0512 0.9750 +vn 0.8570 -0.4129 -0.3082 +vn -0.9164 0.4003 -0.0020 +vn 0.1172 0.1222 0.9856 +vn 0.8249 -0.3187 -0.4669 +vn -0.9357 0.2847 0.2085 +vn 0.3530 0.1193 0.9280 +vn 0.7675 -0.1973 -0.6100 +vn -0.9011 0.1659 0.4006 +vn 0.6448 0.1690 0.7454 +vn 0.5316 -0.0958 -0.8416 +vn -0.8159 0.0545 0.5756 +vn 0.8854 -0.0273 0.4640 +vn 0.0174 -0.0869 -0.9961 +vn -0.3997 0.1155 0.9093 +vn 0.9741 -0.1432 -0.1753 +vn -0.3440 -0.0643 -0.9368 +vn 0.0019 0.1252 0.9921 +vn 0.7753 -0.1070 -0.6224 +vn -0.6914 -0.0358 -0.7216 +vn 0.1917 0.1117 0.9751 +vn 0.6899 -0.1984 -0.6962 +vn -0.9258 0.0636 -0.3727 +vn 0.4756 0.0875 0.8753 +vn 0.5151 -0.1694 -0.8402 +vn -0.9828 0.1328 -0.1285 +vn 0.8374 -0.0641 0.5428 +vn -0.1580 0.0820 -0.9840 +vn -0.9786 0.1498 0.1408 +vn 0.9650 -0.1684 0.2009 +vn -0.6549 -0.0616 -0.7532 +vn -0.7335 0.1662 0.6591 +vn 0.9464 -0.1056 -0.3052 +vn -0.8034 -0.0165 -0.5952 +vn -0.5121 0.2969 0.8059 +vn 0.7202 -0.2746 -0.6371 +vn -0.9664 0.0968 -0.2382 +vn -0.3040 0.2431 0.9211 +vn 0.5338 -0.2635 -0.8035 +vn -0.9870 0.0411 -0.1553 +vn -0.0864 0.3497 0.9329 +vn 0.3913 -0.3622 -0.8460 +vn 0.9871 0.1553 0.0398 +vn -0.3848 0.4398 -0.8115 +vn -0.9893 -0.1084 -0.0974 +vn 0.2344 -0.4146 0.8793 +vn 0.8025 0.4244 -0.4193 +vn -0.4303 0.1228 -0.8943 +vn -0.8817 -0.1412 0.4502 +vn 0.2475 -0.3209 0.9142 +vn 0.5056 0.5141 -0.6929 +vn -0.9566 -0.1718 -0.2354 +vn -0.5445 -0.2543 0.7992 +vn 0.4904 -0.1049 0.8652 +vn 0.4756 0.3254 -0.8173 +vn -0.9346 -0.1445 -0.3249 +vn -0.3035 -0.3221 0.8967 +vn 0.9673 0.0308 0.2519 +vn 0.0028 0.2919 -0.9565 +vn -0.9070 -0.4196 -0.0349 +vn 0.0828 -0.0614 0.9947 +vn 0.9068 0.2374 0.3484 +vn -0.4623 -0.3769 -0.8026 +vn -0.6397 0.1826 0.7467 +vn 0.4828 0.4141 0.7716 +vn 0.9044 0.4262 -0.0218 +vn -0.6401 -0.3690 -0.6739 +vn -0.7142 -0.3168 0.6241 +vn 0.7139 0.3470 0.6082 +vn 0.5759 -0.2412 -0.7811 +vn -0.7717 -0.4006 -0.4940 +vn -0.1481 -0.0270 0.9886 +vn 0.8269 -0.0690 0.5581 +vn 0.7146 0.4638 -0.5237 +vn -0.8598 -0.3746 -0.3470 +vn 0.3253 0.2526 0.9113 +vn 0.9303 0.0147 0.3664 +vn -0.0411 -0.1338 -0.9902 +vn -0.8966 0.0819 0.4352 +vn 0.5359 0.0408 0.8433 +vn 0.9057 -0.1176 -0.4072 +vn -0.3954 -0.2370 -0.8874 +vn -0.9275 0.2965 0.2277 +vn 0.3762 -0.2494 0.8923 +vn 0.9361 -0.3360 -0.1039 +vn -0.2505 0.2863 -0.9248 +vn -0.6350 0.1923 0.7482 +vn 0.8721 0.3317 0.3597 +vn 0.5255 -0.0514 -0.8492 +vn -0.4855 0.1102 -0.8673 +vn -0.2787 0.2017 0.9389 +vn 0.9220 -0.1573 0.3537 +vn 0.0858 -0.2055 -0.9749 +vn -0.8550 -0.3540 -0.3790 +vn 0.0671 -0.2905 0.9545 +vn 0.9880 -0.1108 0.1074 +vn -0.0423 0.2245 -0.9735 +vn -0.9901 -0.0652 -0.1244 +vn 0.2596 -0.2717 0.9267 +vn 0.9593 0.0206 -0.2816 +vn -0.3119 0.0012 -0.9501 +vn -0.9915 0.0589 -0.1164 +vn 0.6202 -0.2125 0.7551 +vn 0.6720 0.1856 -0.7169 +vn -0.8820 -0.0278 -0.4704 +vn -0.8886 -0.0832 0.4511 +vn 0.7258 -0.3199 0.6090 +vn 0.4995 0.1360 -0.8556 +vn -0.6340 0.2514 -0.7313 +vn -0.7628 -0.0377 0.6456 +vn 0.9866 0.1194 -0.1112 +vn -0.2365 0.4630 -0.8542 +vn -0.9850 -0.1047 0.1370 +vn -0.2471 -0.3025 0.9205 +vn 0.9960 -0.0723 0.0529 +vn -0.2159 -0.0283 -0.9760 +vn -0.9827 -0.0837 -0.1652 +vn -0.1179 0.0164 0.9929 +vn 0.8079 0.2767 -0.5204 +vn -0.7277 0.0445 -0.6845 +vn -0.7908 -0.3034 0.5315 +vn 0.3063 -0.2045 0.9297 +vn 0.5448 -0.2106 -0.8117 +vn -0.8874 -0.0424 -0.4591 +vn -0.6877 0.0790 0.7217 +vn 0.6530 0.0370 0.7565 +vn 0.3595 -0.2498 -0.8991 +vn -0.9949 0.0739 -0.0691 +vn -0.3294 0.2429 0.9124 +vn 0.8990 0.0248 0.4373 +vn -0.1472 -0.0614 -0.9872 +vn -0.9635 0.1102 0.2439 +vn 0.1933 0.0697 0.9787 +vn 0.9857 -0.1317 0.1054 +vn -0.4818 -0.2844 -0.8288 +vn -0.7460 0.2004 0.6351 +vn 0.1488 0.1710 0.9740 +vn 0.9553 -0.1621 -0.2471 +vn -0.6726 -0.3443 -0.6550 +vn -0.6243 0.0323 0.7805 +vn 0.7792 -0.1918 0.5966 +vn 0.6684 -0.2084 -0.7140 +vn -0.7477 0.1147 -0.6541 +vn -0.7094 0.0473 0.7032 +vn 0.8518 -0.2546 0.4578 +vn 0.7393 0.0524 -0.6713 +vn -0.9235 0.0887 -0.3732 +vn -0.4252 0.0395 0.9042 +vn 0.8647 -0.2774 0.4187 +vn 0.7482 0.1271 -0.6512 +vn -0.9073 0.1534 0.3914 +vn -0.2449 -0.0621 0.9676 +vn 0.9252 0.0160 -0.3791 +vn 0.4782 0.0128 -0.8782 +vn -0.9551 0.2933 0.0426 +vn 0.2987 -0.2140 0.9300 +vn 0.9785 -0.0521 -0.1998 +vn 0.2494 0.0835 -0.9648 +vn -0.4816 0.1184 0.8684 +vn 0.9801 0.1366 0.1440 +vn 0.2040 0.1499 -0.9674 +vn -0.6078 0.0608 -0.7917 +vn -0.1766 0.0710 0.9817 +vn 0.9085 0.1937 -0.3703 +vn 0.4559 -0.0043 -0.8900 +vn -0.9710 -0.2390 -0.0107 +vn 0.0362 -0.2326 0.9719 +vn 0.7571 0.3539 -0.5492 +vn -0.1384 0.0554 -0.9888 +vn -0.9064 -0.2275 0.3559 +vn 0.4493 0.1037 0.8874 +vn 0.6663 -0.1429 -0.7319 +vn -0.3777 -0.2401 -0.8943 +vn -0.7639 -0.3155 0.5630 +vn 0.7981 -0.0849 0.5965 +vn 0.6808 -0.0397 -0.7314 +vn -0.5699 -0.1194 -0.8130 +vn -0.7143 -0.0284 0.6992 +vn 0.6239 -0.1885 0.7584 +vn 0.4451 -0.0859 -0.8914 +vn -0.7356 0.2239 -0.6394 +vn -0.7997 0.2280 0.5555 +vn 0.9862 -0.1387 -0.0906 +vn 0.1157 -0.0447 -0.9923 +vn -0.9899 0.0671 0.1247 +vn -0.4064 0.0977 0.9085 +vn 0.9965 -0.0810 0.0188 +vn -0.5154 0.1584 -0.8422 +vn -0.9993 0.0371 0.0083 +vn 0.2710 -0.1237 0.9546 +vn 0.6501 -0.0223 -0.7595 +vn -0.7512 0.1215 -0.6488 +vn -0.8660 -0.0041 0.5000 +vn 0.5236 -0.1221 0.8432 +vn 0.6732 0.2722 -0.6875 +vn -0.8108 -0.0643 -0.5818 +vn -0.6871 0.1945 0.7001 +vn 0.6396 0.0628 0.7661 +vn 0.4222 -0.0069 -0.9065 +vn -0.9233 -0.1238 -0.3635 +vn -0.1392 0.1278 0.9820 +vn 0.7634 0.1059 0.6371 +vn -0.0025 0.0671 -0.9977 +vn -0.9781 -0.2071 -0.0182 +vn -0.0917 -0.1195 0.9886 +vn 0.9224 0.1890 0.3369 +vn 0.0704 0.1301 -0.9890 +vn -0.9582 -0.0944 0.2701 +vn -0.0327 -0.2374 0.9709 +vn 0.9979 0.0319 0.0562 +vn -0.6083 0.1580 -0.7778 +vn -0.6898 -0.2069 0.6938 +vn 0.4313 0.2430 0.8689 +vn 0.9030 0.1827 -0.3889 +vn -0.9222 0.0358 -0.3851 +vn -0.2252 -0.2366 0.9452 +vn 0.8517 -0.1064 0.5131 +vn 0.5554 0.2058 -0.8057 +vn -0.9630 0.0547 -0.2640 +vn 0.1570 -0.1192 0.9804 +vn 0.9573 0.0086 0.2889 +vn 0.2368 0.1032 -0.9661 +vn -0.9176 -0.0074 0.3974 +vn 0.4379 -0.0184 0.8988 +vn 0.9176 0.1700 -0.3592 +vn -0.0931 0.0492 -0.9944 +vn -0.7422 -0.1561 0.6518 +vn 0.7483 -0.0852 0.6578 +vn 0.7719 0.0212 -0.6354 +vn -0.4556 0.1752 -0.8728 +vn -0.6702 -0.2426 0.7014 +vn 0.8145 0.0880 0.5735 +vn 0.6849 -0.2209 -0.6943 +vn -0.5902 -0.0002 -0.8072 +vn -0.5977 -0.1918 0.7784 +vn 0.9645 -0.0264 0.2626 +vn 0.5777 0.1527 -0.8018 +vn -0.7161 0.0638 -0.6951 +vn 0.0210 -0.0528 0.9984 +vn 0.9211 0.3857 0.0526 +vn -0.1032 0.0296 -0.9942 +vn -0.8797 -0.3186 -0.3531 +vn 0.2336 0.2051 0.9504 +vn 0.9004 0.2139 -0.3788 +vn -0.4737 -0.1306 -0.8709 +vn -0.9681 -0.2483 0.0327 +vn 0.5222 0.2984 0.7989 +vn 0.7088 0.1113 -0.6966 +vn -0.6240 -0.0449 -0.7801 +vn -0.9038 -0.2241 0.3646 +vn 0.9576 0.1052 0.2683 +vn 0.1268 -0.0109 -0.9919 +vn -0.9550 -0.2160 -0.2033 +vn -0.4958 -0.1706 0.8515 +vn 0.9846 0.1365 -0.1090 +vn -0.2600 0.1024 -0.9602 +vn -0.9891 -0.1462 0.0195 +vn -0.0748 -0.1363 0.9878 +vn -0.9882 0.0272 -0.1506 +vn 0.1573 0.4125 0.8973 +vn 0.1457 -0.4321 -0.8900 +vn -0.9767 -0.0335 0.2120 +vn 0.5376 0.1792 0.8240 +vn -0.3131 -0.1795 -0.9326 +vn -0.5387 0.2851 0.7928 +vn 0.8807 -0.1111 0.4604 +vn -0.6988 0.0271 -0.7148 +vn 0.1150 -0.0472 0.9922 +vn 0.9686 -0.2067 0.1381 +vn -0.8963 0.2036 -0.3940 +vn 0.2091 0.0242 0.9776 +vn 0.8879 -0.3680 -0.2761 +vn -0.9310 0.3625 -0.0427 +vn 0.0854 0.0977 0.9916 +vn 0.8678 -0.2262 -0.4425 +vn -0.9693 0.1835 0.1634 +vn 0.3461 0.0849 0.9344 +vn 0.7950 -0.0993 -0.5984 +vn -0.9288 0.0629 0.3652 +vn 0.6322 0.1809 0.7534 +vn 0.5552 -0.0139 -0.8316 +vn -0.8288 -0.0400 0.5581 +vn 0.8859 0.0387 0.4623 +vn -0.0148 -0.1313 -0.9912 +vn -0.3655 0.1445 0.9195 +vn 0.9737 -0.1215 -0.1929 +vn -0.3660 -0.1151 -0.9235 +vn 0.0211 0.1613 0.9867 +vn 0.7785 -0.0104 -0.6276 +vn -0.6812 -0.0507 -0.7304 +vn 0.1586 0.0849 0.9837 +vn 0.6968 -0.1260 -0.7061 +vn -0.9288 0.0551 -0.3664 +vn 0.4813 0.0630 0.8743 +vn 0.5369 -0.1091 -0.8365 +vn -0.9843 0.1365 -0.1122 +vn 0.8376 -0.0942 0.5382 +vn -0.1216 0.1544 -0.9805 +vn -0.9767 0.1281 0.1721 +vn 0.9679 -0.1803 0.1753 +vn -0.6613 0.0141 -0.7500 +vn -0.7474 0.1578 0.6454 +vn 0.9541 -0.1300 -0.2697 +vn -0.8094 0.0431 -0.5857 +vn -0.5032 0.2429 0.8293 +vn 0.7252 -0.2290 -0.6493 +vn -0.9725 0.0928 -0.2138 +vn -0.2551 0.1192 0.9595 +vn 0.5106 -0.1473 -0.8471 +vn -0.9915 0.0206 -0.1281 +vn -0.0306 0.2463 0.9687 +vn 0.3578 -0.2631 -0.8960 +# 2269 vertex normals + +vt 0.7500 0.0005 0.8816 +vt 0.8052 0.0005 0.8808 +vt 0.8052 0.1027 0.8808 +vt 0.7500 0.1027 0.8816 +vt 0.8605 0.0005 0.8788 +vt 0.8605 0.1027 0.8788 +vt 0.9161 0.0005 0.8766 +vt 0.9161 0.1027 0.8766 +vt 0.9720 0.0005 0.8751 +vt 0.9720 0.1027 0.8751 +vt 1.0280 0.0005 0.8751 +vt 1.0280 0.1027 0.8751 +vt 0.0280 0.0005 0.8751 +vt 0.0839 0.0005 0.8766 +vt 0.0839 0.1027 0.8766 +vt 0.0280 0.1027 0.8751 +vt 0.1395 0.0005 0.8788 +vt 0.1395 0.1027 0.8788 +vt 0.1948 0.0005 0.8808 +vt 0.1948 0.1027 0.8808 +vt 0.2500 0.0005 0.8816 +vt 0.2500 0.1027 0.8816 +vt 0.3052 0.0005 0.8808 +vt 0.3052 0.1027 0.8808 +vt 0.3605 0.0005 0.8788 +vt 0.3605 0.1027 0.8788 +vt 0.4161 0.0005 0.8766 +vt 0.4161 0.1027 0.8766 +vt 0.4720 0.0005 0.8751 +vt 0.4720 0.1027 0.8751 +vt 0.5280 0.0005 0.8751 +vt 0.5280 0.1027 0.8751 +vt 0.5839 0.0005 0.8766 +vt 0.5839 0.1027 0.8766 +vt 0.6395 0.0005 0.8788 +vt 0.6395 0.1027 0.8788 +vt 0.6948 0.0005 0.8808 +vt 0.6948 0.1027 0.8808 +vt 0.8052 0.2050 0.8808 +vt 0.7500 0.2050 0.8816 +vt 0.8605 0.2050 0.8788 +vt 0.9161 0.2050 0.8766 +vt 0.9720 0.2050 0.8751 +vt 1.0280 0.2050 0.8751 +vt 0.0839 0.2050 0.8766 +vt 0.0280 0.2050 0.8751 +vt 0.1395 0.2050 0.8788 +vt 0.1948 0.2050 0.8808 +vt 0.2500 0.2050 0.8816 +vt 0.3052 0.2050 0.8808 +vt 0.3605 0.2050 0.8788 +vt 0.4161 0.2050 0.8766 +vt 0.4720 0.2050 0.8751 +vt 0.5280 0.2050 0.8751 +vt 0.5839 0.2050 0.8766 +vt 0.6395 0.2050 0.8788 +vt 0.6948 0.2050 0.8808 +vt 0.8052 0.3072 0.8808 +vt 0.7500 0.3072 0.8816 +vt 0.8605 0.3072 0.8788 +vt 0.9161 0.3072 0.8766 +vt 0.9720 0.3072 0.8751 +vt 1.0280 0.3072 0.8751 +vt 0.0839 0.3072 0.8766 +vt 0.0280 0.3072 0.8751 +vt 0.1395 0.3072 0.8788 +vt 0.1948 0.3072 0.8808 +vt 0.2500 0.3072 0.8816 +vt 0.3052 0.3072 0.8808 +vt 0.3605 0.3072 0.8788 +vt 0.4161 0.3072 0.8766 +vt 0.4720 0.3072 0.8751 +vt 0.5280 0.3072 0.8751 +vt 0.5839 0.3072 0.8766 +vt 0.6395 0.3072 0.8788 +vt 0.6948 0.3072 0.8808 +vt 0.7500 0.0005 0.6612 +vt 0.8052 0.0005 0.6606 +vt 0.8605 0.0005 0.6591 +vt 0.9161 0.0005 0.6574 +vt 0.9720 0.0005 0.6563 +vt -0.0280 0.0005 0.8751 +vt -0.0280 0.0005 0.6563 +vt 0.0280 0.0005 0.6563 +vt 0.0839 0.0005 0.6574 +vt 0.1395 0.0005 0.6591 +vt 0.1948 0.0005 0.6606 +vt 0.2500 0.0005 0.6612 +vt 0.3052 0.0005 0.6606 +vt 0.3605 0.0005 0.6591 +vt 0.4161 0.0005 0.6574 +vt 0.4720 0.0005 0.6563 +vt 0.5280 0.0005 0.6563 +vt 0.5839 0.0005 0.6574 +vt 0.6395 0.0005 0.6591 +vt 0.6948 0.0005 0.6606 +vt 0.7500 0.0005 0.4408 +vt 0.8052 0.0005 0.4404 +vt 0.8605 0.0005 0.4394 +vt 0.9161 0.0005 0.4383 +vt 0.9720 0.0005 0.4376 +vt -0.0280 0.0005 0.4376 +vt 0.0280 0.0005 0.4376 +vt 0.0839 0.0005 0.4383 +vt 0.1395 0.0005 0.4394 +vt 0.1948 0.0005 0.4404 +vt 0.2500 0.0005 0.4408 +vt 0.3052 0.0005 0.4404 +vt 0.3605 0.0005 0.4394 +vt 0.4161 0.0005 0.4383 +vt 0.4720 0.0005 0.4376 +vt 0.5280 0.0005 0.4376 +vt 0.5839 0.0005 0.4383 +vt 0.6395 0.0005 0.4394 +vt 0.6948 0.0005 0.4404 +vt 0.7500 0.0005 0.2204 +vt 0.8052 0.0005 0.2202 +vt 0.8605 0.0005 0.2197 +vt 0.9161 0.0005 0.2191 +vt 0.9720 0.0005 0.2188 +vt -0.0280 0.0005 0.2188 +vt 0.0280 0.0005 0.2188 +vt 0.0839 0.0005 0.2191 +vt 0.1395 0.0005 0.2197 +vt 0.1948 0.0005 0.2202 +vt 0.2500 0.0005 0.2204 +vt 0.3052 0.0005 0.2202 +vt 0.3605 0.0005 0.2197 +vt 0.4161 0.0005 0.2191 +vt 0.4720 0.0005 0.2188 +vt 0.5280 0.0005 0.2188 +vt 0.5839 0.0005 0.2191 +vt 0.6395 0.0005 0.2197 +vt 0.6948 0.0005 0.2202 +vt 0.5000 0.0005 0.0000 +vt -0.9720 0.0005 0.2188 +vt -0.5000 0.0005 0.0000 +vt 0.7569 0.9995 1.0076 +vt 0.7982 0.9995 1.0069 +vt 0.7968 0.9556 0.8322 +vt 0.7584 0.9556 0.8327 +vt 0.8121 0.9995 1.0065 +vt 0.8535 0.9995 1.0048 +vt 0.8521 0.9556 0.8305 +vt 0.8136 0.9556 0.8318 +vt 0.8675 0.9995 1.0041 +vt 0.9091 0.9995 1.0022 +vt 0.9077 0.9556 0.8283 +vt 0.8690 0.9556 0.8298 +vt 0.9232 0.9995 1.0016 +vt 0.9650 0.9995 1.0003 +vt 0.9635 0.9556 0.8268 +vt 0.9246 0.9556 0.8277 +vt 0.9790 0.9995 1.0001 +vt 1.0210 0.9995 1.0001 +vt 1.0195 0.9556 0.8265 +vt 0.9805 0.9556 0.8265 +vt 0.0350 0.9995 1.0003 +vt 0.0768 0.9995 1.0016 +vt 0.0754 0.9556 0.8277 +vt 0.0365 0.9556 0.8268 +vt 0.0909 0.9995 1.0022 +vt 0.1325 0.9995 1.0041 +vt 0.1310 0.9556 0.8298 +vt 0.0923 0.9556 0.8283 +vt 0.1465 0.9995 1.0048 +vt 0.1879 0.9995 1.0065 +vt 0.1864 0.9556 0.8318 +vt 0.1479 0.9556 0.8305 +vt 0.2018 0.9995 1.0069 +vt 0.2431 0.9995 1.0076 +vt 0.2416 0.9556 0.8327 +vt 0.2032 0.9556 0.8322 +vt 0.2569 0.9995 1.0076 +vt 0.2982 0.9995 1.0069 +vt 0.2968 0.9556 0.8322 +vt 0.2584 0.9556 0.8327 +vt 0.3121 0.9995 1.0065 +vt 0.3535 0.9995 1.0048 +vt 0.3521 0.9556 0.8305 +vt 0.3136 0.9556 0.8318 +vt 0.3675 0.9995 1.0041 +vt 0.4091 0.9995 1.0022 +vt 0.4077 0.9556 0.8283 +vt 0.3690 0.9556 0.8298 +vt 0.4232 0.9995 1.0016 +vt 0.4650 0.9995 1.0003 +vt 0.4635 0.9556 0.8268 +vt 0.4246 0.9556 0.8277 +vt 0.4790 0.9995 1.0001 +vt 0.5210 0.9995 1.0001 +vt 0.5195 0.9556 0.8265 +vt 0.4805 0.9556 0.8265 +vt 0.5350 0.9995 1.0003 +vt 0.5768 0.9995 1.0016 +vt 0.5754 0.9556 0.8277 +vt 0.5365 0.9556 0.8268 +vt 0.5909 0.9995 1.0022 +vt 0.6325 0.9995 1.0041 +vt 0.6310 0.9556 0.8298 +vt 0.5923 0.9556 0.8283 +vt 0.6465 0.9995 1.0048 +vt 0.6879 0.9995 1.0065 +vt 0.6864 0.9556 0.8318 +vt 0.6479 0.9556 0.8305 +vt 0.7018 0.9995 1.0069 +vt 0.7431 0.9995 1.0076 +vt 0.7416 0.9556 0.8327 +vt 0.7032 0.9556 0.8322 +vt 0.7594 0.9349 0.7431 +vt 0.7958 0.9349 0.7427 +vt 0.7929 0.9068 0.5682 +vt 0.7623 0.9068 0.5684 +vt 0.8146 0.9349 0.7422 +vt 0.8511 0.9349 0.7411 +vt 0.8482 0.9068 0.5670 +vt 0.8175 0.9068 0.5677 +vt 0.8700 0.9349 0.7405 +vt 0.9066 0.9349 0.7392 +vt 0.9037 0.9068 0.5655 +vt 0.8729 0.9068 0.5664 +vt 0.9257 0.9349 0.7386 +vt 0.9625 0.9349 0.7378 +vt 0.9595 0.9068 0.5644 +vt 0.9286 0.9068 0.5650 +vt 0.9816 0.9349 0.7376 +vt 1.0184 0.9349 0.7376 +vt 1.0155 0.9068 0.5642 +vt 0.9845 0.9068 0.5642 +vt 0.0375 0.9349 0.7378 +vt 0.0743 0.9349 0.7386 +vt 0.0714 0.9068 0.5650 +vt 0.0405 0.9068 0.5644 +vt 0.0934 0.9349 0.7392 +vt 0.1300 0.9349 0.7405 +vt 0.1271 0.9068 0.5664 +vt 0.0963 0.9068 0.5655 +vt 0.1489 0.9349 0.7411 +vt 0.1854 0.9349 0.7422 +vt 0.1825 0.9068 0.5677 +vt 0.1518 0.9068 0.5670 +vt 0.2042 0.9349 0.7427 +vt 0.2406 0.9349 0.7431 +vt 0.2377 0.9068 0.5684 +vt 0.2071 0.9068 0.5682 +vt 0.2594 0.9349 0.7431 +vt 0.2958 0.9349 0.7427 +vt 0.2929 0.9068 0.5682 +vt 0.2623 0.9068 0.5684 +vt 0.3146 0.9349 0.7422 +vt 0.3511 0.9349 0.7411 +vt 0.3482 0.9068 0.5670 +vt 0.3175 0.9068 0.5677 +vt 0.3700 0.9349 0.7405 +vt 0.4066 0.9349 0.7392 +vt 0.4037 0.9068 0.5655 +vt 0.3729 0.9068 0.5664 +vt 0.4257 0.9349 0.7386 +vt 0.4625 0.9349 0.7378 +vt 0.4595 0.9068 0.5644 +vt 0.4286 0.9068 0.5650 +vt 0.4816 0.9349 0.7376 +vt 0.5184 0.9349 0.7376 +vt 0.5155 0.9068 0.5642 +vt 0.4845 0.9068 0.5642 +vt 0.5375 0.9349 0.7378 +vt 0.5743 0.9349 0.7386 +vt 0.5714 0.9068 0.5650 +vt 0.5405 0.9068 0.5644 +vt 0.5934 0.9349 0.7392 +vt 0.6300 0.9349 0.7405 +vt 0.6271 0.9068 0.5664 +vt 0.5963 0.9068 0.5655 +vt 0.6489 0.9349 0.7411 +vt 0.6854 0.9349 0.7422 +vt 0.6825 0.9068 0.5677 +vt 0.6518 0.9068 0.5670 +vt 0.7042 0.9349 0.7427 +vt 0.7406 0.9349 0.7431 +vt 0.7377 0.9068 0.5684 +vt 0.7071 0.9068 0.5682 +vt 0.7646 0.7680 0.4790 +vt 0.7906 0.7680 0.4788 +vt 0.7822 0.7680 0.3050 +vt 0.7730 0.7680 0.3051 +vt 0.8198 0.7680 0.4784 +vt 0.8458 0.7680 0.4778 +vt 0.8374 0.7680 0.3045 +vt 0.8282 0.7680 0.3046 +vt 0.8752 0.7680 0.4772 +vt 0.9014 0.7680 0.4766 +vt 0.8929 0.7680 0.3037 +vt 0.8836 0.7680 0.3038 +vt 0.9309 0.7680 0.4760 +vt 0.9572 0.7680 0.4756 +vt 0.9487 0.7680 0.3031 +vt 0.9394 0.7680 0.3031 +vt 0.9868 0.7680 0.4754 +vt 1.0132 0.7680 0.4754 +vt 1.0047 0.7680 0.3028 +vt 0.9953 0.7680 0.3028 +vt 0.0428 0.7680 0.4756 +vt 0.0691 0.7680 0.4760 +vt 0.0606 0.7680 0.3031 +vt 0.0513 0.7680 0.3031 +vt 0.0986 0.7680 0.4766 +vt 0.1248 0.7680 0.4772 +vt 0.1164 0.7680 0.3038 +vt 0.1071 0.7680 0.3037 +vt 0.1542 0.7680 0.4778 +vt 0.1802 0.7680 0.4784 +vt 0.1718 0.7680 0.3046 +vt 0.1626 0.7680 0.3045 +vt 0.2094 0.7680 0.4788 +vt 0.2354 0.7680 0.4790 +vt 0.2270 0.7680 0.3051 +vt 0.2178 0.7680 0.3050 +vt 0.2646 0.7680 0.4790 +vt 0.2906 0.7680 0.4788 +vt 0.2822 0.7680 0.3050 +vt 0.2730 0.7680 0.3051 +vt 0.3198 0.7680 0.4784 +vt 0.3458 0.7680 0.4778 +vt 0.3374 0.7680 0.3045 +vt 0.3282 0.7680 0.3046 +vt 0.3752 0.7680 0.4772 +vt 0.4014 0.7680 0.4766 +vt 0.3929 0.7680 0.3037 +vt 0.3836 0.7680 0.3038 +vt 0.4309 0.7680 0.4760 +vt 0.4572 0.7680 0.4756 +vt 0.4487 0.7680 0.3031 +vt 0.4394 0.7680 0.3031 +vt 0.4868 0.7680 0.4754 +vt 0.5132 0.7680 0.4754 +vt 0.5047 0.7680 0.3028 +vt 0.4953 0.7680 0.3028 +vt 0.5428 0.7680 0.4756 +vt 0.5691 0.7680 0.4760 +vt 0.5606 0.7680 0.3031 +vt 0.5513 0.7680 0.3031 +vt 0.5986 0.7680 0.4766 +vt 0.6248 0.7680 0.4772 +vt 0.6164 0.7680 0.3038 +vt 0.6071 0.7680 0.3037 +vt 0.6542 0.7680 0.4778 +vt 0.6802 0.7680 0.4784 +vt 0.6718 0.7680 0.3046 +vt 0.6626 0.7680 0.3045 +vt 0.7094 0.7680 0.4788 +vt 0.7354 0.7680 0.4790 +vt 0.7270 0.7680 0.3051 +vt 0.7178 0.7680 0.3050 +vt 0.7825 0.9066 0.2166 +vt 0.7727 0.9066 0.2167 +vt 0.7776 0.9039 0.2545 +vt 0.8377 0.9066 0.2162 +vt 0.8279 0.9066 0.2163 +vt 0.8328 0.9039 0.2541 +vt 0.8932 0.9066 0.2157 +vt 0.8834 0.9066 0.2158 +vt 0.8883 0.9039 0.2534 +vt 0.9490 0.9066 0.2152 +vt 0.9391 0.9066 0.2153 +vt 0.9441 0.9039 0.2529 +vt 0.0050 0.9066 0.2151 +vt -0.0050 0.9066 0.2151 +vt -0.0000 0.9039 0.2526 +vt 0.0609 0.9066 0.2153 +vt 0.0510 0.9066 0.2152 +vt 0.0559 0.9039 0.2529 +vt 0.1166 0.9066 0.2158 +vt 0.1068 0.9066 0.2157 +vt 0.1117 0.9039 0.2534 +vt 0.1721 0.9066 0.2163 +vt 0.1623 0.9066 0.2162 +vt 0.1672 0.9039 0.2541 +vt 0.2273 0.9066 0.2167 +vt 0.2175 0.9066 0.2166 +vt 0.2224 0.9039 0.2545 +vt 0.2825 0.9066 0.2166 +vt 0.2727 0.9066 0.2167 +vt 0.2776 0.9039 0.2545 +vt 0.3377 0.9066 0.2162 +vt 0.3279 0.9066 0.2163 +vt 0.3328 0.9039 0.2541 +vt 0.3932 0.9066 0.2157 +vt 0.3834 0.9066 0.2158 +vt 0.3883 0.9039 0.2534 +vt 0.4490 0.9066 0.2152 +vt 0.4391 0.9066 0.2153 +vt 0.4441 0.9039 0.2529 +vt 0.5050 0.9066 0.2151 +vt 0.4950 0.9066 0.2151 +vt 0.5000 0.9039 0.2526 +vt 0.5609 0.9066 0.2153 +vt 0.5510 0.9066 0.2152 +vt 0.5559 0.9039 0.2529 +vt 0.6166 0.9066 0.2158 +vt 0.6068 0.9066 0.2157 +vt 0.6117 0.9039 0.2534 +vt 0.6721 0.9066 0.2163 +vt 0.6623 0.9066 0.2162 +vt 0.6672 0.9039 0.2541 +vt 0.7273 0.9066 0.2167 +vt 0.7175 0.9066 0.2166 +vt 0.7224 0.9039 0.2545 +vt 0.8035 0.3527 0.8699 +vt 0.7517 0.3527 0.8707 +vt 0.8052 0.3072 0.6606 +vt 0.8030 0.3527 0.6684 +vt 0.7500 0.3072 0.6612 +vt 0.7522 0.3527 0.6690 +vt 0.8588 0.3527 0.8680 +vt 0.8068 0.3527 0.8698 +vt 0.8605 0.3072 0.6591 +vt 0.8583 0.3527 0.6669 +vt 0.8073 0.3527 0.6683 +vt 0.9145 0.3527 0.8658 +vt 0.8622 0.3527 0.8679 +vt 0.9161 0.3072 0.6574 +vt 0.9139 0.3527 0.6652 +vt 0.8627 0.3527 0.6668 +vt 0.9703 0.3527 0.8643 +vt 0.9178 0.3527 0.8657 +vt 0.9720 0.3072 0.6563 +vt 0.9698 0.3527 0.6641 +vt 0.9183 0.3527 0.6651 +vt 1.0263 0.3527 0.8642 +vt 0.9737 0.3527 0.8642 +vt 0.0280 0.3072 0.6563 +vt 0.0258 0.3527 0.6640 +vt 0.0263 0.3527 0.8642 +vt -0.0280 0.3072 0.6563 +vt -0.0258 0.3527 0.6640 +vt 0.9742 0.3527 0.6640 +vt 0.0822 0.3527 0.8657 +vt 0.0297 0.3527 0.8643 +vt 0.0839 0.3072 0.6574 +vt 0.0817 0.3527 0.6651 +vt 0.0302 0.3527 0.6641 +vt 0.1378 0.3527 0.8679 +vt 0.0855 0.3527 0.8658 +vt 0.1395 0.3072 0.6591 +vt 0.1373 0.3527 0.6668 +vt 0.0861 0.3527 0.6652 +vt 0.1932 0.3527 0.8698 +vt 0.1412 0.3527 0.8680 +vt 0.1948 0.3072 0.6606 +vt 0.1927 0.3527 0.6683 +vt 0.1417 0.3527 0.6669 +vt 0.2483 0.3527 0.8707 +vt 0.1965 0.3527 0.8699 +vt 0.2500 0.3072 0.6612 +vt 0.2478 0.3527 0.6690 +vt 0.1970 0.3527 0.6684 +vt 0.3035 0.3527 0.8699 +vt 0.2517 0.3527 0.8707 +vt 0.3052 0.3072 0.6606 +vt 0.3030 0.3527 0.6684 +vt 0.2522 0.3527 0.6690 +vt 0.3588 0.3527 0.8680 +vt 0.3068 0.3527 0.8698 +vt 0.3605 0.3072 0.6591 +vt 0.3583 0.3527 0.6669 +vt 0.3073 0.3527 0.6683 +vt 0.4145 0.3527 0.8658 +vt 0.3622 0.3527 0.8679 +vt 0.4161 0.3072 0.6574 +vt 0.4139 0.3527 0.6652 +vt 0.3627 0.3527 0.6668 +vt 0.4703 0.3527 0.8643 +vt 0.4178 0.3527 0.8657 +vt 0.4720 0.3072 0.6563 +vt 0.4698 0.3527 0.6641 +vt 0.4183 0.3527 0.6651 +vt 0.5263 0.3527 0.8642 +vt 0.4737 0.3527 0.8642 +vt 0.5280 0.3072 0.6563 +vt 0.5258 0.3527 0.6640 +vt 0.4742 0.3527 0.6640 +vt 0.5822 0.3527 0.8657 +vt 0.5297 0.3527 0.8643 +vt 0.5839 0.3072 0.6574 +vt 0.5817 0.3527 0.6651 +vt 0.5302 0.3527 0.6641 +vt 0.6378 0.3527 0.8679 +vt 0.5855 0.3527 0.8658 +vt 0.6395 0.3072 0.6591 +vt 0.6373 0.3527 0.6668 +vt 0.5861 0.3527 0.6652 +vt 0.6932 0.3527 0.8698 +vt 0.6412 0.3527 0.8680 +vt 0.6948 0.3072 0.6606 +vt 0.6927 0.3527 0.6683 +vt 0.6417 0.3527 0.6669 +vt 0.7483 0.3527 0.8707 +vt 0.6965 0.3527 0.8699 +vt 0.7478 0.3527 0.6690 +vt 0.6970 0.3527 0.6684 +vt 0.8029 0.3527 0.6498 +vt 0.7522 0.3527 0.6503 +vt 0.8052 0.3072 0.4404 +vt 0.8019 0.3527 0.4482 +vt 0.7500 0.3072 0.4408 +vt 0.7532 0.3527 0.4486 +vt 0.8583 0.3527 0.6483 +vt 0.8074 0.3527 0.6497 +vt 0.8605 0.3072 0.4394 +vt 0.8573 0.3527 0.4473 +vt 0.8084 0.3527 0.4482 +vt 0.9139 0.3527 0.6467 +vt 0.8628 0.3527 0.6482 +vt 0.9161 0.3072 0.4383 +vt 0.9129 0.3527 0.4461 +vt 0.8638 0.3527 0.4471 +vt 0.9697 0.3527 0.6455 +vt 0.9184 0.3527 0.6465 +vt 0.9720 0.3072 0.4376 +vt 0.9687 0.3527 0.4453 +vt 0.9194 0.3527 0.4460 +vt 1.0280 0.3072 0.6563 +vt 1.0257 0.3527 0.6455 +vt 0.9743 0.3527 0.6455 +vt 0.0280 0.3072 0.4376 +vt 0.0247 0.3527 0.4453 +vt 0.0257 0.3527 0.6455 +vt -0.0280 0.3072 0.4376 +vt -0.0247 0.3527 0.4453 +vt 0.9753 0.3527 0.4453 +vt 0.0816 0.3527 0.6465 +vt 0.0303 0.3527 0.6455 +vt 0.0839 0.3072 0.4383 +vt 0.0806 0.3527 0.4460 +vt 0.0313 0.3527 0.4453 +vt 0.1372 0.3527 0.6482 +vt 0.0861 0.3527 0.6467 +vt 0.1395 0.3072 0.4394 +vt 0.1362 0.3527 0.4471 +vt 0.0871 0.3527 0.4461 +vt 0.1926 0.3527 0.6497 +vt 0.1417 0.3527 0.6483 +vt 0.1948 0.3072 0.4404 +vt 0.1916 0.3527 0.4482 +vt 0.1427 0.3527 0.4473 +vt 0.2478 0.3527 0.6503 +vt 0.1971 0.3527 0.6498 +vt 0.2500 0.3072 0.4408 +vt 0.2468 0.3527 0.4486 +vt 0.1981 0.3527 0.4482 +vt 0.3029 0.3527 0.6498 +vt 0.2522 0.3527 0.6503 +vt 0.3052 0.3072 0.4404 +vt 0.3019 0.3527 0.4482 +vt 0.2532 0.3527 0.4486 +vt 0.3583 0.3527 0.6483 +vt 0.3074 0.3527 0.6497 +vt 0.3605 0.3072 0.4394 +vt 0.3573 0.3527 0.4473 +vt 0.3084 0.3527 0.4482 +vt 0.4139 0.3527 0.6467 +vt 0.3628 0.3527 0.6482 +vt 0.4161 0.3072 0.4383 +vt 0.4129 0.3527 0.4461 +vt 0.3638 0.3527 0.4471 +vt 0.4697 0.3527 0.6455 +vt 0.4184 0.3527 0.6465 +vt 0.4720 0.3072 0.4376 +vt 0.4687 0.3527 0.4453 +vt 0.4194 0.3527 0.4460 +vt 0.5257 0.3527 0.6455 +vt 0.4743 0.3527 0.6455 +vt 0.5280 0.3072 0.4376 +vt 0.5247 0.3527 0.4453 +vt 0.4753 0.3527 0.4453 +vt 0.5816 0.3527 0.6465 +vt 0.5303 0.3527 0.6455 +vt 0.5839 0.3072 0.4383 +vt 0.5806 0.3527 0.4460 +vt 0.5313 0.3527 0.4453 +vt 0.6372 0.3527 0.6482 +vt 0.5861 0.3527 0.6467 +vt 0.6395 0.3072 0.4394 +vt 0.6362 0.3527 0.4471 +vt 0.5871 0.3527 0.4461 +vt 0.6926 0.3527 0.6497 +vt 0.6417 0.3527 0.6483 +vt 0.6948 0.3072 0.4404 +vt 0.6916 0.3527 0.4482 +vt 0.6427 0.3527 0.4473 +vt 0.7478 0.3527 0.6503 +vt 0.6971 0.3527 0.6498 +vt 0.7468 0.3527 0.4486 +vt 0.6981 0.3527 0.4482 +vt 0.8018 0.3489 0.4296 +vt 0.7534 0.3489 0.4299 +vt 0.8052 0.3072 0.2202 +vt 0.7988 0.3490 0.2281 +vt 0.7500 0.3072 0.2204 +vt 0.7564 0.3490 0.2283 +vt 0.8571 0.3489 0.4286 +vt 0.8086 0.3489 0.4295 +vt 0.8605 0.3072 0.2197 +vt 0.8541 0.3490 0.2277 +vt 0.8115 0.3490 0.2280 +vt 0.9127 0.3489 0.4275 +vt 0.8639 0.3489 0.4285 +vt 0.9161 0.3072 0.2191 +vt 0.9097 0.3490 0.2271 +vt 0.8669 0.3490 0.2275 +vt 0.9686 0.3489 0.4268 +vt 0.9196 0.3489 0.4274 +vt 0.9720 0.3072 0.2188 +vt 0.9656 0.3490 0.2266 +vt 0.9226 0.3490 0.2269 +vt 1.0280 0.3072 0.4376 +vt 1.0246 0.3489 0.4267 +vt 0.9754 0.3489 0.4267 +vt 0.0280 0.3072 0.2188 +vt 0.0215 0.3490 0.2266 +vt 0.0246 0.3489 0.4267 +vt -0.0280 0.3072 0.2188 +vt -0.0215 0.3490 0.2266 +vt 0.9785 0.3490 0.2266 +vt 0.0804 0.3489 0.4274 +vt 0.0314 0.3489 0.4268 +vt 0.0839 0.3072 0.2191 +vt 0.0774 0.3490 0.2269 +vt 0.0344 0.3490 0.2266 +vt 0.1361 0.3489 0.4285 +vt 0.0873 0.3489 0.4275 +vt 0.1395 0.3072 0.2197 +vt 0.1331 0.3490 0.2275 +vt 0.0903 0.3490 0.2271 +vt 0.1914 0.3489 0.4295 +vt 0.1429 0.3489 0.4286 +vt 0.1948 0.3072 0.2202 +vt 0.1885 0.3490 0.2280 +vt 0.1459 0.3490 0.2277 +vt 0.2466 0.3489 0.4299 +vt 0.1982 0.3489 0.4296 +vt 0.2500 0.3072 0.2204 +vt 0.2436 0.3490 0.2283 +vt 0.2012 0.3490 0.2281 +vt 0.3018 0.3489 0.4296 +vt 0.2534 0.3489 0.4299 +vt 0.3052 0.3072 0.2202 +vt 0.2988 0.3490 0.2281 +vt 0.2564 0.3490 0.2283 +vt 0.3571 0.3489 0.4286 +vt 0.3086 0.3489 0.4295 +vt 0.3605 0.3072 0.2197 +vt 0.3541 0.3490 0.2277 +vt 0.3115 0.3490 0.2280 +vt 0.4127 0.3489 0.4275 +vt 0.3639 0.3489 0.4285 +vt 0.4161 0.3072 0.2191 +vt 0.4097 0.3490 0.2271 +vt 0.3669 0.3490 0.2275 +vt 0.4686 0.3489 0.4268 +vt 0.4196 0.3489 0.4274 +vt 0.4720 0.3072 0.2188 +vt 0.4656 0.3490 0.2266 +vt 0.4226 0.3490 0.2269 +vt 0.5246 0.3489 0.4267 +vt 0.4754 0.3489 0.4267 +vt 0.5280 0.3072 0.2188 +vt 0.5215 0.3490 0.2266 +vt 0.4785 0.3490 0.2266 +vt 0.5804 0.3489 0.4274 +vt 0.5314 0.3489 0.4268 +vt 0.5839 0.3072 0.2191 +vt 0.5774 0.3490 0.2269 +vt 0.5344 0.3490 0.2266 +vt 0.6361 0.3489 0.4285 +vt 0.5873 0.3489 0.4275 +vt 0.6395 0.3072 0.2197 +vt 0.6331 0.3490 0.2275 +vt 0.5903 0.3490 0.2271 +vt 0.6914 0.3489 0.4295 +vt 0.6429 0.3489 0.4286 +vt 0.6948 0.3072 0.2202 +vt 0.6885 0.3490 0.2280 +vt 0.6459 0.3490 0.2277 +vt 0.7466 0.3489 0.4299 +vt 0.6982 0.3489 0.4296 +vt 0.7436 0.3490 0.2283 +vt 0.7012 0.3490 0.2281 +vt 0.7982 0.3527 0.2095 +vt 0.7569 0.3527 0.2096 +vt 0.5000 0.3072 0.0000 +vt 0.7776 0.3527 0.0529 +vt 0.8535 0.3527 0.2090 +vt 0.8121 0.3527 0.2094 +vt 0.8328 0.3527 0.0529 +vt 0.9091 0.3527 0.2085 +vt 0.8675 0.3527 0.2089 +vt 0.8883 0.3527 0.0527 +vt 0.9650 0.3527 0.2081 +vt 0.9232 0.3527 0.2084 +vt 0.9441 0.3527 0.0526 +vt 1.0280 0.3072 0.2188 +vt 1.0210 0.3527 0.2081 +vt 0.9790 0.3527 0.2081 +vt 0.0000 0.3527 0.0526 +vt 0.0210 0.3527 0.2081 +vt 1.0000 0.3527 0.0526 +vt 0.0768 0.3527 0.2084 +vt 0.0350 0.3527 0.2081 +vt 0.0559 0.3527 0.0526 +vt 0.1325 0.3527 0.2089 +vt 0.0909 0.3527 0.2085 +vt 0.1117 0.3527 0.0527 +vt 0.1879 0.3527 0.2094 +vt 0.1465 0.3527 0.2090 +vt 0.1672 0.3527 0.0529 +vt 0.2431 0.3527 0.2096 +vt 0.2018 0.3527 0.2095 +vt 0.2224 0.3527 0.0529 +vt 0.2982 0.3527 0.2095 +vt 0.2569 0.3527 0.2096 +vt 0.2776 0.3527 0.0529 +vt 0.3535 0.3527 0.2090 +vt 0.3121 0.3527 0.2094 +vt 0.3328 0.3527 0.0529 +vt 0.4091 0.3527 0.2085 +vt 0.3675 0.3527 0.2089 +vt 0.3883 0.3527 0.0527 +vt 0.4650 0.3527 0.2081 +vt 0.4232 0.3527 0.2084 +vt 0.4441 0.3527 0.0526 +vt 0.5210 0.3527 0.2081 +vt 0.4790 0.3527 0.2081 +vt 0.5000 0.3527 0.0526 +vt 0.5768 0.3527 0.2084 +vt 0.5350 0.3527 0.2081 +vt 0.5559 0.3527 0.0526 +vt 0.6325 0.3527 0.2089 +vt 0.5909 0.3527 0.2085 +vt 0.6117 0.3527 0.0527 +vt 0.6879 0.3527 0.2094 +vt 0.6465 0.3527 0.2090 +vt 0.6672 0.3527 0.0529 +vt 0.7431 0.3527 0.2096 +vt 0.7018 0.3527 0.2095 +vt 0.7224 0.3527 0.0529 +vt 0.8018 0.5670 0.8947 +vt 0.7534 0.5670 0.8954 +vt 0.8009 0.5580 0.7043 +vt 0.7543 0.5580 0.7049 +vt 0.8571 0.5670 0.8927 +vt 0.8086 0.5670 0.8945 +vt 0.8562 0.5580 0.7028 +vt 0.8095 0.5580 0.7042 +vt 0.9127 0.5670 0.8904 +vt 0.8639 0.5670 0.8925 +vt 0.9118 0.5580 0.7010 +vt 0.8648 0.5580 0.7025 +vt 0.9686 0.5670 0.8889 +vt 0.9196 0.5670 0.8902 +vt 0.9677 0.5580 0.6998 +vt 0.9205 0.5580 0.7008 +vt 1.0246 0.5670 0.8888 +vt 0.9754 0.5670 0.8888 +vt 0.0236 0.5580 0.6997 +vt 0.0246 0.5670 0.8888 +vt -0.0236 0.5580 0.6997 +vt 0.9764 0.5580 0.6997 +vt 0.0804 0.5670 0.8902 +vt 0.0314 0.5670 0.8889 +vt 0.0795 0.5580 0.7008 +vt 0.0323 0.5580 0.6998 +vt 0.1361 0.5670 0.8925 +vt 0.0873 0.5670 0.8904 +vt 0.1352 0.5580 0.7025 +vt 0.0882 0.5580 0.7010 +vt 0.1914 0.5670 0.8945 +vt 0.1429 0.5670 0.8927 +vt 0.1905 0.5580 0.7042 +vt 0.1438 0.5580 0.7028 +vt 0.2466 0.5670 0.8954 +vt 0.1982 0.5670 0.8947 +vt 0.2457 0.5580 0.7049 +vt 0.1991 0.5580 0.7043 +vt 0.3018 0.5670 0.8947 +vt 0.2534 0.5670 0.8954 +vt 0.3009 0.5580 0.7043 +vt 0.2543 0.5580 0.7049 +vt 0.3571 0.5670 0.8927 +vt 0.3086 0.5670 0.8945 +vt 0.3562 0.5580 0.7028 +vt 0.3095 0.5580 0.7042 +vt 0.4127 0.5670 0.8904 +vt 0.3639 0.5670 0.8925 +vt 0.4118 0.5580 0.7010 +vt 0.3648 0.5580 0.7025 +vt 0.4686 0.5670 0.8889 +vt 0.4196 0.5670 0.8902 +vt 0.4677 0.5580 0.6998 +vt 0.4205 0.5580 0.7008 +vt 0.5246 0.5670 0.8888 +vt 0.4754 0.5670 0.8888 +vt 0.5236 0.5580 0.6997 +vt 0.4764 0.5580 0.6997 +vt 0.5804 0.5670 0.8902 +vt 0.5314 0.5670 0.8889 +vt 0.5795 0.5580 0.7008 +vt 0.5323 0.5580 0.6998 +vt 0.6361 0.5670 0.8925 +vt 0.5873 0.5670 0.8904 +vt 0.6352 0.5580 0.7025 +vt 0.5882 0.5580 0.7010 +vt 0.6914 0.5670 0.8945 +vt 0.6429 0.5670 0.8927 +vt 0.6905 0.5580 0.7042 +vt 0.6438 0.5580 0.7028 +vt 0.7466 0.5670 0.8954 +vt 0.6982 0.5670 0.8947 +vt 0.7457 0.5580 0.7049 +vt 0.6991 0.5580 0.7043 +vt 0.8006 0.5563 0.6655 +vt 0.7545 0.5563 0.6660 +vt 0.7988 0.5521 0.4752 +vt 0.7564 0.5521 0.4755 +vt 0.8559 0.5563 0.6640 +vt 0.8097 0.5563 0.6653 +vt 0.8541 0.5521 0.4741 +vt 0.8115 0.5521 0.4750 +vt 0.9115 0.5563 0.6623 +vt 0.8651 0.5563 0.6637 +vt 0.9097 0.5521 0.4729 +vt 0.8669 0.5521 0.4739 +vt 0.9674 0.5563 0.6611 +vt 0.9207 0.5563 0.6621 +vt 0.9656 0.5521 0.4721 +vt 0.9226 0.5521 0.4727 +vt 1.0234 0.5563 0.6610 +vt 0.9766 0.5563 0.6610 +vt 0.0215 0.5521 0.4720 +vt 0.0234 0.5563 0.6610 +vt -0.0215 0.5521 0.4720 +vt 0.9785 0.5521 0.4720 +vt 0.0793 0.5563 0.6621 +vt 0.0326 0.5563 0.6611 +vt 0.0774 0.5521 0.4727 +vt 0.0344 0.5521 0.4721 +vt 0.1349 0.5563 0.6637 +vt 0.0885 0.5563 0.6623 +vt 0.1331 0.5521 0.4739 +vt 0.0903 0.5521 0.4729 +vt 0.1903 0.5563 0.6653 +vt 0.1441 0.5563 0.6640 +vt 0.1885 0.5521 0.4750 +vt 0.1459 0.5521 0.4741 +vt 0.2455 0.5563 0.6660 +vt 0.1994 0.5563 0.6655 +vt 0.2436 0.5521 0.4755 +vt 0.2012 0.5521 0.4752 +vt 0.3006 0.5563 0.6655 +vt 0.2545 0.5563 0.6660 +vt 0.2988 0.5521 0.4752 +vt 0.2564 0.5521 0.4755 +vt 0.3559 0.5563 0.6640 +vt 0.3097 0.5563 0.6653 +vt 0.3541 0.5521 0.4741 +vt 0.3115 0.5521 0.4750 +vt 0.4115 0.5563 0.6623 +vt 0.3651 0.5563 0.6637 +vt 0.4097 0.5521 0.4729 +vt 0.3669 0.5521 0.4739 +vt 0.4674 0.5563 0.6611 +vt 0.4207 0.5563 0.6621 +vt 0.4656 0.5521 0.4721 +vt 0.4226 0.5521 0.4727 +vt 0.5234 0.5563 0.6610 +vt 0.4766 0.5563 0.6610 +vt 0.5215 0.5521 0.4720 +vt 0.4785 0.5521 0.4720 +vt 0.5793 0.5563 0.6621 +vt 0.5326 0.5563 0.6611 +vt 0.5774 0.5521 0.4727 +vt 0.5344 0.5521 0.4721 +vt 0.6349 0.5563 0.6637 +vt 0.5885 0.5563 0.6623 +vt 0.6331 0.5521 0.4739 +vt 0.5903 0.5521 0.4729 +vt 0.6903 0.5563 0.6653 +vt 0.6441 0.5563 0.6640 +vt 0.6885 0.5521 0.4750 +vt 0.6459 0.5521 0.4741 +vt 0.7455 0.5563 0.6660 +vt 0.6994 0.5563 0.6655 +vt 0.7436 0.5521 0.4755 +vt 0.7012 0.5521 0.4752 +vt 0.7982 0.5000 0.4363 +vt 0.7569 0.5000 0.4366 +vt 0.7929 0.5004 0.2462 +vt 0.7623 0.5004 0.2463 +vt 0.8535 0.5000 0.4354 +vt 0.8121 0.5000 0.4361 +vt 0.8482 0.5004 0.2457 +vt 0.8175 0.5004 0.2460 +vt 0.9091 0.5000 0.4343 +vt 0.8675 0.5000 0.4351 +vt 0.9037 0.5004 0.2451 +vt 0.8729 0.5004 0.2454 +vt 0.9650 0.5000 0.4335 +vt 0.9232 0.5000 0.4340 +vt 0.9595 0.5004 0.2446 +vt 0.9286 0.5004 0.2448 +vt 1.0210 0.5000 0.4334 +vt 0.9790 0.5000 0.4334 +vt 0.0155 0.5004 0.2445 +vt 0.0210 0.5000 0.4334 +vt -0.0155 0.5004 0.2445 +vt 0.9845 0.5004 0.2445 +vt 0.0768 0.5000 0.4340 +vt 0.0350 0.5000 0.4335 +vt 0.0714 0.5004 0.2448 +vt 0.0405 0.5004 0.2446 +vt 0.1325 0.5000 0.4351 +vt 0.0909 0.5000 0.4343 +vt 0.1271 0.5004 0.2454 +vt 0.0963 0.5004 0.2451 +vt 0.1879 0.5000 0.4361 +vt 0.1465 0.5000 0.4354 +vt 0.1825 0.5004 0.2460 +vt 0.1518 0.5004 0.2457 +vt 0.2431 0.5000 0.4366 +vt 0.2018 0.5000 0.4363 +vt 0.2377 0.5004 0.2463 +vt 0.2071 0.5004 0.2462 +vt 0.2982 0.5000 0.4363 +vt 0.2569 0.5000 0.4366 +vt 0.2929 0.5004 0.2462 +vt 0.2623 0.5004 0.2463 +vt 0.3535 0.5000 0.4354 +vt 0.3121 0.5000 0.4361 +vt 0.3482 0.5004 0.2457 +vt 0.3175 0.5004 0.2460 +vt 0.4091 0.5000 0.4343 +vt 0.3675 0.5000 0.4351 +vt 0.4037 0.5004 0.2451 +vt 0.3729 0.5004 0.2454 +vt 0.4650 0.5000 0.4335 +vt 0.4232 0.5000 0.4340 +vt 0.4595 0.5004 0.2446 +vt 0.4286 0.5004 0.2448 +vt 0.5210 0.5000 0.4334 +vt 0.4790 0.5000 0.4334 +vt 0.5155 0.5004 0.2445 +vt 0.4845 0.5004 0.2445 +vt 0.5768 0.5000 0.4340 +vt 0.5350 0.5000 0.4335 +vt 0.5714 0.5004 0.2448 +vt 0.5405 0.5004 0.2446 +vt 0.6325 0.5000 0.4351 +vt 0.5909 0.5000 0.4343 +vt 0.6271 0.5004 0.2454 +vt 0.5963 0.5004 0.2451 +vt 0.6879 0.5000 0.4361 +vt 0.6465 0.5000 0.4354 +vt 0.6825 0.5004 0.2460 +vt 0.6518 0.5004 0.2457 +vt 0.7431 0.5000 0.4366 +vt 0.7018 0.5000 0.4363 +vt 0.7377 0.5004 0.2463 +vt 0.7071 0.5004 0.2462 +vt 0.7906 0.5532 0.2075 +vt 0.7646 0.5532 0.2076 +vt 0.7776 0.5565 0.1102 +vt 0.8458 0.5532 0.2071 +vt 0.8198 0.5532 0.2073 +vt 0.8328 0.5565 0.1100 +vt 0.9014 0.5532 0.2065 +vt 0.8752 0.5532 0.2068 +vt 0.8883 0.5565 0.1097 +vt 0.9572 0.5532 0.2061 +vt 0.9309 0.5532 0.2063 +vt 0.9441 0.5565 0.1094 +vt 1.0132 0.5532 0.2060 +vt 0.9868 0.5532 0.2060 +vt -0.0000 0.5565 0.1094 +vt 0.0132 0.5532 0.2060 +vt -0.0210 0.3527 0.2081 +vt -0.0132 0.5532 0.2060 +vt 0.0691 0.5532 0.2063 +vt 0.0428 0.5532 0.2061 +vt 0.0559 0.5565 0.1094 +vt 0.1248 0.5532 0.2068 +vt 0.0986 0.5532 0.2065 +vt 0.1117 0.5565 0.1097 +vt 0.1802 0.5532 0.2073 +vt 0.1542 0.5532 0.2071 +vt 0.1672 0.5565 0.1100 +vt 0.2354 0.5532 0.2076 +vt 0.2094 0.5532 0.2075 +vt 0.2224 0.5565 0.1102 +vt 0.2906 0.5532 0.2075 +vt 0.2646 0.5532 0.2076 +vt 0.2776 0.5565 0.1102 +vt 0.3458 0.5532 0.2071 +vt 0.3198 0.5532 0.2073 +vt 0.3328 0.5565 0.1100 +vt 0.4014 0.5532 0.2065 +vt 0.3752 0.5532 0.2068 +vt 0.3883 0.5565 0.1097 +vt 0.4572 0.5532 0.2061 +vt 0.4309 0.5532 0.2063 +vt 0.4441 0.5565 0.1094 +vt 0.5132 0.5532 0.2060 +vt 0.4868 0.5532 0.2060 +vt 0.5000 0.5565 0.1094 +vt 0.5691 0.5532 0.2063 +vt 0.5428 0.5532 0.2061 +vt 0.5559 0.5565 0.1095 +vt 0.6248 0.5532 0.2068 +vt 0.5986 0.5532 0.2065 +vt 0.6117 0.5565 0.1097 +vt 0.6802 0.5532 0.2073 +vt 0.6542 0.5532 0.2071 +vt 0.6672 0.5565 0.1100 +vt 0.7354 0.5532 0.2076 +vt 0.7094 0.5532 0.2075 +vt 0.7224 0.5565 0.1102 +vt 0.8000 0.7566 0.9704 +vt 0.7551 0.7566 0.9711 +vt 0.7988 0.7248 0.7827 +vt 0.7564 0.7248 0.7832 +vt 0.8554 0.7566 0.9683 +vt 0.8103 0.7566 0.9701 +vt 0.8541 0.7248 0.7810 +vt 0.8115 0.7248 0.7824 +vt 0.9110 0.7566 0.9658 +vt 0.8657 0.7566 0.9678 +vt 0.9097 0.7248 0.7790 +vt 0.8669 0.7248 0.7806 +vt 0.9668 0.7566 0.9640 +vt 0.9213 0.7566 0.9654 +vt 0.9656 0.7248 0.7776 +vt 0.9226 0.7248 0.7786 +vt 1.0228 0.7566 0.9639 +vt 0.9772 0.7566 0.9639 +vt 0.0215 0.7248 0.7774 +vt 0.0228 0.7566 0.9639 +vt -0.0215 0.7248 0.7774 +vt 0.9785 0.7248 0.7774 +vt 0.0787 0.7566 0.9654 +vt 0.0332 0.7566 0.9640 +vt 0.0774 0.7248 0.7786 +vt 0.0344 0.7248 0.7776 +vt 0.1343 0.7566 0.9678 +vt 0.0890 0.7566 0.9658 +vt 0.1331 0.7248 0.7806 +vt 0.0903 0.7248 0.7790 +vt 0.1897 0.7566 0.9701 +vt 0.1446 0.7566 0.9683 +vt 0.1885 0.7248 0.7824 +vt 0.1459 0.7248 0.7810 +vt 0.2449 0.7566 0.9711 +vt 0.2000 0.7566 0.9704 +vt 0.2436 0.7248 0.7832 +vt 0.2012 0.7248 0.7827 +vt 0.3000 0.7566 0.9704 +vt 0.2551 0.7566 0.9711 +vt 0.2988 0.7248 0.7827 +vt 0.2564 0.7248 0.7832 +vt 0.3554 0.7566 0.9683 +vt 0.3103 0.7566 0.9701 +vt 0.3541 0.7248 0.7810 +vt 0.3115 0.7248 0.7824 +vt 0.4110 0.7566 0.9658 +vt 0.3657 0.7566 0.9678 +vt 0.4097 0.7248 0.7790 +vt 0.3669 0.7248 0.7806 +vt 0.4668 0.7566 0.9640 +vt 0.4213 0.7566 0.9654 +vt 0.4656 0.7248 0.7776 +vt 0.4226 0.7248 0.7786 +vt 0.5228 0.7566 0.9639 +vt 0.4772 0.7566 0.9639 +vt 0.5215 0.7248 0.7774 +vt 0.4785 0.7248 0.7774 +vt 0.5787 0.7566 0.9654 +vt 0.5332 0.7566 0.9640 +vt 0.5774 0.7248 0.7786 +vt 0.5344 0.7248 0.7776 +vt 0.6343 0.7566 0.9678 +vt 0.5890 0.7566 0.9658 +vt 0.6331 0.7248 0.7806 +vt 0.5903 0.7248 0.7790 +vt 0.6897 0.7566 0.9701 +vt 0.6446 0.7566 0.9683 +vt 0.6885 0.7248 0.7824 +vt 0.6459 0.7248 0.7810 +vt 0.7449 0.7566 0.9711 +vt 0.7000 0.7566 0.9704 +vt 0.7436 0.7248 0.7832 +vt 0.7012 0.7248 0.7827 +vt 0.7982 0.7153 0.7187 +vt 0.7569 0.7153 0.7192 +vt 0.7958 0.6984 0.5312 +vt 0.7594 0.6984 0.5315 +vt 0.8535 0.7153 0.7172 +vt 0.8121 0.7153 0.7184 +vt 0.8511 0.6984 0.5301 +vt 0.8146 0.6984 0.5309 +vt 0.9091 0.7153 0.7153 +vt 0.8675 0.7153 0.7167 +vt 0.9067 0.6984 0.5287 +vt 0.8700 0.6984 0.5296 +vt 0.9650 0.7153 0.7140 +vt 0.9232 0.7153 0.7149 +vt 0.9625 0.6984 0.5277 +vt 0.9256 0.6984 0.5283 +vt 1.0210 0.7153 0.7139 +vt 0.9790 0.7153 0.7139 +vt 0.0185 0.6984 0.5275 +vt 0.0210 0.7153 0.7139 +vt -0.0185 0.6984 0.5275 +vt 0.9815 0.6984 0.5275 +vt 0.0768 0.7153 0.7149 +vt 0.0350 0.7153 0.7140 +vt 0.0744 0.6984 0.5283 +vt 0.0375 0.6984 0.5277 +vt 0.1325 0.7153 0.7167 +vt 0.0909 0.7153 0.7153 +vt 0.1300 0.6984 0.5296 +vt 0.0933 0.6984 0.5287 +vt 0.1879 0.7153 0.7184 +vt 0.1465 0.7153 0.7172 +vt 0.1854 0.6984 0.5309 +vt 0.1489 0.6984 0.5301 +vt 0.2431 0.7153 0.7192 +vt 0.2018 0.7153 0.7187 +vt 0.2406 0.6984 0.5315 +vt 0.2042 0.6984 0.5312 +vt 0.2982 0.7153 0.7187 +vt 0.2569 0.7153 0.7192 +vt 0.2958 0.6984 0.5312 +vt 0.2594 0.6984 0.5315 +vt 0.3535 0.7153 0.7172 +vt 0.3121 0.7153 0.7184 +vt 0.3511 0.6984 0.5301 +vt 0.3146 0.6984 0.5309 +vt 0.4091 0.7153 0.7153 +vt 0.3675 0.7153 0.7167 +vt 0.4067 0.6984 0.5287 +vt 0.3700 0.6984 0.5296 +vt 0.4650 0.7153 0.7140 +vt 0.4232 0.7153 0.7149 +vt 0.4625 0.6984 0.5277 +vt 0.4256 0.6984 0.5283 +vt 0.5210 0.7153 0.7139 +vt 0.4790 0.7153 0.7139 +vt 0.5185 0.6984 0.5275 +vt 0.4815 0.6984 0.5275 +vt 0.5768 0.7153 0.7149 +vt 0.5350 0.7153 0.7140 +vt 0.5744 0.6984 0.5283 +vt 0.5375 0.6984 0.5277 +vt 0.6325 0.7153 0.7167 +vt 0.5909 0.7153 0.7153 +vt 0.6300 0.6984 0.5296 +vt 0.5933 0.6984 0.5287 +vt 0.6879 0.7153 0.7184 +vt 0.6465 0.7153 0.7172 +vt 0.6854 0.6984 0.5309 +vt 0.6489 0.6984 0.5301 +vt 0.7431 0.7153 0.7192 +vt 0.7018 0.7153 0.7187 +vt 0.7406 0.6984 0.5315 +vt 0.7042 0.6984 0.5312 +vt 0.7945 0.5982 0.4673 +vt 0.7607 0.5982 0.4675 +vt 0.7873 0.5985 0.2802 +vt 0.7678 0.5985 0.2803 +vt 0.8498 0.5982 0.4663 +vt 0.8159 0.5982 0.4670 +vt 0.8426 0.5985 0.2797 +vt 0.8230 0.5985 0.2799 +vt 0.9054 0.5982 0.4651 +vt 0.8713 0.5982 0.4658 +vt 0.8981 0.5985 0.2789 +vt 0.8785 0.5985 0.2792 +vt 0.9612 0.5982 0.4642 +vt 0.9269 0.5982 0.4647 +vt 0.9539 0.5985 0.2784 +vt 0.9342 0.5985 0.2785 +vt 1.0172 0.5982 0.4640 +vt 0.9828 0.5982 0.4640 +vt 0.0099 0.5985 0.2782 +vt 0.0172 0.5982 0.4640 +vt -0.0099 0.5985 0.2782 +vt 0.9901 0.5985 0.2782 +vt 0.0731 0.5982 0.4647 +vt 0.0388 0.5982 0.4642 +vt 0.0658 0.5985 0.2785 +vt 0.0461 0.5985 0.2784 +vt 0.1287 0.5982 0.4658 +vt 0.0946 0.5982 0.4651 +vt 0.1215 0.5985 0.2792 +vt 0.1019 0.5985 0.2789 +vt 0.1841 0.5982 0.4670 +vt 0.1502 0.5982 0.4663 +vt 0.1770 0.5985 0.2799 +vt 0.1574 0.5985 0.2797 +vt 0.2393 0.5982 0.4675 +vt 0.2055 0.5982 0.4673 +vt 0.2322 0.5985 0.2803 +vt 0.2127 0.5985 0.2802 +vt 0.2945 0.5982 0.4673 +vt 0.2607 0.5982 0.4675 +vt 0.2873 0.5985 0.2802 +vt 0.2678 0.5985 0.2803 +vt 0.3498 0.5982 0.4663 +vt 0.3159 0.5982 0.4670 +vt 0.3426 0.5985 0.2797 +vt 0.3230 0.5985 0.2799 +vt 0.4054 0.5982 0.4651 +vt 0.3713 0.5982 0.4658 +vt 0.3981 0.5985 0.2789 +vt 0.3785 0.5985 0.2792 +vt 0.4612 0.5982 0.4642 +vt 0.4269 0.5982 0.4647 +vt 0.4539 0.5985 0.2784 +vt 0.4342 0.5985 0.2785 +vt 0.5172 0.5982 0.4640 +vt 0.4828 0.5982 0.4640 +vt 0.5099 0.5985 0.2782 +vt 0.4901 0.5985 0.2782 +vt 0.5731 0.5982 0.4647 +vt 0.5388 0.5982 0.4642 +vt 0.5658 0.5985 0.2785 +vt 0.5461 0.5985 0.2784 +vt 0.6287 0.5982 0.4658 +vt 0.5946 0.5982 0.4651 +vt 0.6215 0.5985 0.2792 +vt 0.6019 0.5985 0.2789 +vt 0.6841 0.5982 0.4670 +vt 0.6502 0.5982 0.4663 +vt 0.6770 0.5985 0.2799 +vt 0.6574 0.5985 0.2797 +vt 0.7393 0.5982 0.4675 +vt 0.7055 0.5982 0.4673 +vt 0.7322 0.5985 0.2803 +vt 0.7127 0.5985 0.2802 +vt 0.7821 0.6999 0.2167 +vt 0.7731 0.6999 0.2167 +vt 0.7776 0.7023 0.1816 +vt 0.8373 0.6999 0.2163 +vt 0.8283 0.6999 0.2164 +vt 0.8328 0.7023 0.1813 +vt 0.8928 0.6999 0.2158 +vt 0.8838 0.6999 0.2158 +vt 0.8883 0.7023 0.1809 +vt 0.9486 0.6999 0.2153 +vt 0.9395 0.6999 0.2153 +vt 0.9441 0.7023 0.1805 +vt 1.0046 0.6999 0.2151 +vt 0.9954 0.6999 0.2151 +vt -0.0000 0.7023 0.1803 +vt 0.0046 0.6999 0.2151 +vt 1.0000 0.5565 0.1094 +vt 1.0000 0.7023 0.1803 +vt 0.0605 0.6999 0.2153 +vt 0.0514 0.6999 0.2153 +vt 0.0559 0.7023 0.1805 +vt 0.1162 0.6999 0.2158 +vt 0.1072 0.6999 0.2158 +vt 0.1117 0.7023 0.1809 +vt 0.1717 0.6999 0.2164 +vt 0.1627 0.6999 0.2163 +vt 0.1672 0.7023 0.1813 +vt 0.2269 0.6999 0.2167 +vt 0.2179 0.6999 0.2167 +vt 0.2224 0.7023 0.1816 +vt 0.2821 0.6999 0.2167 +vt 0.2731 0.6999 0.2167 +vt 0.2776 0.7023 0.1816 +vt 0.3373 0.6999 0.2163 +vt 0.3283 0.6999 0.2164 +vt 0.3328 0.7023 0.1813 +vt 0.3928 0.6999 0.2158 +vt 0.3838 0.6999 0.2158 +vt 0.3883 0.7023 0.1809 +vt 0.4486 0.6999 0.2153 +vt 0.4395 0.6999 0.2153 +vt 0.4441 0.7023 0.1805 +vt 0.5046 0.6999 0.2151 +vt 0.4954 0.6999 0.2151 +vt 0.5000 0.7023 0.1803 +vt 0.5605 0.6999 0.2153 +vt 0.5514 0.6999 0.2153 +vt 0.5559 0.7023 0.1805 +vt 0.6162 0.6999 0.2158 +vt 0.6072 0.6999 0.2158 +vt 0.6117 0.7023 0.1809 +vt 0.6717 0.6999 0.2164 +vt 0.6627 0.6999 0.2163 +vt 0.6672 0.7023 0.1813 +vt 0.7269 0.6999 0.2167 +vt 0.7179 0.6999 0.2167 +vt 0.7224 0.7023 0.1816 +vt 0.7982 0.9540 1.0069 +vt 0.7569 0.9540 1.0076 +vt 0.7968 0.9106 0.8322 +vt 0.7584 0.9106 0.8327 +vt 0.8535 0.9540 1.0048 +vt 0.8121 0.9540 1.0065 +vt 0.8521 0.9106 0.8305 +vt 0.8136 0.9106 0.8318 +vt 0.9091 0.9540 1.0022 +vt 0.8675 0.9540 1.0041 +vt 0.9077 0.9106 0.8283 +vt 0.8690 0.9106 0.8298 +vt 0.9650 0.9540 1.0003 +vt 0.9232 0.9540 1.0016 +vt 0.9635 0.9106 0.8268 +vt 0.9246 0.9106 0.8277 +vt 1.0210 0.9540 1.0001 +vt 0.9790 0.9540 1.0001 +vt 0.0195 0.9106 0.8265 +vt 0.0210 0.9540 1.0001 +vt -0.0195 0.9106 0.8265 +vt 0.9805 0.9106 0.8265 +vt 0.0768 0.9540 1.0016 +vt 0.0350 0.9540 1.0003 +vt 0.0754 0.9106 0.8277 +vt 0.0365 0.9106 0.8268 +vt 0.1325 0.9540 1.0041 +vt 0.0909 0.9540 1.0022 +vt 0.1310 0.9106 0.8298 +vt 0.0923 0.9106 0.8283 +vt 0.1879 0.9540 1.0065 +vt 0.1465 0.9540 1.0048 +vt 0.1864 0.9106 0.8318 +vt 0.1479 0.9106 0.8305 +vt 0.2431 0.9540 1.0076 +vt 0.2018 0.9540 1.0069 +vt 0.2416 0.9106 0.8327 +vt 0.2032 0.9106 0.8322 +vt 0.2982 0.9540 1.0069 +vt 0.2569 0.9540 1.0076 +vt 0.2968 0.9106 0.8322 +vt 0.2584 0.9106 0.8327 +vt 0.3535 0.9540 1.0048 +vt 0.3121 0.9540 1.0065 +vt 0.3521 0.9106 0.8305 +vt 0.3136 0.9106 0.8318 +vt 0.4091 0.9540 1.0022 +vt 0.3675 0.9540 1.0041 +vt 0.4077 0.9106 0.8283 +vt 0.3690 0.9106 0.8298 +vt 0.4650 0.9540 1.0003 +vt 0.4232 0.9540 1.0016 +vt 0.4635 0.9106 0.8268 +vt 0.4246 0.9106 0.8277 +vt 0.5210 0.9540 1.0001 +vt 0.4790 0.9540 1.0001 +vt 0.5195 0.9106 0.8265 +vt 0.4805 0.9106 0.8265 +vt 0.5768 0.9540 1.0016 +vt 0.5350 0.9540 1.0003 +vt 0.5754 0.9106 0.8277 +vt 0.5365 0.9106 0.8268 +vt 0.6325 0.9540 1.0041 +vt 0.5909 0.9540 1.0022 +vt 0.6310 0.9106 0.8298 +vt 0.5923 0.9106 0.8283 +vt 0.6879 0.9540 1.0065 +vt 0.6465 0.9540 1.0048 +vt 0.6864 0.9106 0.8318 +vt 0.6479 0.9106 0.8305 +vt 0.7431 0.9540 1.0076 +vt 0.7018 0.9540 1.0069 +vt 0.7416 0.9106 0.8327 +vt 0.7032 0.9106 0.8322 +vt 0.7958 0.8901 0.7427 +vt 0.7594 0.8901 0.7431 +vt 0.7929 0.8625 0.5682 +vt 0.7623 0.8625 0.5684 +vt 0.8511 0.8901 0.7411 +vt 0.8146 0.8901 0.7422 +vt 0.8482 0.8625 0.5670 +vt 0.8175 0.8625 0.5677 +vt 0.9066 0.8901 0.7392 +vt 0.8700 0.8901 0.7405 +vt 0.9037 0.8625 0.5655 +vt 0.8729 0.8625 0.5664 +vt 0.9625 0.8901 0.7378 +vt 0.9257 0.8901 0.7386 +vt 0.9595 0.8625 0.5644 +vt 0.9286 0.8625 0.5650 +vt 1.0184 0.8901 0.7376 +vt 0.9816 0.8901 0.7376 +vt 0.0155 0.8625 0.5642 +vt 0.0184 0.8901 0.7376 +vt -0.0155 0.8625 0.5642 +vt 0.9845 0.8625 0.5642 +vt 0.0743 0.8901 0.7386 +vt 0.0375 0.8901 0.7378 +vt 0.0714 0.8625 0.5650 +vt 0.0405 0.8625 0.5644 +vt 0.1300 0.8901 0.7405 +vt 0.0934 0.8901 0.7392 +vt 0.1271 0.8625 0.5664 +vt 0.0963 0.8625 0.5655 +vt 0.1854 0.8901 0.7422 +vt 0.1489 0.8901 0.7411 +vt 0.1825 0.8625 0.5677 +vt 0.1518 0.8625 0.5670 +vt 0.2406 0.8901 0.7431 +vt 0.2042 0.8901 0.7427 +vt 0.2377 0.8625 0.5684 +vt 0.2071 0.8625 0.5682 +vt 0.2958 0.8901 0.7427 +vt 0.2594 0.8901 0.7431 +vt 0.2929 0.8625 0.5682 +vt 0.2623 0.8625 0.5684 +vt 0.3511 0.8901 0.7411 +vt 0.3146 0.8901 0.7422 +vt 0.3482 0.8625 0.5670 +vt 0.3175 0.8625 0.5677 +vt 0.4066 0.8901 0.7392 +vt 0.3700 0.8901 0.7405 +vt 0.4037 0.8625 0.5655 +vt 0.3729 0.8625 0.5664 +vt 0.4625 0.8901 0.7378 +vt 0.4257 0.8901 0.7386 +vt 0.4595 0.8625 0.5644 +vt 0.4286 0.8625 0.5650 +vt 0.5184 0.8901 0.7376 +vt 0.4816 0.8901 0.7376 +vt 0.5155 0.8625 0.5642 +vt 0.4845 0.8625 0.5642 +vt 0.5743 0.8901 0.7386 +vt 0.5375 0.8901 0.7378 +vt 0.5714 0.8625 0.5650 +vt 0.5405 0.8625 0.5644 +vt 0.6300 0.8901 0.7405 +vt 0.5934 0.8901 0.7392 +vt 0.6271 0.8625 0.5664 +vt 0.5963 0.8625 0.5655 +vt 0.6854 0.8901 0.7422 +vt 0.6489 0.8901 0.7411 +vt 0.6825 0.8625 0.5677 +vt 0.6518 0.8625 0.5670 +vt 0.7406 0.8901 0.7431 +vt 0.7042 0.8901 0.7427 +vt 0.7377 0.8625 0.5684 +vt 0.7071 0.8625 0.5682 +vt 0.7906 0.7259 0.4788 +vt 0.7646 0.7259 0.4790 +vt 0.7822 0.7259 0.3050 +vt 0.7730 0.7259 0.3051 +vt 0.8458 0.7259 0.4778 +vt 0.8198 0.7259 0.4784 +vt 0.8374 0.7259 0.3045 +vt 0.8282 0.7259 0.3046 +vt 0.9014 0.7259 0.4766 +vt 0.8752 0.7259 0.4772 +vt 0.8929 0.7259 0.3037 +vt 0.8836 0.7259 0.3038 +vt 0.9572 0.7259 0.4756 +vt 0.9309 0.7259 0.4760 +vt 0.9487 0.7259 0.3031 +vt 0.9394 0.7259 0.3031 +vt 1.0132 0.7259 0.4754 +vt 0.9868 0.7259 0.4754 +vt 0.0047 0.7259 0.3028 +vt 0.0132 0.7259 0.4754 +vt -0.0047 0.7259 0.3028 +vt 0.9953 0.7259 0.3028 +vt 0.0691 0.7259 0.4760 +vt 0.0428 0.7259 0.4756 +vt 0.0606 0.7259 0.3031 +vt 0.0513 0.7259 0.3031 +vt 0.1248 0.7259 0.4772 +vt 0.0986 0.7259 0.4766 +vt 0.1164 0.7259 0.3038 +vt 0.1071 0.7259 0.3037 +vt 0.1802 0.7259 0.4784 +vt 0.1542 0.7259 0.4778 +vt 0.1718 0.7259 0.3046 +vt 0.1626 0.7259 0.3045 +vt 0.2354 0.7259 0.4790 +vt 0.2094 0.7259 0.4788 +vt 0.2270 0.7259 0.3051 +vt 0.2178 0.7259 0.3050 +vt 0.2906 0.7259 0.4788 +vt 0.2646 0.7259 0.4790 +vt 0.2822 0.7259 0.3050 +vt 0.2730 0.7259 0.3051 +vt 0.3458 0.7259 0.4778 +vt 0.3198 0.7259 0.4784 +vt 0.3374 0.7259 0.3045 +vt 0.3282 0.7259 0.3046 +vt 0.4014 0.7259 0.4766 +vt 0.3752 0.7259 0.4772 +vt 0.3929 0.7259 0.3037 +vt 0.3836 0.7259 0.3038 +vt 0.4572 0.7259 0.4756 +vt 0.4309 0.7259 0.4760 +vt 0.4487 0.7259 0.3031 +vt 0.4394 0.7259 0.3031 +vt 0.5132 0.7259 0.4754 +vt 0.4868 0.7259 0.4754 +vt 0.5047 0.7259 0.3028 +vt 0.4953 0.7259 0.3028 +vt 0.5691 0.7259 0.4760 +vt 0.5428 0.7259 0.4756 +vt 0.5606 0.7259 0.3031 +vt 0.5513 0.7259 0.3031 +vt 0.6248 0.7259 0.4772 +vt 0.5986 0.7259 0.4766 +vt 0.6164 0.7259 0.3038 +vt 0.6071 0.7259 0.3037 +vt 0.6802 0.7259 0.4784 +vt 0.6542 0.7259 0.4778 +vt 0.6718 0.7259 0.3046 +vt 0.6626 0.7259 0.3045 +vt 0.7354 0.7259 0.4790 +vt 0.7094 0.7259 0.4788 +vt 0.7270 0.7259 0.3051 +vt 0.7178 0.7259 0.3050 +vt 0.7727 0.8624 0.2167 +vt 0.7825 0.8624 0.2166 +vt 0.7776 0.8597 0.2545 +vt 0.8279 0.8624 0.2163 +vt 0.8377 0.8624 0.2162 +vt 0.8328 0.8597 0.2541 +vt 0.8834 0.8624 0.2158 +vt 0.8932 0.8624 0.2157 +vt 0.8883 0.8597 0.2534 +vt 0.9391 0.8624 0.2153 +vt 0.9490 0.8624 0.2152 +vt 0.9441 0.8597 0.2529 +vt 0.9950 0.8624 0.2151 +vt 1.0050 0.8624 0.2151 +vt -0.0000 0.8597 0.2526 +vt -0.0050 0.8624 0.2151 +vt 1.0000 0.8597 0.2526 +vt 0.0510 0.8624 0.2152 +vt 0.0609 0.8624 0.2153 +vt 0.0559 0.8597 0.2529 +vt 0.1068 0.8624 0.2157 +vt 0.1166 0.8624 0.2158 +vt 0.1117 0.8597 0.2534 +vt 0.1623 0.8624 0.2162 +vt 0.1721 0.8624 0.2163 +vt 0.1672 0.8597 0.2541 +vt 0.2175 0.8624 0.2166 +vt 0.2273 0.8624 0.2167 +vt 0.2224 0.8597 0.2545 +vt 0.2727 0.8624 0.2167 +vt 0.2825 0.8624 0.2166 +vt 0.2776 0.8597 0.2545 +vt 0.3279 0.8624 0.2163 +vt 0.3377 0.8624 0.2162 +vt 0.3328 0.8597 0.2541 +vt 0.3834 0.8624 0.2158 +vt 0.3932 0.8624 0.2157 +vt 0.3883 0.8597 0.2534 +vt 0.4391 0.8624 0.2153 +vt 0.4490 0.8624 0.2152 +vt 0.4441 0.8597 0.2529 +vt 0.4950 0.8624 0.2151 +vt 0.5050 0.8624 0.2151 +vt 0.5000 0.8597 0.2526 +vt 0.5510 0.8624 0.2152 +vt 0.5609 0.8624 0.2153 +vt 0.5559 0.8597 0.2529 +vt 0.6068 0.8624 0.2157 +vt 0.6166 0.8624 0.2158 +vt 0.6117 0.8597 0.2534 +vt 0.6623 0.8624 0.2162 +vt 0.6721 0.8624 0.2163 +vt 0.6672 0.8597 0.2541 +vt 0.7175 0.8624 0.2166 +vt 0.7273 0.8624 0.2167 +vt 0.7224 0.8597 0.2545 +vt 0.7982 0.9689 1.0069 +vt 0.7569 0.9689 1.0076 +vt 0.7968 0.9253 0.8322 +vt 0.7584 0.9253 0.8327 +vt 0.8535 0.9689 1.0048 +vt 0.8121 0.9689 1.0065 +vt 0.8521 0.9253 0.8305 +vt 0.8136 0.9253 0.8318 +vt 0.9091 0.9689 1.0022 +vt 0.8675 0.9689 1.0041 +vt 0.9077 0.9253 0.8283 +vt 0.8690 0.9253 0.8298 +vt 0.9650 0.9689 1.0003 +vt 0.9232 0.9689 1.0016 +vt 0.9635 0.9253 0.8268 +vt 0.9246 0.9253 0.8277 +vt 1.0210 0.9689 1.0001 +vt 0.9790 0.9689 1.0001 +vt 0.0195 0.9253 0.8265 +vt 0.0210 0.9689 1.0001 +vt -0.0195 0.9253 0.8265 +vt 0.9805 0.9253 0.8265 +vt 0.0768 0.9689 1.0016 +vt 0.0350 0.9689 1.0003 +vt 0.0754 0.9253 0.8277 +vt 0.0365 0.9253 0.8268 +vt 0.1325 0.9689 1.0041 +vt 0.0909 0.9689 1.0022 +vt 0.1310 0.9253 0.8298 +vt 0.0923 0.9253 0.8283 +vt 0.1879 0.9689 1.0065 +vt 0.1465 0.9689 1.0048 +vt 0.1864 0.9253 0.8318 +vt 0.1479 0.9253 0.8305 +vt 0.2431 0.9689 1.0076 +vt 0.2018 0.9689 1.0069 +vt 0.2416 0.9253 0.8327 +vt 0.2032 0.9253 0.8322 +vt 0.2982 0.9689 1.0069 +vt 0.2569 0.9689 1.0076 +vt 0.2968 0.9253 0.8322 +vt 0.2584 0.9253 0.8327 +vt 0.3535 0.9689 1.0048 +vt 0.3121 0.9689 1.0065 +vt 0.3521 0.9253 0.8305 +vt 0.3136 0.9253 0.8318 +vt 0.4091 0.9689 1.0022 +vt 0.3675 0.9689 1.0041 +vt 0.4077 0.9253 0.8283 +vt 0.3690 0.9253 0.8298 +vt 0.4650 0.9689 1.0003 +vt 0.4232 0.9689 1.0016 +vt 0.4635 0.9253 0.8268 +vt 0.4246 0.9253 0.8277 +vt 0.5210 0.9689 1.0001 +vt 0.4790 0.9689 1.0001 +vt 0.5195 0.9253 0.8265 +vt 0.4805 0.9253 0.8265 +vt 0.5768 0.9689 1.0016 +vt 0.5350 0.9689 1.0003 +vt 0.5754 0.9253 0.8277 +vt 0.5365 0.9253 0.8268 +vt 0.6325 0.9689 1.0041 +vt 0.5909 0.9689 1.0022 +vt 0.6310 0.9253 0.8298 +vt 0.5923 0.9253 0.8283 +vt 0.6879 0.9689 1.0065 +vt 0.6465 0.9689 1.0048 +vt 0.6864 0.9253 0.8318 +vt 0.6479 0.9253 0.8305 +vt 0.7431 0.9689 1.0076 +vt 0.7018 0.9689 1.0069 +vt 0.7416 0.9253 0.8327 +vt 0.7032 0.9253 0.8322 +vt 0.7958 0.9047 0.7427 +vt 0.7594 0.9047 0.7431 +vt 0.7929 0.8768 0.5682 +vt 0.7623 0.8768 0.5684 +vt 0.8511 0.9047 0.7411 +vt 0.8146 0.9047 0.7422 +vt 0.8482 0.8768 0.5670 +vt 0.8175 0.8768 0.5677 +vt 0.9066 0.9047 0.7392 +vt 0.8700 0.9047 0.7405 +vt 0.9037 0.8768 0.5655 +vt 0.8729 0.8768 0.5664 +vt 0.9625 0.9047 0.7378 +vt 0.9257 0.9047 0.7386 +vt 0.9595 0.8768 0.5644 +vt 0.9286 0.8768 0.5650 +vt 1.0184 0.9047 0.7376 +vt 0.9816 0.9047 0.7376 +vt 0.0155 0.8768 0.5642 +vt 0.0184 0.9047 0.7376 +vt -0.0155 0.8768 0.5642 +vt 0.9845 0.8768 0.5642 +vt 0.0743 0.9047 0.7386 +vt 0.0375 0.9047 0.7378 +vt 0.0714 0.8768 0.5650 +vt 0.0405 0.8768 0.5644 +vt 0.1300 0.9047 0.7405 +vt 0.0934 0.9047 0.7392 +vt 0.1271 0.8768 0.5664 +vt 0.0963 0.8768 0.5655 +vt 0.1854 0.9047 0.7422 +vt 0.1489 0.9047 0.7411 +vt 0.1825 0.8768 0.5677 +vt 0.1518 0.8768 0.5670 +vt 0.2406 0.9047 0.7431 +vt 0.2042 0.9047 0.7427 +vt 0.2377 0.8768 0.5684 +vt 0.2071 0.8768 0.5682 +vt 0.2958 0.9047 0.7427 +vt 0.2594 0.9047 0.7431 +vt 0.2929 0.8768 0.5682 +vt 0.2623 0.8768 0.5684 +vt 0.3511 0.9047 0.7411 +vt 0.3146 0.9047 0.7422 +vt 0.3482 0.8768 0.5670 +vt 0.3175 0.8768 0.5677 +vt 0.4066 0.9047 0.7392 +vt 0.3700 0.9047 0.7405 +vt 0.4037 0.8768 0.5655 +vt 0.3729 0.8768 0.5664 +vt 0.4625 0.9047 0.7378 +vt 0.4257 0.9047 0.7386 +vt 0.4595 0.8768 0.5644 +vt 0.4286 0.8768 0.5650 +vt 0.5184 0.9047 0.7376 +vt 0.4816 0.9047 0.7376 +vt 0.5155 0.8768 0.5642 +vt 0.4845 0.8768 0.5642 +vt 0.5743 0.9047 0.7386 +vt 0.5375 0.9047 0.7378 +vt 0.5714 0.8768 0.5650 +vt 0.5405 0.8768 0.5644 +vt 0.6300 0.9047 0.7405 +vt 0.5934 0.9047 0.7392 +vt 0.6271 0.8768 0.5664 +vt 0.5963 0.8768 0.5655 +vt 0.6854 0.9047 0.7422 +vt 0.6489 0.9047 0.7411 +vt 0.6825 0.8768 0.5677 +vt 0.6518 0.8768 0.5670 +vt 0.7406 0.9047 0.7431 +vt 0.7042 0.9047 0.7427 +vt 0.7377 0.8768 0.5684 +vt 0.7071 0.8768 0.5682 +vt 0.7906 0.7390 0.4788 +vt 0.7646 0.7390 0.4790 +vt 0.7822 0.7390 0.3050 +vt 0.7730 0.7390 0.3051 +vt 0.8458 0.7390 0.4778 +vt 0.8198 0.7390 0.4784 +vt 0.8374 0.7390 0.3045 +vt 0.8282 0.7390 0.3046 +vt 0.9014 0.7390 0.4766 +vt 0.8752 0.7390 0.4772 +vt 0.8929 0.7390 0.3037 +vt 0.8836 0.7390 0.3038 +vt 0.9572 0.7390 0.4756 +vt 0.9309 0.7390 0.4760 +vt 0.9487 0.7390 0.3031 +vt 0.9394 0.7390 0.3031 +vt 1.0132 0.7390 0.4754 +vt 0.9868 0.7390 0.4754 +vt 0.0047 0.7390 0.3028 +vt 0.0132 0.7390 0.4754 +vt -0.0047 0.7390 0.3028 +vt 0.9953 0.7390 0.3028 +vt 0.0691 0.7390 0.4760 +vt 0.0428 0.7390 0.4756 +vt 0.0606 0.7390 0.3031 +vt 0.0513 0.7390 0.3031 +vt 0.1248 0.7390 0.4772 +vt 0.0986 0.7390 0.4766 +vt 0.1164 0.7390 0.3038 +vt 0.1071 0.7390 0.3037 +vt 0.1802 0.7390 0.4784 +vt 0.1542 0.7390 0.4778 +vt 0.1718 0.7390 0.3046 +vt 0.1626 0.7390 0.3045 +vt 0.2354 0.7390 0.4790 +vt 0.2094 0.7390 0.4788 +vt 0.2270 0.7390 0.3051 +vt 0.2178 0.7390 0.3050 +vt 0.2906 0.7390 0.4788 +vt 0.2646 0.7390 0.4790 +vt 0.2822 0.7390 0.3050 +vt 0.2730 0.7390 0.3051 +vt 0.3458 0.7390 0.4778 +vt 0.3198 0.7390 0.4784 +vt 0.3374 0.7390 0.3045 +vt 0.3282 0.7390 0.3046 +vt 0.4014 0.7390 0.4766 +vt 0.3752 0.7390 0.4772 +vt 0.3929 0.7390 0.3037 +vt 0.3836 0.7390 0.3038 +vt 0.4572 0.7390 0.4756 +vt 0.4309 0.7390 0.4760 +vt 0.4487 0.7390 0.3031 +vt 0.4394 0.7390 0.3031 +vt 0.5132 0.7390 0.4754 +vt 0.4868 0.7390 0.4754 +vt 0.5047 0.7390 0.3028 +vt 0.4953 0.7390 0.3028 +vt 0.5691 0.7390 0.4760 +vt 0.5428 0.7390 0.4756 +vt 0.5606 0.7390 0.3031 +vt 0.5513 0.7390 0.3031 +vt 0.6248 0.7390 0.4772 +vt 0.5986 0.7390 0.4766 +vt 0.6164 0.7390 0.3038 +vt 0.6071 0.7390 0.3037 +vt 0.6802 0.7390 0.4784 +vt 0.6542 0.7390 0.4778 +vt 0.6718 0.7390 0.3046 +vt 0.6626 0.7390 0.3045 +vt 0.7354 0.7390 0.4790 +vt 0.7094 0.7390 0.4788 +vt 0.7270 0.7390 0.3051 +vt 0.7178 0.7390 0.3050 +vt 0.7727 0.8766 0.2167 +vt 0.7825 0.8766 0.2166 +vt 0.7776 0.8739 0.2545 +vt 0.8279 0.8766 0.2163 +vt 0.8377 0.8766 0.2162 +vt 0.8328 0.8739 0.2541 +vt 0.8834 0.8766 0.2158 +vt 0.8932 0.8766 0.2157 +vt 0.8883 0.8739 0.2534 +vt 0.9391 0.8766 0.2153 +vt 0.9490 0.8766 0.2152 +vt 0.9441 0.8739 0.2529 +vt 0.0050 0.8624 0.2151 +vt -0.0050 0.8766 0.2151 +vt 0.0050 0.8766 0.2151 +vt 1.0000 0.8739 0.2526 +vt 0.9950 0.8766 0.2151 +vt 1.0050 0.8766 0.2151 +vt 0.0510 0.8766 0.2152 +vt 0.0609 0.8766 0.2153 +vt 0.0559 0.8739 0.2529 +vt 0.1068 0.8766 0.2157 +vt 0.1166 0.8766 0.2158 +vt 0.1117 0.8739 0.2534 +vt 0.1623 0.8766 0.2162 +vt 0.1721 0.8766 0.2163 +vt 0.1672 0.8739 0.2541 +vt 0.2175 0.8766 0.2166 +vt 0.2273 0.8766 0.2167 +vt 0.2224 0.8739 0.2545 +vt 0.2727 0.8766 0.2167 +vt 0.2825 0.8766 0.2166 +vt 0.2776 0.8739 0.2545 +vt 0.3279 0.8766 0.2163 +vt 0.3377 0.8766 0.2162 +vt 0.3328 0.8739 0.2541 +vt 0.3834 0.8766 0.2158 +vt 0.3932 0.8766 0.2157 +vt 0.3883 0.8739 0.2534 +vt 0.4391 0.8766 0.2153 +vt 0.4490 0.8766 0.2152 +vt 0.4441 0.8739 0.2529 +vt 0.4950 0.8766 0.2151 +vt 0.5050 0.8766 0.2151 +vt 0.5000 0.8739 0.2526 +vt 0.5510 0.8766 0.2152 +vt 0.5609 0.8766 0.2153 +vt 0.5559 0.8739 0.2529 +vt 0.6068 0.8766 0.2157 +vt 0.6166 0.8766 0.2158 +vt 0.6117 0.8739 0.2534 +vt 0.6623 0.8766 0.2162 +vt 0.6721 0.8766 0.2163 +vt 0.6672 0.8739 0.2541 +vt 0.7175 0.8766 0.2166 +vt 0.7273 0.8766 0.2167 +vt 0.7224 0.8739 0.2545 +vt 0.7982 0.9841 1.0069 +vt 0.7569 0.9841 1.0076 +vt 0.7968 0.9403 0.8322 +vt 0.7584 0.9403 0.8327 +vt 0.8535 0.9841 1.0048 +vt 0.8121 0.9841 1.0065 +vt 0.8521 0.9403 0.8305 +vt 0.8136 0.9403 0.8318 +vt 0.9091 0.9841 1.0022 +vt 0.8675 0.9841 1.0041 +vt 0.9077 0.9403 0.8283 +vt 0.8690 0.9403 0.8298 +vt 0.9650 0.9841 1.0003 +vt 0.9232 0.9841 1.0016 +vt 0.9635 0.9403 0.8268 +vt 0.9246 0.9403 0.8277 +vt 1.0210 0.9841 1.0001 +vt 0.9790 0.9841 1.0001 +vt 0.0195 0.9403 0.8265 +vt 0.0210 0.9841 1.0001 +vt -0.0195 0.9403 0.8265 +vt 0.9805 0.9403 0.8265 +vt 0.0768 0.9841 1.0016 +vt 0.0350 0.9841 1.0003 +vt 0.0754 0.9403 0.8277 +vt 0.0365 0.9403 0.8268 +vt 0.1325 0.9841 1.0041 +vt 0.0909 0.9841 1.0022 +vt 0.1310 0.9403 0.8298 +vt 0.0923 0.9403 0.8283 +vt 0.1879 0.9841 1.0065 +vt 0.1465 0.9841 1.0048 +vt 0.1864 0.9403 0.8318 +vt 0.1479 0.9403 0.8305 +vt 0.2431 0.9841 1.0076 +vt 0.2018 0.9841 1.0069 +vt 0.2416 0.9403 0.8327 +vt 0.2032 0.9403 0.8322 +vt 0.2982 0.9841 1.0069 +vt 0.2569 0.9841 1.0076 +vt 0.2968 0.9403 0.8322 +vt 0.2584 0.9403 0.8327 +vt 0.3535 0.9841 1.0048 +vt 0.3121 0.9841 1.0065 +vt 0.3521 0.9403 0.8305 +vt 0.3136 0.9403 0.8318 +vt 0.4091 0.9841 1.0022 +vt 0.3675 0.9841 1.0041 +vt 0.4077 0.9403 0.8283 +vt 0.3690 0.9403 0.8298 +vt 0.4650 0.9841 1.0003 +vt 0.4232 0.9841 1.0016 +vt 0.4635 0.9403 0.8268 +vt 0.4246 0.9403 0.8277 +vt 0.5210 0.9841 1.0001 +vt 0.4790 0.9841 1.0001 +vt 0.5195 0.9403 0.8265 +vt 0.4805 0.9403 0.8265 +vt 0.5768 0.9841 1.0016 +vt 0.5350 0.9841 1.0003 +vt 0.5754 0.9403 0.8277 +vt 0.5365 0.9403 0.8268 +vt 0.6325 0.9841 1.0041 +vt 0.5909 0.9841 1.0022 +vt 0.6310 0.9403 0.8298 +vt 0.5923 0.9403 0.8283 +vt 0.6879 0.9841 1.0065 +vt 0.6465 0.9841 1.0048 +vt 0.6864 0.9403 0.8318 +vt 0.6479 0.9403 0.8305 +vt 0.7431 0.9841 1.0076 +vt 0.7018 0.9841 1.0069 +vt 0.7416 0.9403 0.8327 +vt 0.7032 0.9403 0.8322 +vt 0.7958 0.9196 0.7427 +vt 0.7594 0.9196 0.7431 +vt 0.7929 0.8915 0.5682 +vt 0.7623 0.8915 0.5684 +vt 0.8511 0.9196 0.7411 +vt 0.8146 0.9196 0.7422 +vt 0.8482 0.8915 0.5670 +vt 0.8175 0.8915 0.5677 +vt 0.9066 0.9196 0.7392 +vt 0.8700 0.9196 0.7405 +vt 0.9037 0.8915 0.5655 +vt 0.8729 0.8915 0.5664 +vt 0.9625 0.9196 0.7378 +vt 0.9257 0.9196 0.7386 +vt 0.9595 0.8915 0.5644 +vt 0.9286 0.8915 0.5650 +vt 1.0184 0.9196 0.7376 +vt 0.9816 0.9196 0.7376 +vt 0.0155 0.8915 0.5642 +vt 0.0184 0.9196 0.7376 +vt -0.0155 0.8915 0.5642 +vt 0.9845 0.8915 0.5642 +vt 0.0743 0.9196 0.7386 +vt 0.0375 0.9196 0.7378 +vt 0.0714 0.8915 0.5650 +vt 0.0405 0.8915 0.5644 +vt 0.1300 0.9196 0.7405 +vt 0.0934 0.9196 0.7392 +vt 0.1271 0.8915 0.5664 +vt 0.0963 0.8915 0.5655 +vt 0.1854 0.9196 0.7422 +vt 0.1489 0.9196 0.7411 +vt 0.1825 0.8915 0.5677 +vt 0.1518 0.8915 0.5670 +vt 0.2406 0.9196 0.7431 +vt 0.2042 0.9196 0.7427 +vt 0.2377 0.8915 0.5684 +vt 0.2071 0.8915 0.5682 +vt 0.2958 0.9196 0.7427 +vt 0.2594 0.9196 0.7431 +vt 0.2929 0.8915 0.5682 +vt 0.2623 0.8915 0.5684 +vt 0.3511 0.9196 0.7411 +vt 0.3146 0.9196 0.7422 +vt 0.3482 0.8915 0.5670 +vt 0.3175 0.8915 0.5677 +vt 0.4066 0.9196 0.7392 +vt 0.3700 0.9196 0.7405 +vt 0.4037 0.8915 0.5655 +vt 0.3729 0.8915 0.5664 +vt 0.4625 0.9196 0.7378 +vt 0.4257 0.9196 0.7386 +vt 0.4595 0.8915 0.5644 +vt 0.4286 0.8915 0.5650 +vt 0.5184 0.9196 0.7376 +vt 0.4816 0.9196 0.7376 +vt 0.5155 0.8915 0.5642 +vt 0.4845 0.8915 0.5642 +vt 0.5743 0.9196 0.7386 +vt 0.5375 0.9196 0.7378 +vt 0.5714 0.8915 0.5650 +vt 0.5405 0.8915 0.5644 +vt 0.6300 0.9196 0.7405 +vt 0.5934 0.9196 0.7392 +vt 0.6271 0.8915 0.5664 +vt 0.5963 0.8915 0.5655 +vt 0.6854 0.9196 0.7422 +vt 0.6489 0.9196 0.7411 +vt 0.6825 0.8915 0.5677 +vt 0.6518 0.8915 0.5670 +vt 0.7406 0.9196 0.7431 +vt 0.7042 0.9196 0.7427 +vt 0.7377 0.8915 0.5684 +vt 0.7071 0.8915 0.5682 +vt 0.7906 0.7530 0.4788 +vt 0.7646 0.7530 0.4790 +vt 0.7822 0.7530 0.3050 +vt 0.7730 0.7530 0.3051 +vt 0.8458 0.7530 0.4778 +vt 0.8198 0.7530 0.4784 +vt 0.8374 0.7530 0.3045 +vt 0.8282 0.7530 0.3046 +vt 0.9014 0.7530 0.4766 +vt 0.8752 0.7530 0.4772 +vt 0.8929 0.7530 0.3037 +vt 0.8836 0.7530 0.3038 +vt 0.9572 0.7530 0.4756 +vt 0.9309 0.7530 0.4760 +vt 0.9487 0.7530 0.3031 +vt 0.9394 0.7530 0.3031 +vt 1.0132 0.7530 0.4754 +vt 0.9868 0.7530 0.4754 +vt 0.0047 0.7530 0.3028 +vt 0.0132 0.7530 0.4754 +vt -0.0047 0.7530 0.3028 +vt 0.9953 0.7530 0.3028 +vt 0.0691 0.7530 0.4760 +vt 0.0428 0.7530 0.4756 +vt 0.0606 0.7530 0.3031 +vt 0.0513 0.7530 0.3031 +vt 0.1248 0.7530 0.4772 +vt 0.0986 0.7530 0.4766 +vt 0.1164 0.7530 0.3038 +vt 0.1071 0.7530 0.3037 +vt 0.1802 0.7530 0.4784 +vt 0.1542 0.7530 0.4778 +vt 0.1718 0.7530 0.3046 +vt 0.1626 0.7530 0.3045 +vt 0.2354 0.7530 0.4790 +vt 0.2094 0.7530 0.4788 +vt 0.2270 0.7530 0.3051 +vt 0.2178 0.7530 0.3050 +vt 0.2906 0.7530 0.4788 +vt 0.2646 0.7530 0.4790 +vt 0.2822 0.7530 0.3050 +vt 0.2730 0.7530 0.3051 +vt 0.3458 0.7530 0.4778 +vt 0.3198 0.7530 0.4784 +vt 0.3374 0.7530 0.3045 +vt 0.3282 0.7530 0.3046 +vt 0.4014 0.7530 0.4766 +vt 0.3752 0.7530 0.4772 +vt 0.3929 0.7530 0.3037 +vt 0.3836 0.7530 0.3038 +vt 0.4572 0.7530 0.4756 +vt 0.4309 0.7530 0.4760 +vt 0.4487 0.7530 0.3031 +vt 0.4394 0.7530 0.3031 +vt 0.5132 0.7530 0.4754 +vt 0.4868 0.7530 0.4754 +vt 0.5047 0.7530 0.3028 +vt 0.4953 0.7530 0.3028 +vt 0.5691 0.7530 0.4760 +vt 0.5428 0.7530 0.4756 +vt 0.5606 0.7530 0.3031 +vt 0.5513 0.7530 0.3031 +vt 0.6248 0.7530 0.4772 +vt 0.5986 0.7530 0.4766 +vt 0.6164 0.7530 0.3038 +vt 0.6071 0.7530 0.3037 +vt 0.6802 0.7530 0.4784 +vt 0.6542 0.7530 0.4778 +vt 0.6718 0.7530 0.3046 +vt 0.6626 0.7530 0.3045 +vt 0.7354 0.7530 0.4790 +vt 0.7094 0.7530 0.4788 +vt 0.7270 0.7530 0.3051 +vt 0.7178 0.7530 0.3050 +vt 0.7727 0.8914 0.2167 +vt 0.7825 0.8914 0.2166 +vt 0.7776 0.8886 0.2545 +vt 0.8279 0.8914 0.2163 +vt 0.8377 0.8914 0.2162 +vt 0.8328 0.8886 0.2541 +vt 0.8834 0.8914 0.2158 +vt 0.8932 0.8914 0.2157 +vt 0.8883 0.8886 0.2534 +vt 0.9391 0.8914 0.2153 +vt 0.9490 0.8914 0.2152 +vt 0.9441 0.8886 0.2529 +vt -0.0050 0.8914 0.2151 +vt 0.0050 0.8914 0.2151 +vt 1.0000 0.8886 0.2526 +vt 0.9950 0.8914 0.2151 +vt 1.0050 0.8914 0.2151 +vt 0.0510 0.8914 0.2152 +vt 0.0609 0.8914 0.2153 +vt 0.0559 0.8886 0.2529 +vt 0.1068 0.8914 0.2157 +vt 0.1166 0.8914 0.2158 +vt 0.1117 0.8886 0.2534 +vt 0.1623 0.8914 0.2162 +vt 0.1721 0.8914 0.2163 +vt 0.1672 0.8886 0.2541 +vt 0.2175 0.8914 0.2166 +vt 0.2273 0.8914 0.2167 +vt 0.2224 0.8886 0.2545 +vt 0.2727 0.8914 0.2167 +vt 0.2825 0.8914 0.2166 +vt 0.2776 0.8886 0.2545 +vt 0.3279 0.8914 0.2163 +vt 0.3377 0.8914 0.2162 +vt 0.3328 0.8886 0.2541 +vt 0.3834 0.8914 0.2158 +vt 0.3932 0.8914 0.2157 +vt 0.3883 0.8886 0.2534 +vt 0.4391 0.8914 0.2153 +vt 0.4490 0.8914 0.2152 +vt 0.4441 0.8886 0.2529 +vt 0.4950 0.8914 0.2151 +vt 0.5050 0.8914 0.2151 +vt 0.5000 0.8886 0.2526 +vt 0.5510 0.8914 0.2152 +vt 0.5609 0.8914 0.2153 +vt 0.5559 0.8886 0.2529 +vt 0.6068 0.8914 0.2157 +vt 0.6166 0.8914 0.2158 +vt 0.6117 0.8886 0.2534 +vt 0.6623 0.8914 0.2162 +vt 0.6721 0.8914 0.2163 +vt 0.6672 0.8886 0.2541 +vt 0.7175 0.8914 0.2166 +vt 0.7273 0.8914 0.2167 +vt 0.7224 0.8886 0.2545 +vt 0.0195 0.9556 0.8265 +vt 0.0210 0.9995 1.0001 +vt -0.0195 0.9556 0.8265 +vt 0.0155 0.9068 0.5642 +vt 0.0184 0.9349 0.7376 +vt -0.0155 0.9068 0.5642 +vt 0.0047 0.7680 0.3028 +vt 0.0132 0.7680 0.4754 +vt -0.0047 0.7680 0.3028 +vt 1.0000 0.9039 0.2526 +vt 0.9950 0.9066 0.2151 +vt 1.0050 0.9066 0.2151 +# 2151 texture coords + +g lotus_heart +s 8 +f 10401/5201/12769 10402/5202/12770 10403/5203/12771 10404/5204/12772 +f 10402/5202/12770 10405/5205/12773 10406/5206/12774 10403/5203/12771 +f 10405/5205/12773 10407/5207/12775 10408/5208/12776 10406/5206/12774 +f 10407/5207/12775 10409/5209/12777 10410/5210/12778 10408/5208/12776 +f 10409/5209/12777 10411/5211/12779 10412/5212/12780 10410/5210/12778 +f 10411/5213/12779 10413/5214/12781 10414/5215/12782 10412/5216/12780 +f 10413/5214/12781 10415/5217/12783 10416/5218/12784 10414/5215/12782 +f 10415/5217/12783 10417/5219/12785 10418/5220/12786 10416/5218/12784 +f 10417/5219/12785 10419/5221/12787 10420/5222/12788 10418/5220/12786 +f 10419/5221/12787 10421/5223/12789 10422/5224/12790 10420/5222/12788 +f 10421/5223/12789 10423/5225/12791 10424/5226/12792 10422/5224/12790 +f 10423/5225/12791 10425/5227/12793 10426/5228/12794 10424/5226/12792 +f 10425/5227/12793 10427/5229/12795 10428/5230/12796 10426/5228/12794 +f 10427/5229/12795 10429/5231/12797 10430/5232/12798 10428/5230/12796 +f 10429/5231/12797 10431/5233/12799 10432/5234/12800 10430/5232/12798 +f 10431/5233/12799 10433/5235/12801 10434/5236/12802 10432/5234/12800 +f 10433/5235/12801 10435/5237/12803 10436/5238/12804 10434/5236/12802 +f 10435/5237/12803 10401/5201/12769 10404/5204/12772 10436/5238/12804 +f 10404/5204/12772 10403/5203/12771 10437/5239/12805 10438/5240/12806 +f 10403/5203/12771 10406/5206/12774 10439/5241/12807 10437/5239/12805 +f 10406/5206/12774 10408/5208/12776 10440/5242/12808 10439/5241/12807 +f 10408/5208/12776 10410/5210/12778 10441/5243/12809 10440/5242/12808 +f 10410/5210/12778 10412/5212/12780 10442/5244/12810 10441/5243/12809 +f 10412/5216/12780 10414/5215/12782 10443/5245/12811 10442/5246/12810 +f 10414/5215/12782 10416/5218/12784 10444/5247/12812 10443/5245/12811 +f 10416/5218/12784 10418/5220/12786 10445/5248/12813 10444/5247/12812 +f 10418/5220/12786 10420/5222/12788 10446/5249/12814 10445/5248/12813 +f 10420/5222/12788 10422/5224/12790 10447/5250/12815 10446/5249/12814 +f 10422/5224/12790 10424/5226/12792 10448/5251/12816 10447/5250/12815 +f 10424/5226/12792 10426/5228/12794 10449/5252/12817 10448/5251/12816 +f 10426/5228/12794 10428/5230/12796 10450/5253/12818 10449/5252/12817 +f 10428/5230/12796 10430/5232/12798 10451/5254/12819 10450/5253/12818 +f 10430/5232/12798 10432/5234/12800 10452/5255/12820 10451/5254/12819 +f 10432/5234/12800 10434/5236/12802 10453/5256/12821 10452/5255/12820 +f 10434/5236/12802 10436/5238/12804 10454/5257/12822 10453/5256/12821 +f 10436/5238/12804 10404/5204/12772 10438/5240/12806 10454/5257/12822 +f 10438/5240/12806 10437/5239/12805 10455/5258/12823 10456/5259/12824 +f 10437/5239/12805 10439/5241/12807 10457/5260/12825 10455/5258/12823 +f 10439/5241/12807 10440/5242/12808 10458/5261/12826 10457/5260/12825 +f 10440/5242/12808 10441/5243/12809 10459/5262/12827 10458/5261/12826 +f 10441/5243/12809 10442/5244/12810 10460/5263/12828 10459/5262/12827 +f 10442/5246/12810 10443/5245/12811 10461/5264/12829 10460/5265/12828 +f 10443/5245/12811 10444/5247/12812 10462/5266/12830 10461/5264/12829 +f 10444/5247/12812 10445/5248/12813 10463/5267/12831 10462/5266/12830 +f 10445/5248/12813 10446/5249/12814 10464/5268/12832 10463/5267/12831 +f 10446/5249/12814 10447/5250/12815 10465/5269/12833 10464/5268/12832 +f 10447/5250/12815 10448/5251/12816 10466/5270/12834 10465/5269/12833 +f 10448/5251/12816 10449/5252/12817 10467/5271/12835 10466/5270/12834 +f 10449/5252/12817 10450/5253/12818 10468/5272/12836 10467/5271/12835 +f 10450/5253/12818 10451/5254/12819 10469/5273/12837 10468/5272/12836 +f 10451/5254/12819 10452/5255/12820 10470/5274/12838 10469/5273/12837 +f 10452/5255/12820 10453/5256/12821 10471/5275/12839 10470/5274/12838 +f 10453/5256/12821 10454/5257/12822 10472/5276/12840 10471/5275/12839 +f 10454/5257/12822 10438/5240/12806 10456/5259/12824 10472/5276/12840 +s 1 +f 10402/5202/12841 10401/5201/12842 10473/5277/12843 10474/5278/12844 +f 10405/5205/12845 10402/5202/12841 10474/5278/12844 10475/5279/12846 +f 10407/5207/12847 10405/5205/12845 10475/5279/12846 10476/5280/12848 +f 10409/5209/12849 10407/5207/12847 10476/5280/12848 10477/5281/12850 +f 10411/5213/12851 10409/5282/12849 10477/5283/12850 10478/5284/12852 +f 10413/5214/12853 10411/5213/12851 10478/5284/12852 10479/5285/12854 +f 10415/5217/12855 10413/5214/12853 10479/5285/12854 10480/5286/12856 +f 10417/5219/12857 10415/5217/12855 10480/5286/12856 10481/5287/12858 +f 10419/5221/12859 10417/5219/12857 10481/5287/12858 10482/5288/12860 +f 10421/5223/12861 10419/5221/12859 10482/5288/12860 10483/5289/12862 +f 10423/5225/12863 10421/5223/12861 10483/5289/12862 10484/5290/12864 +f 10425/5227/12865 10423/5225/12863 10484/5290/12864 10485/5291/12866 +f 10427/5229/12867 10425/5227/12865 10485/5291/12866 10486/5292/12868 +f 10429/5231/12869 10427/5229/12867 10486/5292/12868 10487/5293/12870 +f 10431/5233/12871 10429/5231/12869 10487/5293/12870 10488/5294/12872 +f 10433/5235/12873 10431/5233/12871 10488/5294/12872 10489/5295/12874 +f 10435/5237/12875 10433/5235/12873 10489/5295/12874 10490/5296/12876 +f 10401/5201/12842 10435/5237/12875 10490/5296/12876 10473/5277/12843 +f 10474/5278/12844 10473/5277/12843 10491/5297/12877 10492/5298/12878 +f 10475/5279/12846 10474/5278/12844 10492/5298/12878 10493/5299/12879 +f 10476/5280/12848 10475/5279/12846 10493/5299/12879 10494/5300/12880 +f 10477/5281/12850 10476/5280/12848 10494/5300/12880 10495/5301/12881 +f 10478/5284/12852 10477/5283/12850 10495/5302/12881 10496/5303/12882 +f 10479/5285/12854 10478/5284/12852 10496/5303/12882 10497/5304/12883 +f 10480/5286/12856 10479/5285/12854 10497/5304/12883 10498/5305/12884 +f 10481/5287/12858 10480/5286/12856 10498/5305/12884 10499/5306/12885 +f 10482/5288/12860 10481/5287/12858 10499/5306/12885 10500/5307/12886 +f 10483/5289/12862 10482/5288/12860 10500/5307/12886 10501/5308/12887 +f 10484/5290/12864 10483/5289/12862 10501/5308/12887 10502/5309/12888 +f 10485/5291/12866 10484/5290/12864 10502/5309/12888 10503/5310/12889 +f 10486/5292/12868 10485/5291/12866 10503/5310/12889 10504/5311/12890 +f 10487/5293/12870 10486/5292/12868 10504/5311/12890 10505/5312/12891 +f 10488/5294/12872 10487/5293/12870 10505/5312/12891 10506/5313/12892 +f 10489/5295/12874 10488/5294/12872 10506/5313/12892 10507/5314/12893 +f 10490/5296/12876 10489/5295/12874 10507/5314/12893 10508/5315/12894 +f 10473/5277/12843 10490/5296/12876 10508/5315/12894 10491/5297/12877 +f 10492/5298/12878 10491/5297/12877 10509/5316/12895 10510/5317/12896 +f 10493/5299/12879 10492/5298/12878 10510/5317/12896 10511/5318/12897 +f 10494/5300/12880 10493/5299/12879 10511/5318/12897 10512/5319/12898 +f 10495/5301/12881 10494/5300/12880 10512/5319/12898 10513/5320/12899 +f 10496/5303/12882 10495/5302/12881 10513/5321/12899 10514/5322/12900 +f 10497/5304/12883 10496/5303/12882 10514/5322/12900 10515/5323/12901 +f 10498/5305/12884 10497/5304/12883 10515/5323/12901 10516/5324/12902 +f 10499/5306/12885 10498/5305/12884 10516/5324/12902 10517/5325/12903 +f 10500/5307/12886 10499/5306/12885 10517/5325/12903 10518/5326/12904 +f 10501/5308/12887 10500/5307/12886 10518/5326/12904 10519/5327/12905 +f 10502/5309/12888 10501/5308/12887 10519/5327/12905 10520/5328/12906 +f 10503/5310/12889 10502/5309/12888 10520/5328/12906 10521/5329/12907 +f 10504/5311/12890 10503/5310/12889 10521/5329/12907 10522/5330/12908 +f 10505/5312/12891 10504/5311/12890 10522/5330/12908 10523/5331/12909 +f 10506/5313/12892 10505/5312/12891 10523/5331/12909 10524/5332/12910 +f 10507/5314/12893 10506/5313/12892 10524/5332/12910 10525/5333/12911 +f 10508/5315/12894 10507/5314/12893 10525/5333/12911 10526/5334/12912 +f 10491/5297/12877 10508/5315/12894 10526/5334/12912 10509/5316/12895 +f 10510/5317/12896 10509/5316/12895 10527/5335/12913 +f 10511/5318/12897 10510/5317/12896 10527/5335/12913 +f 10512/5319/12898 10511/5318/12897 10527/5335/12913 +f 10513/5320/12899 10512/5319/12898 10527/5335/12913 +f 10514/5336/12900 10513/5321/12899 10527/5337/12913 +f 10515/5323/12901 10514/5322/12900 10527/5335/12913 +f 10516/5324/12902 10515/5323/12901 10527/5335/12913 +f 10517/5325/12903 10516/5324/12902 10527/5335/12913 +f 10518/5326/12904 10517/5325/12903 10527/5335/12913 +f 10519/5327/12905 10518/5326/12904 10527/5335/12913 +f 10520/5328/12906 10519/5327/12905 10527/5335/12913 +f 10521/5329/12907 10520/5328/12906 10527/5335/12913 +f 10522/5330/12908 10521/5329/12907 10527/5335/12913 +f 10523/5331/12909 10522/5330/12908 10527/5335/12913 +f 10524/5332/12910 10523/5331/12909 10527/5335/12913 +f 10525/5333/12911 10524/5332/12910 10527/5335/12913 +f 10526/5334/12912 10525/5333/12911 10527/5335/12913 +f 10509/5316/12895 10526/5334/12912 10527/5335/12913 +f 10528/5338/12914 10529/5339/12915 10530/5340/12916 10531/5341/12917 +f 10532/5342/12918 10533/5343/12919 10534/5344/12920 10535/5345/12921 +f 10536/5346/12922 10537/5347/12923 10538/5348/12924 10539/5349/12925 +f 10540/5350/12926 10541/5351/12927 10542/5352/12928 10543/5353/12929 +f 10544/5354/12930 10545/5355/12931 10546/5356/12932 10547/5357/12933 +f 10548/5358/12934 10549/5359/12935 10550/5360/12936 10551/5361/12937 +f 10552/5362/12938 10553/5363/12939 10554/5364/12940 10555/5365/12941 +f 10556/5366/12942 10557/5367/12943 10558/5368/12944 10559/5369/12945 +f 10560/5370/12946 10561/5371/12947 10562/5372/12948 10563/5373/12949 +f 10564/5374/12950 10565/5375/12951 10566/5376/12952 10567/5377/12953 +f 10568/5378/12954 10569/5379/12955 10570/5380/12956 10571/5381/12957 +f 10572/5382/12958 10573/5383/12959 10574/5384/12960 10575/5385/12961 +f 10576/5386/12962 10577/5387/12963 10578/5388/12964 10579/5389/12965 +f 10580/5390/12966 10581/5391/12967 10582/5392/12968 10583/5393/12969 +f 10584/5394/12970 10585/5395/12971 10586/5396/12972 10587/5397/12973 +f 10588/5398/12974 10589/5399/12975 10590/5400/12976 10591/5401/12977 +f 10592/5402/12978 10593/5403/12979 10594/5404/12980 10595/5405/12981 +f 10596/5406/12982 10597/5407/12983 10598/5408/12984 10599/5409/12985 +f 10600/5410/12986 10601/5411/12987 10602/5412/12988 10603/5413/12989 +f 10604/5414/12990 10605/5415/12991 10606/5416/12992 10607/5417/12993 +f 10608/5418/12994 10609/5419/12995 10610/5420/12996 10611/5421/12997 +f 10612/5422/12998 10613/5423/12999 10614/5424/13000 10615/5425/13001 +f 10616/5426/13002 10617/5427/13003 10618/5428/13004 10619/5429/13005 +f 10620/5430/13006 10621/5431/13007 10622/5432/13008 10623/5433/13009 +f 10624/5434/13010 10625/5435/13011 10626/5436/13012 10627/5437/13013 +f 10628/5438/13014 10629/5439/13015 10630/5440/13016 10631/5441/13017 +f 10632/5442/13018 10633/5443/13019 10634/5444/13020 10635/5445/13021 +f 10636/5446/13022 10637/5447/13023 10638/5448/13024 10639/5449/13025 +f 10640/5450/13026 10641/5451/13027 10642/5452/13028 10643/5453/13029 +f 10644/5454/13030 10645/5455/13031 10646/5456/13032 10647/5457/13033 +f 10648/5458/13034 10649/5459/13035 10650/5460/13036 10651/5461/13037 +f 10652/5462/13038 10653/5463/13039 10654/5464/13040 10655/5465/13041 +f 10656/5466/13042 10657/5467/13043 10658/5468/13044 10659/5469/13045 +f 10660/5470/13046 10661/5471/13047 10662/5472/13048 10663/5473/13049 +f 10664/5474/13050 10665/5475/13051 10666/5476/13052 10667/5477/13053 +f 10668/5478/13054 10669/5479/13055 10670/5480/13056 10671/5481/13057 +f 10672/5482/13058 10673/5483/13059 10674/5484/13060 10675/5485/13061 +f 10676/5486/13062 10677/5487/13063 10678/5488/13064 10679/5489/13065 +f 10680/5490/13066 10681/5491/13067 10682/5492/13068 10683/5493/13069 +f 10684/5494/13070 10685/5495/13071 10686/5496/13072 10687/5497/13073 +f 10688/5498/13074 10689/5499/13075 10690/5500/13076 10691/5501/13077 +f 10692/5502/13078 10693/5503/13079 10694/5504/13080 10695/5505/13081 +f 10696/5506/13082 10697/5507/13083 10698/5508/13084 10699/5509/13085 +f 10700/5510/13086 10701/5511/13087 10702/5512/13088 10703/5513/13089 +f 10704/5514/13090 10705/5515/13091 10706/5516/13092 10707/5517/13093 +f 10708/5518/13094 10709/5519/13095 10710/5520/13096 10711/5521/13097 +f 10712/5522/13098 10713/5523/13099 10714/5524/13100 10715/5525/13101 +f 10716/5526/13102 10717/5527/13103 10718/5528/13104 10719/5529/13105 +f 10720/5530/13106 10721/5531/13107 10722/5532/13108 10723/5533/13109 +f 10724/5534/13110 10725/5535/13111 10726/5536/13112 10727/5537/13113 +f 10728/5538/13114 10729/5539/13115 10730/5540/13116 10731/5541/13117 +f 10732/5542/13118 10733/5543/13119 10734/5544/13120 10735/5545/13121 +f 10736/5546/13122 10737/5547/13123 10738/5548/13124 10739/5549/13125 +f 10740/5550/13126 10741/5551/13127 10742/5552/13128 10743/5553/13129 +f 10744/5554/13130 10745/5555/13130 10746/5556/13130 +f 10747/5557/13131 10748/5558/13131 10749/5559/13131 +f 10750/5560/13132 10751/5561/13132 10752/5562/13132 +f 10753/5563/13133 10754/5564/13133 10755/5565/13133 +f 10756/5566/13134 10757/5567/13134 10758/5568/13134 +f 10759/5569/13135 10760/5570/13135 10761/5571/13135 +f 10762/5572/13136 10763/5573/13136 10764/5574/13136 +f 10765/5575/13137 10766/5576/13137 10767/5577/13137 +f 10768/5578/13138 10769/5579/13138 10770/5580/13138 +f 10771/5581/13139 10772/5582/13139 10773/5583/13139 +f 10774/5584/13140 10775/5585/13140 10776/5586/13140 +f 10777/5587/13141 10778/5588/13141 10779/5589/13141 +f 10780/5590/13142 10781/5591/13142 10782/5592/13142 +f 10783/5593/13143 10784/5594/13143 10785/5595/13143 +f 10786/5596/13144 10787/5597/13144 10788/5598/13144 +f 10789/5599/13145 10790/5600/13145 10791/5601/13145 +f 10792/5602/13146 10793/5603/13146 10794/5604/13146 +f 10795/5605/13147 10796/5606/13147 10797/5607/13147 +s off +f 10456/5259/13148 10455/5258/13148 10798/5608/13148 10799/5609/13148 +f 10455/5258/13149 10800/5610/13149 10801/5611/13149 10798/5608/13149 +f 10800/5610/13150 10802/5612/13150 10803/5613/13150 10801/5611/13150 +f 10802/5612/13151 10456/5259/13151 10799/5609/13151 10803/5613/13151 +f 10455/5258/13152 10457/5260/13152 10804/5614/13152 10805/5615/13152 +f 10457/5260/13153 10806/5616/13153 10807/5617/13153 10804/5614/13153 +f 10806/5616/13154 10800/5610/13154 10808/5618/13154 10807/5617/13154 +f 10800/5610/13155 10455/5258/13155 10805/5615/13155 10808/5618/13155 +f 10457/5260/13156 10458/5261/13156 10809/5619/13156 10810/5620/13156 +f 10458/5261/13157 10811/5621/13157 10812/5622/13157 10809/5619/13157 +f 10811/5621/13158 10806/5616/13158 10813/5623/13158 10812/5622/13158 +f 10806/5616/13159 10457/5260/13159 10810/5620/13159 10813/5623/13159 +f 10458/5261/13160 10459/5262/13160 10814/5624/13160 10815/5625/13160 +f 10459/5262/13161 10816/5626/13161 10817/5627/13161 10814/5624/13161 +f 10816/5626/13162 10811/5621/13162 10818/5628/13162 10817/5627/13162 +f 10811/5621/13163 10458/5261/13163 10815/5625/13163 10818/5628/13163 +f 10459/5262/13164 10460/5263/13164 10819/5629/13164 10820/5630/13164 +f 10460/5265/13165 10821/5631/13165 10822/5632/13165 10819/5633/13165 +f 10821/5631/13166 10816/5634/13166 10823/5635/13166 10822/5632/13166 +f 10816/5626/13167 10459/5262/13167 10820/5630/13167 10823/5636/13167 +f 10460/5265/13168 10461/5264/13168 10824/5637/13168 10825/5638/13168 +f 10461/5264/13169 10826/5639/13169 10827/5640/13169 10824/5637/13169 +f 10826/5639/13170 10821/5631/13170 10828/5641/13170 10827/5640/13170 +f 10821/5631/13171 10460/5265/13171 10825/5638/13171 10828/5641/13171 +f 10461/5264/13172 10462/5266/13172 10829/5642/13172 10830/5643/13172 +f 10462/5266/13173 10831/5644/13173 10832/5645/13173 10829/5642/13173 +f 10831/5644/13174 10826/5639/13174 10833/5646/13174 10832/5645/13174 +f 10826/5639/13175 10461/5264/13175 10830/5643/13175 10833/5646/13175 +f 10462/5266/13176 10463/5267/13176 10834/5647/13176 10835/5648/13176 +f 10463/5267/13177 10836/5649/13177 10837/5650/13177 10834/5647/13177 +f 10836/5649/13178 10831/5644/13178 10838/5651/13178 10837/5650/13178 +f 10831/5644/13179 10462/5266/13179 10835/5648/13179 10838/5651/13179 +f 10463/5267/13180 10464/5268/13180 10839/5652/13180 10840/5653/13180 +f 10464/5268/13181 10841/5654/13181 10842/5655/13181 10839/5652/13181 +f 10841/5654/13182 10836/5649/13182 10843/5656/13182 10842/5655/13182 +f 10836/5649/13183 10463/5267/13183 10840/5653/13183 10843/5656/13183 +f 10464/5268/13184 10465/5269/13184 10844/5657/13184 10845/5658/13184 +f 10465/5269/13185 10846/5659/13185 10847/5660/13185 10844/5657/13185 +f 10846/5659/13186 10841/5654/13186 10848/5661/13186 10847/5660/13186 +f 10841/5654/13187 10464/5268/13187 10845/5658/13187 10848/5661/13187 +f 10465/5269/13188 10466/5270/13188 10849/5662/13188 10850/5663/13188 +f 10466/5270/13189 10851/5664/13189 10852/5665/13189 10849/5662/13189 +f 10851/5664/13190 10846/5659/13190 10853/5666/13190 10852/5665/13190 +f 10846/5659/13191 10465/5269/13191 10850/5663/13191 10853/5666/13191 +f 10466/5270/13192 10467/5271/13192 10854/5667/13192 10855/5668/13192 +f 10467/5271/13193 10856/5669/13193 10857/5670/13193 10854/5667/13193 +f 10856/5669/13194 10851/5664/13194 10858/5671/13194 10857/5670/13194 +f 10851/5664/13195 10466/5270/13195 10855/5668/13195 10858/5671/13195 +f 10467/5271/13196 10468/5272/13196 10859/5672/13196 10860/5673/13196 +f 10468/5272/13197 10861/5674/13197 10862/5675/13197 10859/5672/13197 +f 10861/5674/13198 10856/5669/13198 10863/5676/13198 10862/5675/13198 +f 10856/5669/13199 10467/5271/13199 10860/5673/13199 10863/5676/13199 +f 10468/5272/13200 10469/5273/13200 10864/5677/13200 10865/5678/13200 +f 10469/5273/13201 10866/5679/13201 10867/5680/13201 10864/5677/13201 +f 10866/5679/13202 10861/5674/13202 10868/5681/13202 10867/5680/13202 +f 10861/5674/13203 10468/5272/13203 10865/5678/13203 10868/5681/13203 +f 10469/5273/13204 10470/5274/13204 10869/5682/13204 10870/5683/13204 +f 10470/5274/13205 10871/5684/13205 10872/5685/13205 10869/5682/13205 +f 10871/5684/13206 10866/5679/13206 10873/5686/13206 10872/5685/13206 +f 10866/5679/13207 10469/5273/13207 10870/5683/13207 10873/5686/13207 +f 10470/5274/13208 10471/5275/13208 10874/5687/13208 10875/5688/13208 +f 10471/5275/13209 10876/5689/13209 10877/5690/13209 10874/5687/13209 +f 10876/5689/13210 10871/5684/13210 10878/5691/13210 10877/5690/13210 +f 10871/5684/13211 10470/5274/13211 10875/5688/13211 10878/5691/13211 +f 10471/5275/13212 10472/5276/13212 10879/5692/13212 10880/5693/13212 +f 10472/5276/13213 10881/5694/13213 10882/5695/13213 10879/5692/13213 +f 10881/5694/13214 10876/5689/13214 10883/5696/13214 10882/5695/13214 +f 10876/5689/13215 10471/5275/13215 10880/5693/13215 10883/5696/13215 +f 10472/5276/13216 10456/5259/13216 10884/5697/13216 10885/5698/13216 +f 10456/5259/13217 10802/5612/13217 10886/5699/13217 10884/5697/13217 +f 10802/5612/13218 10881/5694/13218 10887/5700/13218 10886/5699/13218 +f 10881/5694/13219 10472/5276/13219 10885/5698/13219 10887/5700/13219 +f 10802/5612/13220 10800/5610/13220 10888/5701/13220 10889/5702/13220 +f 10800/5610/13221 10890/5703/13221 10891/5704/13221 10888/5701/13221 +f 10890/5703/13222 10892/5705/13222 10893/5706/13222 10891/5704/13222 +f 10892/5705/13223 10802/5612/13223 10889/5702/13223 10893/5706/13223 +f 10800/5610/13224 10806/5616/13224 10894/5707/13224 10895/5708/13224 +f 10806/5616/13225 10896/5709/13225 10897/5710/13225 10894/5707/13225 +f 10896/5709/13226 10890/5703/13226 10898/5711/13226 10897/5710/13226 +f 10890/5703/13227 10800/5610/13227 10895/5708/13227 10898/5711/13227 +f 10806/5616/13228 10811/5621/13228 10899/5712/13228 10900/5713/13228 +f 10811/5621/13229 10901/5714/13229 10902/5715/13229 10899/5712/13229 +f 10901/5714/13230 10896/5709/13230 10903/5716/13230 10902/5715/13230 +f 10896/5709/13231 10806/5616/13231 10900/5713/13231 10903/5716/13231 +f 10811/5621/13232 10816/5626/13232 10904/5717/13232 10905/5718/13232 +f 10816/5626/13233 10906/5719/13233 10907/5720/13233 10904/5717/13233 +f 10906/5719/13234 10901/5714/13234 10908/5721/13234 10907/5720/13234 +f 10901/5714/13235 10811/5621/13235 10905/5718/13235 10908/5721/13235 +f 10816/5626/13236 10821/5722/13236 10909/5723/13236 10910/5724/13236 +f 10821/5631/13237 10911/5725/13237 10912/5726/13237 10909/5727/13237 +f 10911/5725/13238 10906/5728/13238 10913/5729/13238 10912/5726/13238 +f 10906/5719/13239 10816/5626/13239 10910/5724/13239 10913/5730/13239 +f 10821/5631/13240 10826/5639/13240 10914/5731/13240 10915/5732/13240 +f 10826/5639/13241 10916/5733/13241 10917/5734/13241 10914/5731/13241 +f 10916/5733/13242 10911/5725/13242 10918/5735/13242 10917/5734/13242 +f 10911/5725/13243 10821/5631/13243 10915/5732/13243 10918/5735/13243 +f 10826/5639/13244 10831/5644/13244 10919/5736/13244 10920/5737/13244 +f 10831/5644/13245 10921/5738/13245 10922/5739/13245 10919/5736/13245 +f 10921/5738/13246 10916/5733/13246 10923/5740/13246 10922/5739/13246 +f 10916/5733/13247 10826/5639/13247 10920/5737/13247 10923/5740/13247 +f 10831/5644/13248 10836/5649/13248 10924/5741/13248 10925/5742/13248 +f 10836/5649/13249 10926/5743/13249 10927/5744/13249 10924/5741/13249 +f 10926/5743/13250 10921/5738/13250 10928/5745/13250 10927/5744/13250 +f 10921/5738/13251 10831/5644/13251 10925/5742/13251 10928/5745/13251 +f 10836/5649/13252 10841/5654/13252 10929/5746/13252 10930/5747/13252 +f 10841/5654/13253 10931/5748/13253 10932/5749/13253 10929/5746/13253 +f 10931/5748/13254 10926/5743/13254 10933/5750/13254 10932/5749/13254 +f 10926/5743/13255 10836/5649/13255 10930/5747/13255 10933/5750/13255 +f 10841/5654/13256 10846/5659/13256 10934/5751/13256 10935/5752/13256 +f 10846/5659/13257 10936/5753/13257 10937/5754/13257 10934/5751/13257 +f 10936/5753/13258 10931/5748/13258 10938/5755/13258 10937/5754/13258 +f 10931/5748/13259 10841/5654/13259 10935/5752/13259 10938/5755/13259 +f 10846/5659/13260 10851/5664/13260 10939/5756/13260 10940/5757/13260 +f 10851/5664/13261 10941/5758/13261 10942/5759/13261 10939/5756/13261 +f 10941/5758/13262 10936/5753/13262 10943/5760/13262 10942/5759/13262 +f 10936/5753/13263 10846/5659/13263 10940/5757/13263 10943/5760/13263 +f 10851/5664/13264 10856/5669/13264 10944/5761/13264 10945/5762/13264 +f 10856/5669/13265 10946/5763/13265 10947/5764/13265 10944/5761/13265 +f 10946/5763/13266 10941/5758/13266 10948/5765/13266 10947/5764/13266 +f 10941/5758/13267 10851/5664/13267 10945/5762/13267 10948/5765/13267 +f 10856/5669/13268 10861/5674/13268 10949/5766/13268 10950/5767/13268 +f 10861/5674/13269 10951/5768/13269 10952/5769/13269 10949/5766/13269 +f 10951/5768/13270 10946/5763/13270 10953/5770/13270 10952/5769/13270 +f 10946/5763/13271 10856/5669/13271 10950/5767/13271 10953/5770/13271 +f 10861/5674/13272 10866/5679/13272 10954/5771/13272 10955/5772/13272 +f 10866/5679/13273 10956/5773/13273 10957/5774/13273 10954/5771/13273 +f 10956/5773/13274 10951/5768/13274 10958/5775/13274 10957/5774/13274 +f 10951/5768/13275 10861/5674/13275 10955/5772/13275 10958/5775/13275 +f 10866/5679/13276 10871/5684/13276 10959/5776/13276 10960/5777/13276 +f 10871/5684/13277 10961/5778/13277 10962/5779/13277 10959/5776/13277 +f 10961/5778/13278 10956/5773/13278 10963/5780/13278 10962/5779/13278 +f 10956/5773/13279 10866/5679/13279 10960/5777/13279 10963/5780/13279 +f 10871/5684/13280 10876/5689/13280 10964/5781/13280 10965/5782/13280 +f 10876/5689/13281 10966/5783/13281 10967/5784/13281 10964/5781/13281 +f 10966/5783/13282 10961/5778/13282 10968/5785/13282 10967/5784/13282 +f 10961/5778/13283 10871/5684/13283 10965/5782/13283 10968/5785/13283 +f 10876/5689/13284 10881/5694/13284 10969/5786/13284 10970/5787/13284 +f 10881/5694/13285 10971/5788/13285 10972/5789/13285 10969/5786/13285 +f 10971/5788/13286 10966/5783/13286 10973/5790/13286 10972/5789/13286 +f 10966/5783/13287 10876/5689/13287 10970/5787/13287 10973/5790/13287 +f 10881/5694/13288 10802/5612/13288 10974/5791/13288 10975/5792/13288 +f 10802/5612/13289 10892/5705/13289 10976/5793/13289 10974/5791/13289 +f 10892/5705/13290 10971/5788/13290 10977/5794/13290 10976/5793/13290 +f 10971/5788/13291 10881/5694/13291 10975/5792/13291 10977/5794/13291 +f 10892/5705/13292 10890/5703/13292 10978/5795/13292 10979/5796/13292 +f 10890/5703/13293 10980/5797/13293 10981/5798/13293 10978/5795/13293 +f 10980/5797/13294 10982/5799/13294 10983/5800/13294 10981/5798/13294 +f 10982/5799/13295 10892/5705/13295 10979/5796/13295 10983/5800/13295 +f 10890/5703/13296 10896/5709/13296 10984/5801/13296 10985/5802/13296 +f 10896/5709/13297 10986/5803/13297 10987/5804/13297 10984/5801/13297 +f 10986/5803/13298 10980/5797/13298 10988/5805/13298 10987/5804/13298 +f 10980/5797/13299 10890/5703/13299 10985/5802/13299 10988/5805/13299 +f 10896/5709/13300 10901/5714/13300 10989/5806/13300 10990/5807/13300 +f 10901/5714/13301 10991/5808/13301 10992/5809/13301 10989/5806/13301 +f 10991/5808/13302 10986/5803/13302 10993/5810/13302 10992/5809/13302 +f 10986/5803/13303 10896/5709/13303 10990/5807/13303 10993/5810/13303 +f 10901/5714/13304 10906/5719/13304 10994/5811/13304 10995/5812/13304 +f 10906/5719/13305 10996/5813/13305 10997/5814/13305 10994/5811/13305 +f 10996/5813/13306 10991/5808/13306 10998/5815/13306 10997/5814/13306 +f 10991/5808/13307 10901/5714/13307 10995/5812/13307 10998/5815/13307 +f 10906/5719/13308 10911/5816/13308 10999/5817/13308 11000/5818/13308 +f 10911/5725/13309 11001/5819/13309 11002/5820/13309 10999/5821/13309 +f 11001/5819/13310 10996/5822/13310 11003/5823/13310 11002/5820/13310 +f 10996/5813/13311 10906/5719/13311 11000/5818/13311 11003/5824/13311 +f 10911/5725/13312 10916/5733/13312 11004/5825/13312 11005/5826/13312 +f 10916/5733/13313 11006/5827/13313 11007/5828/13313 11004/5825/13313 +f 11006/5827/13314 11001/5819/13314 11008/5829/13314 11007/5828/13314 +f 11001/5819/13315 10911/5725/13315 11005/5826/13315 11008/5829/13315 +f 10916/5733/13316 10921/5738/13316 11009/5830/13316 11010/5831/13316 +f 10921/5738/13317 11011/5832/13317 11012/5833/13317 11009/5830/13317 +f 11011/5832/13318 11006/5827/13318 11013/5834/13318 11012/5833/13318 +f 11006/5827/13319 10916/5733/13319 11010/5831/13319 11013/5834/13319 +f 10921/5738/13320 10926/5743/13320 11014/5835/13320 11015/5836/13320 +f 10926/5743/13321 11016/5837/13321 11017/5838/13321 11014/5835/13321 +f 11016/5837/13322 11011/5832/13322 11018/5839/13322 11017/5838/13322 +f 11011/5832/13323 10921/5738/13323 11015/5836/13323 11018/5839/13323 +f 10926/5743/13324 10931/5748/13324 11019/5840/13324 11020/5841/13324 +f 10931/5748/13325 11021/5842/13325 11022/5843/13325 11019/5840/13325 +f 11021/5842/13326 11016/5837/13326 11023/5844/13326 11022/5843/13326 +f 11016/5837/13327 10926/5743/13327 11020/5841/13327 11023/5844/13327 +f 10931/5748/13328 10936/5753/13328 11024/5845/13328 11025/5846/13328 +f 10936/5753/13329 11026/5847/13329 11027/5848/13329 11024/5845/13329 +f 11026/5847/13330 11021/5842/13330 11028/5849/13330 11027/5848/13330 +f 11021/5842/13331 10931/5748/13331 11025/5846/13331 11028/5849/13331 +f 10936/5753/13332 10941/5758/13332 11029/5850/13332 11030/5851/13332 +f 10941/5758/13333 11031/5852/13333 11032/5853/13333 11029/5850/13333 +f 11031/5852/13334 11026/5847/13334 11033/5854/13334 11032/5853/13334 +f 11026/5847/13335 10936/5753/13335 11030/5851/13335 11033/5854/13335 +f 10941/5758/13336 10946/5763/13336 11034/5855/13336 11035/5856/13336 +f 10946/5763/13337 11036/5857/13337 11037/5858/13337 11034/5855/13337 +f 11036/5857/13338 11031/5852/13338 11038/5859/13338 11037/5858/13338 +f 11031/5852/13339 10941/5758/13339 11035/5856/13339 11038/5859/13339 +f 10946/5763/13340 10951/5768/13340 11039/5860/13340 11040/5861/13340 +f 10951/5768/13341 11041/5862/13341 11042/5863/13341 11039/5860/13341 +f 11041/5862/13342 11036/5857/13342 11043/5864/13342 11042/5863/13342 +f 11036/5857/13343 10946/5763/13343 11040/5861/13343 11043/5864/13343 +f 10951/5768/13344 10956/5773/13344 11044/5865/13344 11045/5866/13344 +f 10956/5773/13345 11046/5867/13345 11047/5868/13345 11044/5865/13345 +f 11046/5867/13346 11041/5862/13346 11048/5869/13346 11047/5868/13346 +f 11041/5862/13347 10951/5768/13347 11045/5866/13347 11048/5869/13347 +f 10956/5773/13348 10961/5778/13348 11049/5870/13348 11050/5871/13348 +f 10961/5778/13349 11051/5872/13349 11052/5873/13349 11049/5870/13349 +f 11051/5872/13350 11046/5867/13350 11053/5874/13350 11052/5873/13350 +f 11046/5867/13351 10956/5773/13351 11050/5871/13351 11053/5874/13351 +f 10961/5778/13352 10966/5783/13352 11054/5875/13352 11055/5876/13352 +f 10966/5783/13353 11056/5877/13353 11057/5878/13353 11054/5875/13353 +f 11056/5877/13354 11051/5872/13354 11058/5879/13354 11057/5878/13354 +f 11051/5872/13355 10961/5778/13355 11055/5876/13355 11058/5879/13355 +f 10966/5783/13356 10971/5788/13356 11059/5880/13356 11060/5881/13356 +f 10971/5788/13357 11061/5882/13357 11062/5883/13357 11059/5880/13357 +f 11061/5882/13358 11056/5877/13358 11063/5884/13358 11062/5883/13358 +f 11056/5877/13359 10966/5783/13359 11060/5881/13359 11063/5884/13359 +f 10971/5788/13360 10892/5705/13360 11064/5885/13360 11065/5886/13360 +f 10892/5705/13361 10982/5799/13361 11066/5887/13361 11064/5885/13361 +f 10982/5799/13362 11061/5882/13362 11067/5888/13362 11066/5887/13362 +f 11061/5882/13363 10971/5788/13363 11065/5886/13363 11067/5888/13363 +f 10982/5799/13364 10980/5797/13364 11068/5889/13364 11069/5890/13364 +f 10980/5797/13365 11070/5891/13365 11071/5892/13365 11068/5889/13365 +f 11070/5891/13366 10982/5799/13366 11069/5890/13366 11071/5892/13366 +f 10980/5797/13367 10986/5803/13367 11072/5893/13367 11073/5894/13367 +f 10986/5803/13368 11070/5891/13368 11074/5895/13368 11072/5893/13368 +f 11070/5891/13369 10980/5797/13369 11073/5894/13369 11074/5895/13369 +f 10986/5803/13370 10991/5808/13370 11075/5896/13370 11076/5897/13370 +f 10991/5808/13371 11070/5891/13371 11077/5898/13371 11075/5896/13371 +f 11070/5891/13372 10986/5803/13372 11076/5897/13372 11077/5898/13372 +f 10991/5808/13373 10996/5813/13373 11078/5899/13373 11079/5900/13373 +f 10996/5813/13374 11070/5891/13374 11080/5901/13374 11078/5899/13374 +f 11070/5891/13375 10991/5808/13375 11079/5900/13375 11080/5901/13375 +f 10996/5813/13376 11001/5902/13376 11081/5903/13376 11082/5904/13376 +f 11001/5819/13377 11070/5891/13377 11083/5905/13377 11081/5906/13377 +f 11070/5891/13378 10996/5813/13378 11082/5904/13378 11083/5907/13378 +f 11001/5819/13379 11006/5827/13379 11084/5908/13379 11085/5909/13379 +f 11006/5827/13380 11070/5891/13380 11086/5910/13380 11084/5908/13380 +f 11070/5891/13381 11001/5819/13381 11085/5909/13381 11086/5910/13381 +f 11006/5827/13382 11011/5832/13382 11087/5911/13382 11088/5912/13382 +f 11011/5832/13383 11070/5891/13383 11089/5913/13383 11087/5911/13383 +f 11070/5891/13384 11006/5827/13384 11088/5912/13384 11089/5913/13384 +f 11011/5832/13385 11016/5837/13385 11090/5914/13385 11091/5915/13385 +f 11016/5837/13386 11070/5891/13386 11092/5916/13386 11090/5914/13386 +f 11070/5891/13387 11011/5832/13387 11091/5915/13387 11092/5916/13387 +f 11016/5837/13388 11021/5842/13388 11093/5917/13388 11094/5918/13388 +f 11021/5842/13389 11070/5891/13389 11095/5919/13389 11093/5917/13389 +f 11070/5891/13390 11016/5837/13390 11094/5918/13390 11095/5919/13390 +f 11021/5842/13391 11026/5847/13391 11096/5920/13391 11097/5921/13391 +f 11026/5847/13392 11070/5891/13392 11098/5922/13392 11096/5920/13392 +f 11070/5891/13393 11021/5842/13393 11097/5921/13393 11098/5922/13393 +f 11026/5847/13394 11031/5852/13394 11099/5923/13394 11100/5924/13394 +f 11031/5852/13395 11070/5891/13395 11101/5925/13395 11099/5923/13395 +f 11070/5891/13396 11026/5847/13396 11100/5924/13396 11101/5925/13396 +f 11031/5852/13397 11036/5857/13397 11102/5926/13397 11103/5927/13397 +f 11036/5857/13398 11070/5891/13398 11104/5928/13398 11102/5926/13398 +f 11070/5891/13399 11031/5852/13399 11103/5927/13399 11104/5928/13399 +f 11036/5857/13400 11041/5862/13400 11105/5929/13400 11106/5930/13400 +f 11041/5862/13401 11070/5891/13401 11107/5931/13401 11105/5929/13401 +f 11070/5891/13402 11036/5857/13402 11106/5930/13402 11107/5931/13402 +f 11041/5862/13403 11046/5867/13403 11108/5932/13403 11109/5933/13403 +f 11046/5867/13404 11070/5891/13404 11110/5934/13404 11108/5932/13404 +f 11070/5891/13405 11041/5862/13405 11109/5933/13405 11110/5934/13405 +f 11046/5867/13406 11051/5872/13406 11111/5935/13406 11112/5936/13406 +f 11051/5872/13407 11070/5891/13407 11113/5937/13407 11111/5935/13407 +f 11070/5891/13408 11046/5867/13408 11112/5936/13408 11113/5937/13408 +f 11051/5872/13409 11056/5877/13409 11114/5938/13409 11115/5939/13409 +f 11056/5877/13410 11070/5891/13410 11116/5940/13410 11114/5938/13410 +f 11070/5891/13411 11051/5872/13411 11115/5939/13411 11116/5940/13411 +f 11056/5877/13412 11061/5882/13412 11117/5941/13412 11118/5942/13412 +f 11061/5882/13413 11070/5891/13413 11119/5943/13413 11117/5941/13413 +f 11070/5891/13414 11056/5877/13414 11118/5942/13414 11119/5943/13414 +f 11061/5882/13415 10982/5799/13415 11120/5944/13415 11121/5945/13415 +f 10982/5799/13416 11070/5891/13416 11122/5946/13416 11120/5944/13416 +f 11070/5891/13417 11061/5882/13417 11121/5945/13417 11122/5946/13417 +f 10799/5609/13418 10798/5608/13418 11123/5947/13418 11124/5948/13418 +f 10798/5608/13419 10801/5611/13419 11125/5949/13419 11123/5947/13419 +f 10801/5611/13420 10803/5613/13420 11126/5950/13420 11125/5949/13420 +f 10803/5613/13421 10799/5609/13421 11124/5948/13421 11126/5950/13421 +f 10805/5615/13422 10804/5614/13422 11127/5951/13422 11128/5952/13422 +f 10804/5614/13423 10807/5617/13423 11129/5953/13423 11127/5951/13423 +f 10807/5617/13424 10808/5618/13424 11130/5954/13424 11129/5953/13424 +f 10808/5618/13425 10805/5615/13425 11128/5952/13425 11130/5954/13425 +f 10810/5620/13426 10809/5619/13426 11131/5955/13426 11132/5956/13426 +f 10809/5619/13427 10812/5622/13427 11133/5957/13427 11131/5955/13427 +f 10812/5622/13428 10813/5623/13428 11134/5958/13428 11133/5957/13428 +f 10813/5623/13429 10810/5620/13429 11132/5956/13429 11134/5958/13429 +f 10815/5625/13430 10814/5624/13430 11135/5959/13430 11136/5960/13430 +f 10814/5624/13431 10817/5627/13431 11137/5961/13431 11135/5959/13431 +f 10817/5627/13432 10818/5628/13432 11138/5962/13432 11137/5961/13432 +f 10818/5628/13433 10815/5625/13433 11136/5960/13433 11138/5962/13433 +f 10820/5630/13434 10819/5629/13434 11139/5963/13434 11140/5964/13434 +f 10819/5633/13435 10822/5632/13435 11141/5965/13435 11139/5966/13435 +f 10822/5632/13436 10823/5635/13436 11142/5967/13436 11141/5965/13436 +f 10823/5636/13437 10820/5630/13437 11140/5964/13437 11142/5968/13437 +f 10825/5638/13438 10824/5637/13438 11143/5969/13438 11144/5970/13438 +f 10824/5637/13439 10827/5640/13439 11145/5971/13439 11143/5969/13439 +f 10827/5640/13440 10828/5641/13440 11146/5972/13440 11145/5971/13440 +f 10828/5641/13441 10825/5638/13441 11144/5970/13441 11146/5972/13441 +f 10830/5643/13442 10829/5642/13442 11147/5973/13442 11148/5974/13442 +f 10829/5642/13443 10832/5645/13443 11149/5975/13443 11147/5973/13443 +f 10832/5645/13444 10833/5646/13444 11150/5976/13444 11149/5975/13444 +f 10833/5646/13445 10830/5643/13445 11148/5974/13445 11150/5976/13445 +f 10835/5648/13446 10834/5647/13446 11151/5977/13446 11152/5978/13446 +f 10834/5647/13447 10837/5650/13447 11153/5979/13447 11151/5977/13447 +f 10837/5650/13448 10838/5651/13448 11154/5980/13448 11153/5979/13448 +f 10838/5651/13449 10835/5648/13449 11152/5978/13449 11154/5980/13449 +f 10840/5653/13450 10839/5652/13450 11155/5981/13450 11156/5982/13450 +f 10839/5652/13451 10842/5655/13451 11157/5983/13451 11155/5981/13451 +f 10842/5655/13452 10843/5656/13452 11158/5984/13452 11157/5983/13452 +f 10843/5656/13453 10840/5653/13453 11156/5982/13453 11158/5984/13453 +f 10845/5658/13454 10844/5657/13454 11159/5985/13454 11160/5986/13454 +f 10844/5657/13455 10847/5660/13455 11161/5987/13455 11159/5985/13455 +f 10847/5660/13456 10848/5661/13456 11162/5988/13456 11161/5987/13456 +f 10848/5661/13457 10845/5658/13457 11160/5986/13457 11162/5988/13457 +f 10850/5663/13458 10849/5662/13458 11163/5989/13458 11164/5990/13458 +f 10849/5662/13459 10852/5665/13459 11165/5991/13459 11163/5989/13459 +f 10852/5665/13460 10853/5666/13460 11166/5992/13460 11165/5991/13460 +f 10853/5666/13461 10850/5663/13461 11164/5990/13461 11166/5992/13461 +f 10855/5668/13462 10854/5667/13462 11167/5993/13462 11168/5994/13462 +f 10854/5667/13463 10857/5670/13463 11169/5995/13463 11167/5993/13463 +f 10857/5670/13464 10858/5671/13464 11170/5996/13464 11169/5995/13464 +f 10858/5671/13465 10855/5668/13465 11168/5994/13465 11170/5996/13465 +f 10860/5673/13466 10859/5672/13466 11171/5997/13466 11172/5998/13466 +f 10859/5672/13467 10862/5675/13467 11173/5999/13467 11171/5997/13467 +f 10862/5675/13468 10863/5676/13468 11174/6000/13468 11173/5999/13468 +f 10863/5676/13469 10860/5673/13469 11172/5998/13469 11174/6000/13469 +f 10865/5678/13470 10864/5677/13470 11175/6001/13470 11176/6002/13470 +f 10864/5677/13471 10867/5680/13471 11177/6003/13471 11175/6001/13471 +f 10867/5680/13472 10868/5681/13472 11178/6004/13472 11177/6003/13472 +f 10868/5681/13473 10865/5678/13473 11176/6002/13473 11178/6004/13473 +f 10870/5683/13474 10869/5682/13474 11179/6005/13474 11180/6006/13474 +f 10869/5682/13475 10872/5685/13475 11181/6007/13475 11179/6005/13475 +f 10872/5685/13476 10873/5686/13476 11182/6008/13476 11181/6007/13476 +f 10873/5686/13477 10870/5683/13477 11180/6006/13477 11182/6008/13477 +f 10875/5688/13478 10874/5687/13478 11183/6009/13478 11184/6010/13478 +f 10874/5687/13479 10877/5690/13479 11185/6011/13479 11183/6009/13479 +f 10877/5690/13480 10878/5691/13480 11186/6012/13480 11185/6011/13480 +f 10878/5691/13481 10875/5688/13481 11184/6010/13481 11186/6012/13481 +f 10880/5693/13482 10879/5692/13482 11187/6013/13482 11188/6014/13482 +f 10879/5692/13483 10882/5695/13483 11189/6015/13483 11187/6013/13483 +f 10882/5695/13484 10883/5696/13484 11190/6016/13484 11189/6015/13484 +f 10883/5696/13485 10880/5693/13485 11188/6014/13485 11190/6016/13485 +f 10885/5698/13486 10884/5697/13486 11191/6017/13486 11192/6018/13486 +f 10884/5697/13487 10886/5699/13487 11193/6019/13487 11191/6017/13487 +f 10886/5699/13488 10887/5700/13488 11194/6020/13488 11193/6019/13488 +f 10887/5700/13489 10885/5698/13489 11192/6018/13489 11194/6020/13489 +f 10889/5702/13490 10888/5701/13490 11195/6021/13490 11196/6022/13490 +f 10888/5701/13491 10891/5704/13491 11197/6023/13491 11195/6021/13491 +f 10891/5704/13492 10893/5706/13492 11198/6024/13492 11197/6023/13492 +f 10893/5706/13493 10889/5702/13493 11196/6022/13493 11198/6024/13493 +f 10895/5708/13494 10894/5707/13494 11199/6025/13494 11200/6026/13494 +f 10894/5707/13495 10897/5710/13495 11201/6027/13495 11199/6025/13495 +f 10897/5710/13496 10898/5711/13496 11202/6028/13496 11201/6027/13496 +f 10898/5711/13497 10895/5708/13497 11200/6026/13497 11202/6028/13497 +f 10900/5713/13498 10899/5712/13498 11203/6029/13498 11204/6030/13498 +f 10899/5712/13499 10902/5715/13499 11205/6031/13499 11203/6029/13499 +f 10902/5715/13500 10903/5716/13500 11206/6032/13500 11205/6031/13500 +f 10903/5716/13501 10900/5713/13501 11204/6030/13501 11206/6032/13501 +f 10905/5718/13502 10904/5717/13502 11207/6033/13502 11208/6034/13502 +f 10904/5717/13503 10907/5720/13503 11209/6035/13503 11207/6033/13503 +f 10907/5720/13504 10908/5721/13504 11210/6036/13504 11209/6035/13504 +f 10908/5721/13505 10905/5718/13505 11208/6034/13505 11210/6036/13505 +f 10910/5724/13506 10909/5723/13506 11211/6037/13506 11212/6038/13506 +f 10909/5727/13507 10912/5726/13507 11213/6039/13507 11211/6040/13507 +f 10912/5726/13508 10913/5729/13508 11214/6041/13508 11213/6039/13508 +f 10913/5730/13509 10910/5724/13509 11212/6038/13509 11214/6042/13509 +f 10915/5732/13510 10914/5731/13510 11215/6043/13510 11216/6044/13510 +f 10914/5731/13511 10917/5734/13511 11217/6045/13511 11215/6043/13511 +f 10917/5734/13512 10918/5735/13512 11218/6046/13512 11217/6045/13512 +f 10918/5735/13513 10915/5732/13513 11216/6044/13513 11218/6046/13513 +f 10920/5737/13514 10919/5736/13514 11219/6047/13514 11220/6048/13514 +f 10919/5736/13515 10922/5739/13515 11221/6049/13515 11219/6047/13515 +f 10922/5739/13516 10923/5740/13516 11222/6050/13516 11221/6049/13516 +f 10923/5740/13517 10920/5737/13517 11220/6048/13517 11222/6050/13517 +f 10925/5742/13518 10924/5741/13518 11223/6051/13518 11224/6052/13518 +f 10924/5741/13519 10927/5744/13519 11225/6053/13519 11223/6051/13519 +f 10927/5744/13520 10928/5745/13520 11226/6054/13520 11225/6053/13520 +f 10928/5745/13521 10925/5742/13521 11224/6052/13521 11226/6054/13521 +f 10930/5747/13522 10929/5746/13522 11227/6055/13522 11228/6056/13522 +f 10929/5746/13523 10932/5749/13523 11229/6057/13523 11227/6055/13523 +f 10932/5749/13524 10933/5750/13524 11230/6058/13524 11229/6057/13524 +f 10933/5750/13525 10930/5747/13525 11228/6056/13525 11230/6058/13525 +f 10935/5752/13526 10934/5751/13526 11231/6059/13526 11232/6060/13526 +f 10934/5751/13527 10937/5754/13527 11233/6061/13527 11231/6059/13527 +f 10937/5754/13528 10938/5755/13528 11234/6062/13528 11233/6061/13528 +f 10938/5755/13529 10935/5752/13529 11232/6060/13529 11234/6062/13529 +f 10940/5757/13530 10939/5756/13530 11235/6063/13530 11236/6064/13530 +f 10939/5756/13531 10942/5759/13531 11237/6065/13531 11235/6063/13531 +f 10942/5759/13532 10943/5760/13532 11238/6066/13532 11237/6065/13532 +f 10943/5760/13533 10940/5757/13533 11236/6064/13533 11238/6066/13533 +f 10945/5762/13534 10944/5761/13534 11239/6067/13534 11240/6068/13534 +f 10944/5761/13535 10947/5764/13535 11241/6069/13535 11239/6067/13535 +f 10947/5764/13536 10948/5765/13536 11242/6070/13536 11241/6069/13536 +f 10948/5765/13537 10945/5762/13537 11240/6068/13537 11242/6070/13537 +f 10950/5767/13538 10949/5766/13538 11243/6071/13538 11244/6072/13538 +f 10949/5766/13539 10952/5769/13539 11245/6073/13539 11243/6071/13539 +f 10952/5769/13540 10953/5770/13540 11246/6074/13540 11245/6073/13540 +f 10953/5770/13541 10950/5767/13541 11244/6072/13541 11246/6074/13541 +f 10955/5772/13542 10954/5771/13542 11247/6075/13542 11248/6076/13542 +f 10954/5771/13543 10957/5774/13543 11249/6077/13543 11247/6075/13543 +f 10957/5774/13544 10958/5775/13544 11250/6078/13544 11249/6077/13544 +f 10958/5775/13545 10955/5772/13545 11248/6076/13545 11250/6078/13545 +f 10960/5777/13546 10959/5776/13546 11251/6079/13546 11252/6080/13546 +f 10959/5776/13547 10962/5779/13547 11253/6081/13547 11251/6079/13547 +f 10962/5779/13548 10963/5780/13548 11254/6082/13548 11253/6081/13548 +f 10963/5780/13549 10960/5777/13549 11252/6080/13549 11254/6082/13549 +f 10965/5782/13550 10964/5781/13550 11255/6083/13550 11256/6084/13550 +f 10964/5781/13551 10967/5784/13551 11257/6085/13551 11255/6083/13551 +f 10967/5784/13552 10968/5785/13552 11258/6086/13552 11257/6085/13552 +f 10968/5785/13553 10965/5782/13553 11256/6084/13553 11258/6086/13553 +f 10970/5787/13554 10969/5786/13554 11259/6087/13554 11260/6088/13554 +f 10969/5786/13555 10972/5789/13555 11261/6089/13555 11259/6087/13555 +f 10972/5789/13556 10973/5790/13556 11262/6090/13556 11261/6089/13556 +f 10973/5790/13557 10970/5787/13557 11260/6088/13557 11262/6090/13557 +f 10975/5792/13558 10974/5791/13558 11263/6091/13558 11264/6092/13558 +f 10974/5791/13559 10976/5793/13559 11265/6093/13559 11263/6091/13559 +f 10976/5793/13560 10977/5794/13560 11266/6094/13560 11265/6093/13560 +f 10977/5794/13561 10975/5792/13561 11264/6092/13561 11266/6094/13561 +f 10979/5796/13562 10978/5795/13562 11267/6095/13562 11268/6096/13562 +f 10978/5795/13563 10981/5798/13563 11269/6097/13563 11267/6095/13563 +f 10981/5798/13564 10983/5800/13564 11270/6098/13564 11269/6097/13564 +f 10983/5800/13565 10979/5796/13565 11268/6096/13565 11270/6098/13565 +f 10985/5802/13566 10984/5801/13566 11271/6099/13566 11272/6100/13566 +f 10984/5801/13567 10987/5804/13567 11273/6101/13567 11271/6099/13567 +f 10987/5804/13568 10988/5805/13568 11274/6102/13568 11273/6101/13568 +f 10988/5805/13569 10985/5802/13569 11272/6100/13569 11274/6102/13569 +f 10990/5807/13570 10989/5806/13570 11275/6103/13570 11276/6104/13570 +f 10989/5806/13571 10992/5809/13571 11277/6105/13571 11275/6103/13571 +f 10992/5809/13572 10993/5810/13572 11278/6106/13572 11277/6105/13572 +f 10993/5810/13573 10990/5807/13573 11276/6104/13573 11278/6106/13573 +f 10995/5812/13574 10994/5811/13574 11279/6107/13574 11280/6108/13574 +f 10994/5811/13575 10997/5814/13575 11281/6109/13575 11279/6107/13575 +f 10997/5814/13576 10998/5815/13576 11282/6110/13576 11281/6109/13576 +f 10998/5815/13577 10995/5812/13577 11280/6108/13577 11282/6110/13577 +f 11000/5818/13578 10999/5817/13578 11283/6111/13578 11284/6112/13578 +f 10999/5821/13579 11002/5820/13579 11285/6113/13579 11283/6114/13579 +f 11002/5820/13580 11003/5823/13580 11286/6115/13580 11285/6113/13580 +f 11003/5824/13581 11000/5818/13581 11284/6112/13581 11286/6116/13581 +f 11005/5826/13582 11004/5825/13582 11287/6117/13582 11288/6118/13582 +f 11004/5825/13583 11007/5828/13583 11289/6119/13583 11287/6117/13583 +f 11007/5828/13584 11008/5829/13584 11290/6120/13584 11289/6119/13584 +f 11008/5829/13585 11005/5826/13585 11288/6118/13585 11290/6120/13585 +f 11010/5831/13586 11009/5830/13586 11291/6121/13586 11292/6122/13586 +f 11009/5830/13587 11012/5833/13587 11293/6123/13587 11291/6121/13587 +f 11012/5833/13588 11013/5834/13588 11294/6124/13588 11293/6123/13588 +f 11013/5834/13589 11010/5831/13589 11292/6122/13589 11294/6124/13589 +f 11015/5836/13590 11014/5835/13590 11295/6125/13590 11296/6126/13590 +f 11014/5835/13591 11017/5838/13591 11297/6127/13591 11295/6125/13591 +f 11017/5838/13592 11018/5839/13592 11298/6128/13592 11297/6127/13592 +f 11018/5839/13593 11015/5836/13593 11296/6126/13593 11298/6128/13593 +f 11020/5841/13594 11019/5840/13594 11299/6129/13594 11300/6130/13594 +f 11019/5840/13595 11022/5843/13595 11301/6131/13595 11299/6129/13595 +f 11022/5843/13596 11023/5844/13596 11302/6132/13596 11301/6131/13596 +f 11023/5844/13597 11020/5841/13597 11300/6130/13597 11302/6132/13597 +f 11025/5846/13598 11024/5845/13598 11303/6133/13598 11304/6134/13598 +f 11024/5845/13599 11027/5848/13599 11305/6135/13599 11303/6133/13599 +f 11027/5848/13600 11028/5849/13600 11306/6136/13600 11305/6135/13600 +f 11028/5849/13601 11025/5846/13601 11304/6134/13601 11306/6136/13601 +f 11030/5851/13602 11029/5850/13602 11307/6137/13602 11308/6138/13602 +f 11029/5850/13603 11032/5853/13603 11309/6139/13603 11307/6137/13603 +f 11032/5853/13604 11033/5854/13604 11310/6140/13604 11309/6139/13604 +f 11033/5854/13605 11030/5851/13605 11308/6138/13605 11310/6140/13605 +f 11035/5856/13606 11034/5855/13606 11311/6141/13606 11312/6142/13606 +f 11034/5855/13607 11037/5858/13607 11313/6143/13607 11311/6141/13607 +f 11037/5858/13608 11038/5859/13608 11314/6144/13608 11313/6143/13608 +f 11038/5859/13609 11035/5856/13609 11312/6142/13609 11314/6144/13609 +f 11040/5861/13610 11039/5860/13610 11315/6145/13610 11316/6146/13610 +f 11039/5860/13611 11042/5863/13611 11317/6147/13611 11315/6145/13611 +f 11042/5863/13612 11043/5864/13612 11318/6148/13612 11317/6147/13612 +f 11043/5864/13613 11040/5861/13613 11316/6146/13613 11318/6148/13613 +f 11045/5866/13614 11044/5865/13614 11319/6149/13614 11320/6150/13614 +f 11044/5865/13615 11047/5868/13615 11321/6151/13615 11319/6149/13615 +f 11047/5868/13616 11048/5869/13616 11322/6152/13616 11321/6151/13616 +f 11048/5869/13617 11045/5866/13617 11320/6150/13617 11322/6152/13617 +f 11050/5871/13618 11049/5870/13618 11323/6153/13618 11324/6154/13618 +f 11049/5870/13619 11052/5873/13619 11325/6155/13619 11323/6153/13619 +f 11052/5873/13620 11053/5874/13620 11326/6156/13620 11325/6155/13620 +f 11053/5874/13621 11050/5871/13621 11324/6154/13621 11326/6156/13621 +f 11055/5876/13622 11054/5875/13622 11327/6157/13622 11328/6158/13622 +f 11054/5875/13623 11057/5878/13623 11329/6159/13623 11327/6157/13623 +f 11057/5878/13624 11058/5879/13624 11330/6160/13624 11329/6159/13624 +f 11058/5879/13625 11055/5876/13625 11328/6158/13625 11330/6160/13625 +f 11060/5881/13626 11059/5880/13626 11331/6161/13626 11332/6162/13626 +f 11059/5880/13627 11062/5883/13627 11333/6163/13627 11331/6161/13627 +f 11062/5883/13628 11063/5884/13628 11334/6164/13628 11333/6163/13628 +f 11063/5884/13629 11060/5881/13629 11332/6162/13629 11334/6164/13629 +f 11065/5886/13630 11064/5885/13630 11335/6165/13630 11336/6166/13630 +f 11064/5885/13631 11066/5887/13631 11337/6167/13631 11335/6165/13631 +f 11066/5887/13632 11067/5888/13632 11338/6168/13632 11337/6167/13632 +f 11067/5888/13633 11065/5886/13633 11336/6166/13633 11338/6168/13633 +f 11069/5890/13634 11068/5889/13634 11339/6169/13634 11340/6170/13634 +f 11068/5889/13635 11071/5892/13635 11341/6171/13635 11339/6169/13635 +f 11071/5892/13636 11069/5890/13636 11340/6170/13636 11341/6171/13636 +f 11073/5894/13637 11072/5893/13637 11342/6172/13637 11343/6173/13637 +f 11072/5893/13638 11074/5895/13638 11344/6174/13638 11342/6172/13638 +f 11074/5895/13639 11073/5894/13639 11343/6173/13639 11344/6174/13639 +f 11076/5897/13640 11075/5896/13640 11345/6175/13640 11346/6176/13640 +f 11075/5896/13641 11077/5898/13641 11347/6177/13641 11345/6175/13641 +f 11077/5898/13642 11076/5897/13642 11346/6176/13642 11347/6177/13642 +f 11079/5900/13643 11078/5899/13643 11348/6178/13643 11349/6179/13643 +f 11078/5899/13644 11080/5901/13644 11350/6180/13644 11348/6178/13644 +f 11080/5901/13645 11079/5900/13645 11349/6179/13645 11350/6180/13645 +f 11082/5904/13646 11081/5903/13646 11351/6181/13646 11352/6182/13646 +f 11081/5906/13647 11083/5905/13647 11353/6183/13647 11351/6184/13647 +f 11083/5905/13648 11082/6185/13648 11352/6186/13648 11353/6183/13648 +f 11085/5909/13649 11084/5908/13649 11354/6187/13649 11355/6188/13649 +f 11084/5908/13650 11086/5910/13650 11356/6189/13650 11354/6187/13650 +f 11086/5910/13651 11085/5909/13651 11355/6188/13651 11356/6189/13651 +f 11088/5912/13652 11087/5911/13652 11357/6190/13652 11358/6191/13652 +f 11087/5911/13653 11089/5913/13653 11359/6192/13653 11357/6190/13653 +f 11089/5913/13654 11088/5912/13654 11358/6191/13654 11359/6192/13654 +f 11091/5915/13655 11090/5914/13655 11360/6193/13655 11361/6194/13655 +f 11090/5914/13656 11092/5916/13656 11362/6195/13656 11360/6193/13656 +f 11092/5916/13657 11091/5915/13657 11361/6194/13657 11362/6195/13657 +f 11094/5918/13658 11093/5917/13658 11363/6196/13658 11364/6197/13658 +f 11093/5917/13659 11095/5919/13659 11365/6198/13659 11363/6196/13659 +f 11095/5919/13660 11094/5918/13660 11364/6197/13660 11365/6198/13660 +f 11097/5921/13661 11096/5920/13661 11366/6199/13661 11367/6200/13661 +f 11096/5920/13662 11098/5922/13662 11368/6201/13662 11366/6199/13662 +f 11098/5922/13663 11097/5921/13663 11367/6200/13663 11368/6201/13663 +f 11100/5924/13664 11099/5923/13664 11369/6202/13664 11370/6203/13664 +f 11099/5923/13665 11101/5925/13665 11371/6204/13665 11369/6202/13665 +f 11101/5925/13666 11100/5924/13666 11370/6203/13666 11371/6204/13666 +f 11103/5927/13667 11102/5926/13667 11372/6205/13667 11373/6206/13667 +f 11102/5926/13668 11104/5928/13668 11374/6207/13668 11372/6205/13668 +f 11104/5928/13669 11103/5927/13669 11373/6206/13669 11374/6207/13669 +f 11106/5930/13670 11105/5929/13670 11375/6208/13670 11376/6209/13670 +f 11105/5929/13671 11107/5931/13671 11377/6210/13671 11375/6208/13671 +f 11107/5931/13672 11106/5930/13672 11376/6209/13672 11377/6210/13672 +f 11109/5933/13673 11108/5932/13673 11378/6211/13673 11379/6212/13673 +f 11108/5932/13674 11110/5934/13674 11380/6213/13674 11378/6211/13674 +f 11110/5934/13675 11109/5933/13675 11379/6212/13675 11380/6213/13675 +f 11112/5936/13676 11111/5935/13676 11381/6214/13676 11382/6215/13676 +f 11111/5935/13677 11113/5937/13677 11383/6216/13677 11381/6214/13677 +f 11113/5937/13678 11112/5936/13678 11382/6215/13678 11383/6216/13678 +f 11115/5939/13679 11114/5938/13679 11384/6217/13679 11385/6218/13679 +f 11114/5938/13680 11116/5940/13680 11386/6219/13680 11384/6217/13680 +f 11116/5940/13681 11115/5939/13681 11385/6218/13681 11386/6219/13681 +f 11118/5942/13682 11117/5941/13682 11387/6220/13682 11388/6221/13682 +f 11117/5941/13683 11119/5943/13683 11389/6222/13683 11387/6220/13683 +f 11119/5943/13684 11118/5942/13684 11388/6221/13684 11389/6222/13684 +f 11121/5945/13685 11120/5944/13685 11390/6223/13685 11391/6224/13685 +f 11120/5944/13686 11122/5946/13686 11392/6225/13686 11390/6223/13686 +f 11122/5946/13687 11121/5945/13687 11391/6224/13687 11392/6225/13687 +f 11124/5948/13688 11123/5947/13688 11393/6226/13688 11394/6227/13688 +f 11123/5947/13689 11125/5949/13689 11395/6228/13689 11393/6226/13689 +f 11125/5949/13690 11126/5950/13690 11396/6229/13690 11395/6228/13690 +f 11126/5950/13691 11124/5948/13691 11394/6227/13691 11396/6229/13691 +f 11128/5952/13692 11127/5951/13692 11397/6230/13692 11398/6231/13692 +f 11127/5951/13693 11129/5953/13693 11399/6232/13693 11397/6230/13693 +f 11129/5953/13694 11130/5954/13694 11400/6233/13694 11399/6232/13694 +f 11130/5954/13695 11128/5952/13695 11398/6231/13695 11400/6233/13695 +f 11132/5956/13696 11131/5955/13696 11401/6234/13696 11402/6235/13696 +f 11131/5955/13697 11133/5957/13697 11403/6236/13697 11401/6234/13697 +f 11133/5957/13698 11134/5958/13698 11404/6237/13698 11403/6236/13698 +f 11134/5958/13699 11132/5956/13699 11402/6235/13699 11404/6237/13699 +f 11136/5960/13700 11135/5959/13700 11405/6238/13700 11406/6239/13700 +f 11135/5959/13701 11137/5961/13701 11407/6240/13701 11405/6238/13701 +f 11137/5961/13702 11138/5962/13702 11408/6241/13702 11407/6240/13702 +f 11138/5962/13703 11136/5960/13703 11406/6239/13703 11408/6241/13703 +f 11140/5964/13704 11139/5963/13704 11409/6242/13704 11410/6243/13704 +f 11139/5966/13705 11141/5965/13705 11411/6244/13705 11409/6245/13705 +f 11141/5965/13706 11142/5967/13706 11412/6246/13706 11411/6244/13706 +f 11142/5968/13707 11140/5964/13707 11410/6243/13707 11412/6247/13707 +f 11144/5970/13708 11143/5969/13708 11413/6248/13708 11414/6249/13708 +f 11143/5969/13709 11145/5971/13709 11415/6250/13709 11413/6248/13709 +f 11145/5971/13710 11146/5972/13710 11416/6251/13710 11415/6250/13710 +f 11146/5972/13711 11144/5970/13711 11414/6249/13711 11416/6251/13711 +f 11148/5974/13712 11147/5973/13712 11417/6252/13712 11418/6253/13712 +f 11147/5973/13713 11149/5975/13713 11419/6254/13713 11417/6252/13713 +f 11149/5975/13714 11150/5976/13714 11420/6255/13714 11419/6254/13714 +f 11150/5976/13715 11148/5974/13715 11418/6253/13715 11420/6255/13715 +f 11152/5978/13716 11151/5977/13716 11421/6256/13716 11422/6257/13716 +f 11151/5977/13717 11153/5979/13717 11423/6258/13717 11421/6256/13717 +f 11153/5979/13718 11154/5980/13718 11424/6259/13718 11423/6258/13718 +f 11154/5980/13719 11152/5978/13719 11422/6257/13719 11424/6259/13719 +f 11156/5982/13720 11155/5981/13720 11425/6260/13720 11426/6261/13720 +f 11155/5981/13721 11157/5983/13721 11427/6262/13721 11425/6260/13721 +f 11157/5983/13722 11158/5984/13722 11428/6263/13722 11427/6262/13722 +f 11158/5984/13723 11156/5982/13723 11426/6261/13723 11428/6263/13723 +f 11160/5986/13724 11159/5985/13724 11429/6264/13724 11430/6265/13724 +f 11159/5985/13725 11161/5987/13725 11431/6266/13725 11429/6264/13725 +f 11161/5987/13726 11162/5988/13726 11432/6267/13726 11431/6266/13726 +f 11162/5988/13727 11160/5986/13727 11430/6265/13727 11432/6267/13727 +f 11164/5990/13728 11163/5989/13728 11433/6268/13728 11434/6269/13728 +f 11163/5989/13729 11165/5991/13729 11435/6270/13729 11433/6268/13729 +f 11165/5991/13730 11166/5992/13730 11436/6271/13730 11435/6270/13730 +f 11166/5992/13731 11164/5990/13731 11434/6269/13731 11436/6271/13731 +f 11168/5994/13732 11167/5993/13732 11437/6272/13732 11438/6273/13732 +f 11167/5993/13733 11169/5995/13733 11439/6274/13733 11437/6272/13733 +f 11169/5995/13734 11170/5996/13734 11440/6275/13734 11439/6274/13734 +f 11170/5996/13735 11168/5994/13735 11438/6273/13735 11440/6275/13735 +f 11172/5998/13736 11171/5997/13736 11441/6276/13736 11442/6277/13736 +f 11171/5997/13737 11173/5999/13737 11443/6278/13737 11441/6276/13737 +f 11173/5999/13738 11174/6000/13738 11444/6279/13738 11443/6278/13738 +f 11174/6000/13739 11172/5998/13739 11442/6277/13739 11444/6279/13739 +f 11176/6002/13740 11175/6001/13740 11445/6280/13740 11446/6281/13740 +f 11175/6001/13741 11177/6003/13741 11447/6282/13741 11445/6280/13741 +f 11177/6003/13742 11178/6004/13742 11448/6283/13742 11447/6282/13742 +f 11178/6004/13743 11176/6002/13743 11446/6281/13743 11448/6283/13743 +f 11180/6006/13744 11179/6005/13744 11449/6284/13744 11450/6285/13744 +f 11179/6005/13745 11181/6007/13745 11451/6286/13745 11449/6284/13745 +f 11181/6007/13746 11182/6008/13746 11452/6287/13746 11451/6286/13746 +f 11182/6008/13747 11180/6006/13747 11450/6285/13747 11452/6287/13747 +f 11184/6010/13748 11183/6009/13748 11453/6288/13748 11454/6289/13748 +f 11183/6009/13749 11185/6011/13749 11455/6290/13749 11453/6288/13749 +f 11185/6011/13750 11186/6012/13750 11456/6291/13750 11455/6290/13750 +f 11186/6012/13751 11184/6010/13751 11454/6289/13751 11456/6291/13751 +f 11188/6014/13752 11187/6013/13752 11457/6292/13752 11458/6293/13752 +f 11187/6013/13753 11189/6015/13753 11459/6294/13753 11457/6292/13753 +f 11189/6015/13754 11190/6016/13754 11460/6295/13754 11459/6294/13754 +f 11190/6016/13755 11188/6014/13755 11458/6293/13755 11460/6295/13755 +f 11192/6018/13756 11191/6017/13756 11461/6296/13756 11462/6297/13756 +f 11191/6017/13757 11193/6019/13757 11463/6298/13757 11461/6296/13757 +f 11193/6019/13758 11194/6020/13758 11464/6299/13758 11463/6298/13758 +f 11194/6020/13759 11192/6018/13759 11462/6297/13759 11464/6299/13759 +f 11196/6022/13760 11195/6021/13760 11465/6300/13760 11466/6301/13760 +f 11195/6021/13761 11197/6023/13761 11467/6302/13761 11465/6300/13761 +f 11197/6023/13762 11198/6024/13762 11468/6303/13762 11467/6302/13762 +f 11198/6024/13763 11196/6022/13763 11466/6301/13763 11468/6303/13763 +f 11200/6026/13764 11199/6025/13764 11469/6304/13764 11470/6305/13764 +f 11199/6025/13765 11201/6027/13765 11471/6306/13765 11469/6304/13765 +f 11201/6027/13766 11202/6028/13766 11472/6307/13766 11471/6306/13766 +f 11202/6028/13767 11200/6026/13767 11470/6305/13767 11472/6307/13767 +f 11204/6030/13768 11203/6029/13768 11473/6308/13768 11474/6309/13768 +f 11203/6029/13769 11205/6031/13769 11475/6310/13769 11473/6308/13769 +f 11205/6031/13770 11206/6032/13770 11476/6311/13770 11475/6310/13770 +f 11206/6032/13771 11204/6030/13771 11474/6309/13771 11476/6311/13771 +f 11208/6034/13772 11207/6033/13772 11477/6312/13772 11478/6313/13772 +f 11207/6033/13773 11209/6035/13773 11479/6314/13773 11477/6312/13773 +f 11209/6035/13774 11210/6036/13774 11480/6315/13774 11479/6314/13774 +f 11210/6036/13775 11208/6034/13775 11478/6313/13775 11480/6315/13775 +f 11212/6038/13776 11211/6037/13776 11481/6316/13776 11482/6317/13776 +f 11211/6040/13777 11213/6039/13777 11483/6318/13777 11481/6319/13777 +f 11213/6039/13778 11214/6041/13778 11484/6320/13778 11483/6318/13778 +f 11214/6042/13779 11212/6038/13779 11482/6317/13779 11484/6321/13779 +f 11216/6044/13780 11215/6043/13780 11485/6322/13780 11486/6323/13780 +f 11215/6043/13781 11217/6045/13781 11487/6324/13781 11485/6322/13781 +f 11217/6045/13782 11218/6046/13782 11488/6325/13782 11487/6324/13782 +f 11218/6046/13783 11216/6044/13783 11486/6323/13783 11488/6325/13783 +f 11220/6048/13784 11219/6047/13784 11489/6326/13784 11490/6327/13784 +f 11219/6047/13785 11221/6049/13785 11491/6328/13785 11489/6326/13785 +f 11221/6049/13786 11222/6050/13786 11492/6329/13786 11491/6328/13786 +f 11222/6050/13787 11220/6048/13787 11490/6327/13787 11492/6329/13787 +f 11224/6052/13788 11223/6051/13788 11493/6330/13788 11494/6331/13788 +f 11223/6051/13789 11225/6053/13789 11495/6332/13789 11493/6330/13789 +f 11225/6053/13790 11226/6054/13790 11496/6333/13790 11495/6332/13790 +f 11226/6054/13791 11224/6052/13791 11494/6331/13791 11496/6333/13791 +f 11228/6056/13792 11227/6055/13792 11497/6334/13792 11498/6335/13792 +f 11227/6055/13793 11229/6057/13793 11499/6336/13793 11497/6334/13793 +f 11229/6057/13794 11230/6058/13794 11500/6337/13794 11499/6336/13794 +f 11230/6058/13795 11228/6056/13795 11498/6335/13795 11500/6337/13795 +f 11232/6060/13796 11231/6059/13796 11501/6338/13796 11502/6339/13796 +f 11231/6059/13797 11233/6061/13797 11503/6340/13797 11501/6338/13797 +f 11233/6061/13798 11234/6062/13798 11504/6341/13798 11503/6340/13798 +f 11234/6062/13799 11232/6060/13799 11502/6339/13799 11504/6341/13799 +f 11236/6064/13800 11235/6063/13800 11505/6342/13800 11506/6343/13800 +f 11235/6063/13801 11237/6065/13801 11507/6344/13801 11505/6342/13801 +f 11237/6065/13802 11238/6066/13802 11508/6345/13802 11507/6344/13802 +f 11238/6066/13803 11236/6064/13803 11506/6343/13803 11508/6345/13803 +f 11240/6068/13804 11239/6067/13804 11509/6346/13804 11510/6347/13804 +f 11239/6067/13805 11241/6069/13805 11511/6348/13805 11509/6346/13805 +f 11241/6069/13806 11242/6070/13806 11512/6349/13806 11511/6348/13806 +f 11242/6070/13807 11240/6068/13807 11510/6347/13807 11512/6349/13807 +f 11244/6072/13808 11243/6071/13808 11513/6350/13808 11514/6351/13808 +f 11243/6071/13809 11245/6073/13809 11515/6352/13809 11513/6350/13809 +f 11245/6073/13810 11246/6074/13810 11516/6353/13810 11515/6352/13810 +f 11246/6074/13811 11244/6072/13811 11514/6351/13811 11516/6353/13811 +f 11248/6076/13812 11247/6075/13812 11517/6354/13812 11518/6355/13812 +f 11247/6075/13813 11249/6077/13813 11519/6356/13813 11517/6354/13813 +f 11249/6077/13814 11250/6078/13814 11520/6357/13814 11519/6356/13814 +f 11250/6078/13815 11248/6076/13815 11518/6355/13815 11520/6357/13815 +f 11252/6080/13816 11251/6079/13816 11521/6358/13816 11522/6359/13816 +f 11251/6079/13817 11253/6081/13817 11523/6360/13817 11521/6358/13817 +f 11253/6081/13818 11254/6082/13818 11524/6361/13818 11523/6360/13818 +f 11254/6082/13819 11252/6080/13819 11522/6359/13819 11524/6361/13819 +f 11256/6084/13820 11255/6083/13820 11525/6362/13820 11526/6363/13820 +f 11255/6083/13821 11257/6085/13821 11527/6364/13821 11525/6362/13821 +f 11257/6085/13822 11258/6086/13822 11528/6365/13822 11527/6364/13822 +f 11258/6086/13823 11256/6084/13823 11526/6363/13823 11528/6365/13823 +f 11260/6088/13824 11259/6087/13824 11529/6366/13824 11530/6367/13824 +f 11259/6087/13825 11261/6089/13825 11531/6368/13825 11529/6366/13825 +f 11261/6089/13826 11262/6090/13826 11532/6369/13826 11531/6368/13826 +f 11262/6090/13827 11260/6088/13827 11530/6367/13827 11532/6369/13827 +f 11264/6092/13828 11263/6091/13828 11533/6370/13828 11534/6371/13828 +f 11263/6091/13829 11265/6093/13829 11535/6372/13829 11533/6370/13829 +f 11265/6093/13830 11266/6094/13830 11536/6373/13830 11535/6372/13830 +f 11266/6094/13831 11264/6092/13831 11534/6371/13831 11536/6373/13831 +f 11268/6096/13832 11267/6095/13832 11537/6374/13832 11538/6375/13832 +f 11267/6095/13833 11269/6097/13833 11539/6376/13833 11537/6374/13833 +f 11269/6097/13834 11270/6098/13834 11540/6377/13834 11539/6376/13834 +f 11270/6098/13835 11268/6096/13835 11538/6375/13835 11540/6377/13835 +f 11272/6100/13836 11271/6099/13836 11541/6378/13836 11542/6379/13836 +f 11271/6099/13837 11273/6101/13837 11543/6380/13837 11541/6378/13837 +f 11273/6101/13838 11274/6102/13838 11544/6381/13838 11543/6380/13838 +f 11274/6102/13839 11272/6100/13839 11542/6379/13839 11544/6381/13839 +f 11276/6104/13840 11275/6103/13840 11545/6382/13840 11546/6383/13840 +f 11275/6103/13841 11277/6105/13841 11547/6384/13841 11545/6382/13841 +f 11277/6105/13842 11278/6106/13842 11548/6385/13842 11547/6384/13842 +f 11278/6106/13843 11276/6104/13843 11546/6383/13843 11548/6385/13843 +f 11280/6108/13844 11279/6107/13844 11549/6386/13844 11550/6387/13844 +f 11279/6107/13845 11281/6109/13845 11551/6388/13845 11549/6386/13845 +f 11281/6109/13846 11282/6110/13846 11552/6389/13846 11551/6388/13846 +f 11282/6110/13847 11280/6108/13847 11550/6387/13847 11552/6389/13847 +f 11284/6112/13848 11283/6111/13848 11553/6390/13848 11554/6391/13848 +f 11283/6114/13849 11285/6113/13849 11555/6392/13849 11553/6393/13849 +f 11285/6113/13850 11286/6115/13850 11556/6394/13850 11555/6392/13850 +f 11286/6116/13851 11284/6112/13851 11554/6391/13851 11556/6395/13851 +f 11288/6118/13852 11287/6117/13852 11557/6396/13852 11558/6397/13852 +f 11287/6117/13853 11289/6119/13853 11559/6398/13853 11557/6396/13853 +f 11289/6119/13854 11290/6120/13854 11560/6399/13854 11559/6398/13854 +f 11290/6120/13855 11288/6118/13855 11558/6397/13855 11560/6399/13855 +f 11292/6122/13856 11291/6121/13856 11561/6400/13856 11562/6401/13856 +f 11291/6121/13857 11293/6123/13857 11563/6402/13857 11561/6400/13857 +f 11293/6123/13858 11294/6124/13858 11564/6403/13858 11563/6402/13858 +f 11294/6124/13859 11292/6122/13859 11562/6401/13859 11564/6403/13859 +f 11296/6126/13860 11295/6125/13860 11565/6404/13860 11566/6405/13860 +f 11295/6125/13861 11297/6127/13861 11567/6406/13861 11565/6404/13861 +f 11297/6127/13862 11298/6128/13862 11568/6407/13862 11567/6406/13862 +f 11298/6128/13863 11296/6126/13863 11566/6405/13863 11568/6407/13863 +f 11300/6130/13864 11299/6129/13864 11569/6408/13864 11570/6409/13864 +f 11299/6129/13865 11301/6131/13865 11571/6410/13865 11569/6408/13865 +f 11301/6131/13866 11302/6132/13866 11572/6411/13866 11571/6410/13866 +f 11302/6132/13867 11300/6130/13867 11570/6409/13867 11572/6411/13867 +f 11304/6134/13868 11303/6133/13868 11573/6412/13868 11574/6413/13868 +f 11303/6133/13869 11305/6135/13869 11575/6414/13869 11573/6412/13869 +f 11305/6135/13870 11306/6136/13870 11576/6415/13870 11575/6414/13870 +f 11306/6136/13871 11304/6134/13871 11574/6413/13871 11576/6415/13871 +f 11308/6138/13872 11307/6137/13872 11577/6416/13872 11578/6417/13872 +f 11307/6137/13873 11309/6139/13873 11579/6418/13873 11577/6416/13873 +f 11309/6139/13874 11310/6140/13874 11580/6419/13874 11579/6418/13874 +f 11310/6140/13875 11308/6138/13875 11578/6417/13875 11580/6419/13875 +f 11312/6142/13876 11311/6141/13876 11581/6420/13876 11582/6421/13876 +f 11311/6141/13877 11313/6143/13877 11583/6422/13877 11581/6420/13877 +f 11313/6143/13878 11314/6144/13878 11584/6423/13878 11583/6422/13878 +f 11314/6144/13879 11312/6142/13879 11582/6421/13879 11584/6423/13879 +f 11316/6146/13880 11315/6145/13880 11585/6424/13880 11586/6425/13880 +f 11315/6145/13881 11317/6147/13881 11587/6426/13881 11585/6424/13881 +f 11317/6147/13882 11318/6148/13882 11588/6427/13882 11587/6426/13882 +f 11318/6148/13883 11316/6146/13883 11586/6425/13883 11588/6427/13883 +f 11320/6150/13884 11319/6149/13884 11589/6428/13884 11590/6429/13884 +f 11319/6149/13885 11321/6151/13885 11591/6430/13885 11589/6428/13885 +f 11321/6151/13886 11322/6152/13886 11592/6431/13886 11591/6430/13886 +f 11322/6152/13887 11320/6150/13887 11590/6429/13887 11592/6431/13887 +f 11324/6154/13888 11323/6153/13888 11593/6432/13888 11594/6433/13888 +f 11323/6153/13889 11325/6155/13889 11595/6434/13889 11593/6432/13889 +f 11325/6155/13890 11326/6156/13890 11596/6435/13890 11595/6434/13890 +f 11326/6156/13891 11324/6154/13891 11594/6433/13891 11596/6435/13891 +f 11328/6158/13892 11327/6157/13892 11597/6436/13892 11598/6437/13892 +f 11327/6157/13893 11329/6159/13893 11599/6438/13893 11597/6436/13893 +f 11329/6159/13894 11330/6160/13894 11600/6439/13894 11599/6438/13894 +f 11330/6160/13895 11328/6158/13895 11598/6437/13895 11600/6439/13895 +f 11332/6162/13896 11331/6161/13896 11601/6440/13896 11602/6441/13896 +f 11331/6161/13897 11333/6163/13897 11603/6442/13897 11601/6440/13897 +f 11333/6163/13898 11334/6164/13898 11604/6443/13898 11603/6442/13898 +f 11334/6164/13899 11332/6162/13899 11602/6441/13899 11604/6443/13899 +f 11336/6166/13900 11335/6165/13900 11605/6444/13900 11606/6445/13900 +f 11335/6165/13901 11337/6167/13901 11607/6446/13901 11605/6444/13901 +f 11337/6167/13902 11338/6168/13902 11608/6447/13902 11607/6446/13902 +f 11338/6168/13903 11336/6166/13903 11606/6445/13903 11608/6447/13903 +f 11340/6170/13904 11339/6169/13904 11609/6448/13904 11610/6449/13904 +f 11339/6169/13905 11341/6171/13905 11611/6450/13905 11609/6448/13905 +f 11341/6171/13906 11340/6170/13906 11610/6449/13906 11611/6450/13906 +f 11343/6173/13907 11342/6172/13907 11612/6451/13907 11613/6452/13907 +f 11342/6172/13908 11344/6174/13908 11614/6453/13908 11612/6451/13908 +f 11344/6174/13909 11343/6173/13909 11613/6452/13909 11614/6453/13909 +f 11346/6176/13910 11345/6175/13910 11615/6454/13910 11616/6455/13910 +f 11345/6175/13911 11347/6177/13911 11617/6456/13911 11615/6454/13911 +f 11347/6177/13912 11346/6176/13912 11616/6455/13912 11617/6456/13912 +f 11349/6179/13913 11348/6178/13913 11618/6457/13913 11619/6458/13913 +f 11348/6178/13914 11350/6180/13914 11620/6459/13914 11618/6457/13914 +f 11350/6180/13915 11349/6179/13915 11619/6458/13915 11620/6459/13915 +f 11352/6182/13916 11351/6181/13916 11621/6460/13916 11622/6461/13916 +f 11351/6184/13917 11353/6183/13917 11623/6462/13917 11621/6463/13917 +f 11353/6464/13918 11352/6182/13918 11622/6461/13918 11623/6465/13918 +f 11355/6188/13919 11354/6187/13919 11624/6466/13919 11625/6467/13919 +f 11354/6187/13920 11356/6189/13920 11626/6468/13920 11624/6466/13920 +f 11356/6189/13921 11355/6188/13921 11625/6467/13921 11626/6468/13921 +f 11358/6191/13922 11357/6190/13922 11627/6469/13922 11628/6470/13922 +f 11357/6190/13923 11359/6192/13923 11629/6471/13923 11627/6469/13923 +f 11359/6192/13924 11358/6191/13924 11628/6470/13924 11629/6471/13924 +f 11361/6194/13925 11360/6193/13925 11630/6472/13925 11631/6473/13925 +f 11360/6193/13926 11362/6195/13926 11632/6474/13926 11630/6472/13926 +f 11362/6195/13927 11361/6194/13927 11631/6473/13927 11632/6474/13927 +f 11364/6197/13928 11363/6196/13928 11633/6475/13928 11634/6476/13928 +f 11363/6196/13929 11365/6198/13929 11635/6477/13929 11633/6475/13929 +f 11365/6198/13930 11364/6197/13930 11634/6476/13930 11635/6477/13930 +f 11367/6200/13931 11366/6199/13931 11636/6478/13931 11637/6479/13931 +f 11366/6199/13932 11368/6201/13932 11638/6480/13932 11636/6478/13932 +f 11368/6201/13933 11367/6200/13933 11637/6479/13933 11638/6480/13933 +f 11370/6203/13934 11369/6202/13934 11639/6481/13934 11640/6482/13934 +f 11369/6202/13935 11371/6204/13935 11641/6483/13935 11639/6481/13935 +f 11371/6204/13936 11370/6203/13936 11640/6482/13936 11641/6483/13936 +f 11373/6206/13937 11372/6205/13937 11642/6484/13937 11643/6485/13937 +f 11372/6205/13938 11374/6207/13938 11644/6486/13938 11642/6484/13938 +f 11374/6207/13939 11373/6206/13939 11643/6485/13939 11644/6486/13939 +f 11376/6209/13940 11375/6208/13940 11645/6487/13940 11646/6488/13940 +f 11375/6208/13941 11377/6210/13941 11647/6489/13941 11645/6487/13941 +f 11377/6210/13942 11376/6209/13942 11646/6488/13942 11647/6489/13942 +f 11379/6212/13943 11378/6211/13943 11648/6490/13943 11649/6491/13943 +f 11378/6211/13944 11380/6213/13944 11650/6492/13944 11648/6490/13944 +f 11380/6213/13945 11379/6212/13945 11649/6491/13945 11650/6492/13945 +f 11382/6215/13946 11381/6214/13946 11651/6493/13946 11652/6494/13946 +f 11381/6214/13947 11383/6216/13947 11653/6495/13947 11651/6493/13947 +f 11383/6216/13948 11382/6215/13948 11652/6494/13948 11653/6495/13948 +f 11385/6218/13949 11384/6217/13949 11654/6496/13949 11655/6497/13949 +f 11384/6217/13950 11386/6219/13950 11656/6498/13950 11654/6496/13950 +f 11386/6219/13951 11385/6218/13951 11655/6497/13951 11656/6498/13951 +f 11388/6221/13952 11387/6220/13952 11657/6499/13952 11658/6500/13952 +f 11387/6220/13953 11389/6222/13953 11659/6501/13953 11657/6499/13953 +f 11389/6222/13954 11388/6221/13954 11658/6500/13954 11659/6501/13954 +f 11391/6224/13955 11390/6223/13955 11660/6502/13955 11661/6503/13955 +f 11390/6223/13956 11392/6225/13956 11662/6504/13956 11660/6502/13956 +f 11392/6225/13957 11391/6224/13957 11661/6503/13957 11662/6504/13957 +f 11394/6227/13958 11393/6226/13958 11663/6505/13958 11664/6506/13958 +f 11393/6226/13959 11395/6228/13959 11665/6507/13959 11663/6505/13959 +f 11395/6228/13960 11396/6229/13960 11666/6508/13960 11665/6507/13960 +f 11396/6229/13961 11394/6227/13961 11664/6506/13961 11666/6508/13961 +f 11398/6231/13962 11397/6230/13962 11667/6509/13962 11668/6510/13962 +f 11397/6230/13963 11399/6232/13963 11669/6511/13963 11667/6509/13963 +f 11399/6232/13964 11400/6233/13964 11670/6512/13964 11669/6511/13964 +f 11400/6233/13965 11398/6231/13965 11668/6510/13965 11670/6512/13965 +f 11402/6235/13966 11401/6234/13966 11671/6513/13966 11672/6514/13966 +f 11401/6234/13967 11403/6236/13967 11673/6515/13967 11671/6513/13967 +f 11403/6236/13968 11404/6237/13968 11674/6516/13968 11673/6515/13968 +f 11404/6237/13969 11402/6235/13969 11672/6514/13969 11674/6516/13969 +f 11406/6239/13970 11405/6238/13970 11675/6517/13970 11676/6518/13970 +f 11405/6238/13971 11407/6240/13971 11677/6519/13971 11675/6517/13971 +f 11407/6240/13972 11408/6241/13972 11678/6520/13972 11677/6519/13972 +f 11408/6241/13973 11406/6239/13973 11676/6518/13973 11678/6520/13973 +f 11410/6243/13974 11409/6242/13974 11679/6521/13974 11680/6522/13974 +f 11409/6245/13975 11411/6244/13975 11681/6523/13975 11679/6524/13975 +f 11411/6244/13976 11412/6246/13976 11682/6525/13976 11681/6523/13976 +f 11412/6247/13977 11410/6243/13977 11680/6522/13977 11682/6526/13977 +f 11414/6249/13978 11413/6248/13978 11683/6527/13978 11684/6528/13978 +f 11413/6248/13979 11415/6250/13979 11685/6529/13979 11683/6527/13979 +f 11415/6250/13980 11416/6251/13980 11686/6530/13980 11685/6529/13980 +f 11416/6251/13981 11414/6249/13981 11684/6528/13981 11686/6530/13981 +f 11418/6253/13982 11417/6252/13982 11687/6531/13982 11688/6532/13982 +f 11417/6252/13983 11419/6254/13983 11689/6533/13983 11687/6531/13983 +f 11419/6254/13984 11420/6255/13984 11690/6534/13984 11689/6533/13984 +f 11420/6255/13985 11418/6253/13985 11688/6532/13985 11690/6534/13985 +f 11422/6257/13986 11421/6256/13986 11691/6535/13986 11692/6536/13986 +f 11421/6256/13987 11423/6258/13987 11693/6537/13987 11691/6535/13987 +f 11423/6258/13988 11424/6259/13988 11694/6538/13988 11693/6537/13988 +f 11424/6259/13989 11422/6257/13989 11692/6536/13989 11694/6538/13989 +f 11426/6261/13990 11425/6260/13990 11695/6539/13990 11696/6540/13990 +f 11425/6260/13991 11427/6262/13991 11697/6541/13991 11695/6539/13991 +f 11427/6262/13992 11428/6263/13992 11698/6542/13992 11697/6541/13992 +f 11428/6263/13993 11426/6261/13993 11696/6540/13993 11698/6542/13993 +f 11430/6265/13994 11429/6264/13994 11699/6543/13994 11700/6544/13994 +f 11429/6264/13995 11431/6266/13995 11701/6545/13995 11699/6543/13995 +f 11431/6266/13996 11432/6267/13996 11702/6546/13996 11701/6545/13996 +f 11432/6267/13997 11430/6265/13997 11700/6544/13997 11702/6546/13997 +f 11434/6269/13998 11433/6268/13998 11703/6547/13998 11704/6548/13998 +f 11433/6268/13999 11435/6270/13999 11705/6549/13999 11703/6547/13999 +f 11435/6270/14000 11436/6271/14000 11706/6550/14000 11705/6549/14000 +f 11436/6271/14001 11434/6269/14001 11704/6548/14001 11706/6550/14001 +f 11438/6273/14002 11437/6272/14002 11707/6551/14002 11708/6552/14002 +f 11437/6272/14003 11439/6274/14003 11709/6553/14003 11707/6551/14003 +f 11439/6274/14004 11440/6275/14004 11710/6554/14004 11709/6553/14004 +f 11440/6275/14005 11438/6273/14005 11708/6552/14005 11710/6554/14005 +f 11442/6277/14006 11441/6276/14006 11711/6555/14006 11712/6556/14006 +f 11441/6276/14007 11443/6278/14007 11713/6557/14007 11711/6555/14007 +f 11443/6278/14008 11444/6279/14008 11714/6558/14008 11713/6557/14008 +f 11444/6279/14009 11442/6277/14009 11712/6556/14009 11714/6558/14009 +f 11446/6281/14010 11445/6280/14010 11715/6559/14010 11716/6560/14010 +f 11445/6280/14011 11447/6282/14011 11717/6561/14011 11715/6559/14011 +f 11447/6282/14012 11448/6283/14012 11718/6562/14012 11717/6561/14012 +f 11448/6283/14013 11446/6281/14013 11716/6560/14013 11718/6562/14013 +f 11450/6285/14014 11449/6284/14014 11719/6563/14014 11720/6564/14014 +f 11449/6284/14015 11451/6286/14015 11721/6565/14015 11719/6563/14015 +f 11451/6286/14016 11452/6287/14016 11722/6566/14016 11721/6565/14016 +f 11452/6287/14017 11450/6285/14017 11720/6564/14017 11722/6566/14017 +f 11454/6289/14018 11453/6288/14018 11723/6567/14018 11724/6568/14018 +f 11453/6288/14019 11455/6290/14019 11725/6569/14019 11723/6567/14019 +f 11455/6290/14020 11456/6291/14020 11726/6570/14020 11725/6569/14020 +f 11456/6291/14021 11454/6289/14021 11724/6568/14021 11726/6570/14021 +f 11458/6293/14022 11457/6292/14022 11727/6571/14022 11728/6572/14022 +f 11457/6292/14023 11459/6294/14023 11729/6573/14023 11727/6571/14023 +f 11459/6294/14024 11460/6295/14024 11730/6574/14024 11729/6573/14024 +f 11460/6295/14025 11458/6293/14025 11728/6572/14025 11730/6574/14025 +f 11462/6297/14026 11461/6296/14026 11731/6575/14026 11732/6576/14026 +f 11461/6296/14027 11463/6298/14027 11733/6577/14027 11731/6575/14027 +f 11463/6298/14028 11464/6299/14028 11734/6578/14028 11733/6577/14028 +f 11464/6299/14029 11462/6297/14029 11732/6576/14029 11734/6578/14029 +f 11466/6301/14030 11465/6300/14030 11735/6579/14030 11736/6580/14030 +f 11465/6300/14031 11467/6302/14031 11737/6581/14031 11735/6579/14031 +f 11467/6302/14032 11468/6303/14032 11738/6582/14032 11737/6581/14032 +f 11468/6303/14033 11466/6301/14033 11736/6580/14033 11738/6582/14033 +f 11470/6305/14034 11469/6304/14034 11739/6583/14034 11740/6584/14034 +f 11469/6304/14035 11471/6306/14035 11741/6585/14035 11739/6583/14035 +f 11471/6306/14036 11472/6307/14036 11742/6586/14036 11741/6585/14036 +f 11472/6307/14037 11470/6305/14037 11740/6584/14037 11742/6586/14037 +f 11474/6309/14038 11473/6308/14038 11743/6587/14038 11744/6588/14038 +f 11473/6308/14039 11475/6310/14039 11745/6589/14039 11743/6587/14039 +f 11475/6310/14040 11476/6311/14040 11746/6590/14040 11745/6589/14040 +f 11476/6311/14041 11474/6309/14041 11744/6588/14041 11746/6590/14041 +f 11478/6313/14042 11477/6312/14042 11747/6591/14042 11748/6592/14042 +f 11477/6312/14043 11479/6314/14043 11749/6593/14043 11747/6591/14043 +f 11479/6314/14044 11480/6315/14044 11750/6594/14044 11749/6593/14044 +f 11480/6315/14045 11478/6313/14045 11748/6592/14045 11750/6594/14045 +f 11482/6317/14046 11481/6316/14046 11751/6595/14046 11752/6596/14046 +f 11481/6319/14047 11483/6318/14047 11753/6597/14047 11751/6598/14047 +f 11483/6318/14048 11484/6320/14048 11754/6599/14048 11753/6597/14048 +f 11484/6321/14049 11482/6317/14049 11752/6596/14049 11754/6600/14049 +f 11486/6323/14050 11485/6322/14050 11755/6601/14050 11756/6602/14050 +f 11485/6322/14051 11487/6324/14051 11757/6603/14051 11755/6601/14051 +f 11487/6324/14052 11488/6325/14052 11758/6604/14052 11757/6603/14052 +f 11488/6325/14053 11486/6323/14053 11756/6602/14053 11758/6604/14053 +f 11490/6327/14054 11489/6326/14054 11759/6605/14054 11760/6606/14054 +f 11489/6326/14055 11491/6328/14055 11761/6607/14055 11759/6605/14055 +f 11491/6328/14056 11492/6329/14056 11762/6608/14056 11761/6607/14056 +f 11492/6329/14057 11490/6327/14057 11760/6606/14057 11762/6608/14057 +f 11494/6331/14058 11493/6330/14058 11763/6609/14058 11764/6610/14058 +f 11493/6330/14059 11495/6332/14059 11765/6611/14059 11763/6609/14059 +f 11495/6332/14060 11496/6333/14060 11766/6612/14060 11765/6611/14060 +f 11496/6333/14061 11494/6331/14061 11764/6610/14061 11766/6612/14061 +f 11498/6335/14062 11497/6334/14062 11767/6613/14062 11768/6614/14062 +f 11497/6334/14063 11499/6336/14063 11769/6615/14063 11767/6613/14063 +f 11499/6336/14064 11500/6337/14064 11770/6616/14064 11769/6615/14064 +f 11500/6337/14065 11498/6335/14065 11768/6614/14065 11770/6616/14065 +f 11502/6339/14066 11501/6338/14066 11771/6617/14066 11772/6618/14066 +f 11501/6338/14067 11503/6340/14067 11773/6619/14067 11771/6617/14067 +f 11503/6340/14068 11504/6341/14068 11774/6620/14068 11773/6619/14068 +f 11504/6341/14069 11502/6339/14069 11772/6618/14069 11774/6620/14069 +f 11506/6343/14070 11505/6342/14070 11775/6621/14070 11776/6622/14070 +f 11505/6342/14071 11507/6344/14071 11777/6623/14071 11775/6621/14071 +f 11507/6344/14072 11508/6345/14072 11778/6624/14072 11777/6623/14072 +f 11508/6345/14073 11506/6343/14073 11776/6622/14073 11778/6624/14073 +f 11510/6347/14074 11509/6346/14074 11779/6625/14074 11780/6626/14074 +f 11509/6346/14075 11511/6348/14075 11781/6627/14075 11779/6625/14075 +f 11511/6348/14076 11512/6349/14076 11782/6628/14076 11781/6627/14076 +f 11512/6349/14077 11510/6347/14077 11780/6626/14077 11782/6628/14077 +f 11514/6351/14078 11513/6350/14078 11783/6629/14078 11784/6630/14078 +f 11513/6350/14079 11515/6352/14079 11785/6631/14079 11783/6629/14079 +f 11515/6352/14080 11516/6353/14080 11786/6632/14080 11785/6631/14080 +f 11516/6353/14081 11514/6351/14081 11784/6630/14081 11786/6632/14081 +f 11518/6355/14082 11517/6354/14082 11787/6633/14082 11788/6634/14082 +f 11517/6354/14083 11519/6356/14083 11789/6635/14083 11787/6633/14083 +f 11519/6356/14084 11520/6357/14084 11790/6636/14084 11789/6635/14084 +f 11520/6357/14085 11518/6355/14085 11788/6634/14085 11790/6636/14085 +f 11522/6359/14086 11521/6358/14086 11791/6637/14086 11792/6638/14086 +f 11521/6358/14087 11523/6360/14087 11793/6639/14087 11791/6637/14087 +f 11523/6360/14088 11524/6361/14088 11794/6640/14088 11793/6639/14088 +f 11524/6361/14089 11522/6359/14089 11792/6638/14089 11794/6640/14089 +f 11526/6363/14090 11525/6362/14090 11795/6641/14090 11796/6642/14090 +f 11525/6362/14091 11527/6364/14091 11797/6643/14091 11795/6641/14091 +f 11527/6364/14092 11528/6365/14092 11798/6644/14092 11797/6643/14092 +f 11528/6365/14093 11526/6363/14093 11796/6642/14093 11798/6644/14093 +f 11530/6367/14094 11529/6366/14094 11799/6645/14094 11800/6646/14094 +f 11529/6366/14095 11531/6368/14095 11801/6647/14095 11799/6645/14095 +f 11531/6368/14096 11532/6369/14096 11802/6648/14096 11801/6647/14096 +f 11532/6369/14097 11530/6367/14097 11800/6646/14097 11802/6648/14097 +f 11534/6371/14098 11533/6370/14098 11803/6649/14098 11804/6650/14098 +f 11533/6370/14099 11535/6372/14099 11805/6651/14099 11803/6649/14099 +f 11535/6372/14100 11536/6373/14100 11806/6652/14100 11805/6651/14100 +f 11536/6373/14101 11534/6371/14101 11804/6650/14101 11806/6652/14101 +f 11538/6375/14102 11537/6374/14102 11807/6653/14102 11808/6654/14102 +f 11537/6374/14103 11539/6376/14103 11809/6655/14103 11807/6653/14103 +f 11539/6376/14104 11540/6377/14104 11810/6656/14104 11809/6655/14104 +f 11540/6377/14105 11538/6375/14105 11808/6654/14105 11810/6656/14105 +f 11542/6379/14106 11541/6378/14106 11811/6657/14106 11812/6658/14106 +f 11541/6378/14107 11543/6380/14107 11813/6659/14107 11811/6657/14107 +f 11543/6380/14108 11544/6381/14108 11814/6660/14108 11813/6659/14108 +f 11544/6381/14109 11542/6379/14109 11812/6658/14109 11814/6660/14109 +f 11546/6383/14110 11545/6382/14110 11815/6661/14110 11816/6662/14110 +f 11545/6382/14111 11547/6384/14111 11817/6663/14111 11815/6661/14111 +f 11547/6384/14112 11548/6385/14112 11818/6664/14112 11817/6663/14112 +f 11548/6385/14113 11546/6383/14113 11816/6662/14113 11818/6664/14113 +f 11550/6387/14114 11549/6386/14114 11819/6665/14114 11820/6666/14114 +f 11549/6386/14115 11551/6388/14115 11821/6667/14115 11819/6665/14115 +f 11551/6388/14116 11552/6389/14116 11822/6668/14116 11821/6667/14116 +f 11552/6389/14117 11550/6387/14117 11820/6666/14117 11822/6668/14117 +f 11554/6391/14118 11553/6390/14118 11823/6669/14118 11824/6670/14118 +f 11553/6393/14119 11555/6392/14119 11825/6671/14119 11823/6672/14119 +f 11555/6392/14120 11556/6394/14120 11826/6673/14120 11825/6671/14120 +f 11556/6395/14121 11554/6391/14121 11824/6670/14121 11826/6674/14121 +f 11558/6397/14122 11557/6396/14122 11827/6675/14122 11828/6676/14122 +f 11557/6396/14123 11559/6398/14123 11829/6677/14123 11827/6675/14123 +f 11559/6398/14124 11560/6399/14124 11830/6678/14124 11829/6677/14124 +f 11560/6399/14125 11558/6397/14125 11828/6676/14125 11830/6678/14125 +f 11562/6401/14126 11561/6400/14126 11831/6679/14126 11832/6680/14126 +f 11561/6400/14127 11563/6402/14127 11833/6681/14127 11831/6679/14127 +f 11563/6402/14128 11564/6403/14128 11834/6682/14128 11833/6681/14128 +f 11564/6403/14129 11562/6401/14129 11832/6680/14129 11834/6682/14129 +f 11566/6405/14130 11565/6404/14130 11835/6683/14130 11836/6684/14130 +f 11565/6404/14131 11567/6406/14131 11837/6685/14131 11835/6683/14131 +f 11567/6406/14132 11568/6407/14132 11838/6686/14132 11837/6685/14132 +f 11568/6407/14133 11566/6405/14133 11836/6684/14133 11838/6686/14133 +f 11570/6409/14134 11569/6408/14134 11839/6687/14134 11840/6688/14134 +f 11569/6408/14135 11571/6410/14135 11841/6689/14135 11839/6687/14135 +f 11571/6410/14136 11572/6411/14136 11842/6690/14136 11841/6689/14136 +f 11572/6411/14137 11570/6409/14137 11840/6688/14137 11842/6690/14137 +f 11574/6413/14138 11573/6412/14138 11843/6691/14138 11844/6692/14138 +f 11573/6412/14139 11575/6414/14139 11845/6693/14139 11843/6691/14139 +f 11575/6414/14140 11576/6415/14140 11846/6694/14140 11845/6693/14140 +f 11576/6415/14141 11574/6413/14141 11844/6692/14141 11846/6694/14141 +f 11578/6417/14142 11577/6416/14142 11847/6695/14142 11848/6696/14142 +f 11577/6416/14143 11579/6418/14143 11849/6697/14143 11847/6695/14143 +f 11579/6418/14144 11580/6419/14144 11850/6698/14144 11849/6697/14144 +f 11580/6419/14145 11578/6417/14145 11848/6696/14145 11850/6698/14145 +f 11582/6421/14146 11581/6420/14146 11851/6699/14146 11852/6700/14146 +f 11581/6420/14147 11583/6422/14147 11853/6701/14147 11851/6699/14147 +f 11583/6422/14148 11584/6423/14148 11854/6702/14148 11853/6701/14148 +f 11584/6423/14149 11582/6421/14149 11852/6700/14149 11854/6702/14149 +f 11586/6425/14150 11585/6424/14150 11855/6703/14150 11856/6704/14150 +f 11585/6424/14151 11587/6426/14151 11857/6705/14151 11855/6703/14151 +f 11587/6426/14152 11588/6427/14152 11858/6706/14152 11857/6705/14152 +f 11588/6427/14153 11586/6425/14153 11856/6704/14153 11858/6706/14153 +f 11590/6429/14154 11589/6428/14154 11859/6707/14154 11860/6708/14154 +f 11589/6428/14155 11591/6430/14155 11861/6709/14155 11859/6707/14155 +f 11591/6430/14156 11592/6431/14156 11862/6710/14156 11861/6709/14156 +f 11592/6431/14157 11590/6429/14157 11860/6708/14157 11862/6710/14157 +f 11594/6433/14158 11593/6432/14158 11863/6711/14158 11864/6712/14158 +f 11593/6432/14159 11595/6434/14159 11865/6713/14159 11863/6711/14159 +f 11595/6434/14160 11596/6435/14160 11866/6714/14160 11865/6713/14160 +f 11596/6435/14161 11594/6433/14161 11864/6712/14161 11866/6714/14161 +f 11598/6437/14162 11597/6436/14162 11867/6715/14162 11868/6716/14162 +f 11597/6436/14163 11599/6438/14163 11869/6717/14163 11867/6715/14163 +f 11599/6438/14164 11600/6439/14164 11870/6718/14164 11869/6717/14164 +f 11600/6439/14165 11598/6437/14165 11868/6716/14165 11870/6718/14165 +f 11602/6441/14166 11601/6440/14166 11871/6719/14166 11872/6720/14166 +f 11601/6440/14167 11603/6442/14167 11873/6721/14167 11871/6719/14167 +f 11603/6442/14168 11604/6443/14168 11874/6722/14168 11873/6721/14168 +f 11604/6443/14169 11602/6441/14169 11872/6720/14169 11874/6722/14169 +f 11606/6445/14170 11605/6444/14170 11875/6723/14170 11876/6724/14170 +f 11605/6444/14171 11607/6446/14171 11877/6725/14171 11875/6723/14171 +f 11607/6446/14172 11608/6447/14172 11878/6726/14172 11877/6725/14172 +f 11608/6447/14173 11606/6445/14173 11876/6724/14173 11878/6726/14173 +f 11610/6449/14174 11609/6448/14174 11879/6727/14174 11880/6728/14174 +f 11609/6448/14175 11611/6450/14175 11881/6729/14175 11879/6727/14175 +f 11611/6450/14176 11610/6449/14176 11880/6728/14176 11881/6729/14176 +f 11613/6452/14177 11612/6451/14177 11882/6730/14177 11883/6731/14177 +f 11612/6451/14178 11614/6453/14178 11884/6732/14178 11882/6730/14178 +f 11614/6453/14179 11613/6452/14179 11883/6731/14179 11884/6732/14179 +f 11616/6455/14180 11615/6454/14180 11885/6733/14180 11886/6734/14180 +f 11615/6454/14181 11617/6456/14181 11887/6735/14181 11885/6733/14181 +f 11617/6456/14182 11616/6455/14182 11886/6734/14182 11887/6735/14182 +f 11619/6458/14183 11618/6457/14183 11888/6736/14183 11889/6737/14183 +f 11618/6457/14184 11620/6459/14184 11890/6738/14184 11888/6736/14184 +f 11620/6459/14185 11619/6458/14185 11889/6737/14185 11890/6738/14185 +f 11622/6461/14186 11621/6460/14186 11891/6739/14186 11892/6740/14186 +f 11621/6463/14187 11623/6462/14187 11893/6741/14187 11891/6742/14187 +f 11623/6465/14188 11622/6461/14188 11892/6740/14188 11893/6743/14188 +f 11625/6467/14189 11624/6466/14189 11894/6744/14189 11895/6745/14189 +f 11624/6466/14190 11626/6468/14190 11896/6746/14190 11894/6744/14190 +f 11626/6468/14191 11625/6467/14191 11895/6745/14191 11896/6746/14191 +f 11628/6470/14192 11627/6469/14192 11897/6747/14192 11898/6748/14192 +f 11627/6469/14193 11629/6471/14193 11899/6749/14193 11897/6747/14193 +f 11629/6471/14194 11628/6470/14194 11898/6748/14194 11899/6749/14194 +f 11631/6473/14195 11630/6472/14195 11900/6750/14195 11901/6751/14195 +f 11630/6472/14196 11632/6474/14196 11902/6752/14196 11900/6750/14196 +f 11632/6474/14197 11631/6473/14197 11901/6751/14197 11902/6752/14197 +f 11634/6476/14198 11633/6475/14198 11903/6753/14198 11904/6754/14198 +f 11633/6475/14199 11635/6477/14199 11905/6755/14199 11903/6753/14199 +f 11635/6477/14200 11634/6476/14200 11904/6754/14200 11905/6755/14200 +f 11637/6479/14201 11636/6478/14201 11906/6756/14201 11907/6757/14201 +f 11636/6478/14202 11638/6480/14202 11908/6758/14202 11906/6756/14202 +f 11638/6480/14203 11637/6479/14203 11907/6757/14203 11908/6758/14203 +f 11640/6482/14204 11639/6481/14204 11909/6759/14204 11910/6760/14204 +f 11639/6481/14205 11641/6483/14205 11911/6761/14205 11909/6759/14205 +f 11641/6483/14206 11640/6482/14206 11910/6760/14206 11911/6761/14206 +f 11643/6485/14207 11642/6484/14207 11912/6762/14207 11913/6763/14207 +f 11642/6484/14208 11644/6486/14208 11914/6764/14208 11912/6762/14208 +f 11644/6486/14209 11643/6485/14209 11913/6763/14209 11914/6764/14209 +f 11646/6488/14210 11645/6487/14210 11915/6765/14210 11916/6766/14210 +f 11645/6487/14211 11647/6489/14211 11917/6767/14211 11915/6765/14211 +f 11647/6489/14212 11646/6488/14212 11916/6766/14212 11917/6767/14212 +f 11649/6491/14213 11648/6490/14213 11918/6768/14213 11919/6769/14213 +f 11648/6490/14214 11650/6492/14214 11920/6770/14214 11918/6768/14214 +f 11650/6492/14215 11649/6491/14215 11919/6769/14215 11920/6770/14215 +f 11652/6494/14216 11651/6493/14216 11921/6771/14216 11922/6772/14216 +f 11651/6493/14217 11653/6495/14217 11923/6773/14217 11921/6771/14217 +f 11653/6495/14218 11652/6494/14218 11922/6772/14218 11923/6773/14218 +f 11655/6497/14219 11654/6496/14219 11924/6774/14219 11925/6775/14219 +f 11654/6496/14220 11656/6498/14220 11926/6776/14220 11924/6774/14220 +f 11656/6498/14221 11655/6497/14221 11925/6775/14221 11926/6776/14221 +f 11658/6500/14222 11657/6499/14222 11927/6777/14222 11928/6778/14222 +f 11657/6499/14223 11659/6501/14223 11929/6779/14223 11927/6777/14223 +f 11659/6501/14224 11658/6500/14224 11928/6778/14224 11929/6779/14224 +f 11661/6503/14225 11660/6502/14225 11930/6780/14225 11931/6781/14225 +f 11660/6502/14226 11662/6504/14226 11932/6782/14226 11930/6780/14226 +f 11662/6504/14227 11661/6503/14227 11931/6781/14227 11932/6782/14227 +f 11664/6506/14228 11663/6505/14228 11933/6783/14228 11934/6784/14228 +f 11663/6505/14229 11665/6507/14229 11935/6785/14229 11933/6783/14229 +f 11665/6507/14230 11666/6508/14230 11936/6786/14230 11935/6785/14230 +f 11666/6508/14231 11664/6506/14231 11934/6784/14231 11936/6786/14231 +f 11668/6510/14232 11667/6509/14232 11937/6787/14232 11938/6788/14232 +f 11667/6509/14233 11669/6511/14233 11939/6789/14233 11937/6787/14233 +f 11669/6511/14234 11670/6512/14234 11940/6790/14234 11939/6789/14234 +f 11670/6512/14235 11668/6510/14235 11938/6788/14235 11940/6790/14235 +f 11672/6514/14236 11671/6513/14236 11941/6791/14236 11942/6792/14236 +f 11671/6513/14237 11673/6515/14237 11943/6793/14237 11941/6791/14237 +f 11673/6515/14238 11674/6516/14238 11944/6794/14238 11943/6793/14238 +f 11674/6516/14239 11672/6514/14239 11942/6792/14239 11944/6794/14239 +f 11676/6518/14240 11675/6517/14240 11945/6795/14240 11946/6796/14240 +f 11675/6517/14241 11677/6519/14241 11947/6797/14241 11945/6795/14241 +f 11677/6519/14242 11678/6520/14242 11948/6798/14242 11947/6797/14242 +f 11678/6520/14243 11676/6518/14243 11946/6796/14243 11948/6798/14243 +f 11680/6522/14244 11679/6521/14244 11949/6799/14244 11950/6800/14244 +f 11679/6524/14245 11681/6523/14245 11951/6801/14245 11949/6802/14245 +f 11681/6523/14246 11682/6525/14246 11952/6803/14246 11951/6801/14246 +f 11682/6526/14247 11680/6522/14247 11950/6800/14247 11952/6804/14247 +f 11684/6528/14248 11683/6527/14248 11953/6805/14248 11954/6806/14248 +f 11683/6527/14249 11685/6529/14249 11955/6807/14249 11953/6805/14249 +f 11685/6529/14250 11686/6530/14250 11956/6808/14250 11955/6807/14250 +f 11686/6530/14251 11684/6528/14251 11954/6806/14251 11956/6808/14251 +f 11688/6532/14252 11687/6531/14252 11957/6809/14252 11958/6810/14252 +f 11687/6531/14253 11689/6533/14253 11959/6811/14253 11957/6809/14253 +f 11689/6533/14254 11690/6534/14254 11960/6812/14254 11959/6811/14254 +f 11690/6534/14255 11688/6532/14255 11958/6810/14255 11960/6812/14255 +f 11692/6536/14256 11691/6535/14256 11961/6813/14256 11962/6814/14256 +f 11691/6535/14257 11693/6537/14257 11963/6815/14257 11961/6813/14257 +f 11693/6537/14258 11694/6538/14258 11964/6816/14258 11963/6815/14258 +f 11694/6538/14259 11692/6536/14259 11962/6814/14259 11964/6816/14259 +f 11696/6540/14260 11695/6539/14260 11965/6817/14260 11966/6818/14260 +f 11695/6539/14261 11697/6541/14261 11967/6819/14261 11965/6817/14261 +f 11697/6541/14262 11698/6542/14262 11968/6820/14262 11967/6819/14262 +f 11698/6542/14263 11696/6540/14263 11966/6818/14263 11968/6820/14263 +f 11700/6544/14264 11699/6543/14264 11969/6821/14264 11970/6822/14264 +f 11699/6543/14265 11701/6545/14265 11971/6823/14265 11969/6821/14265 +f 11701/6545/14266 11702/6546/14266 11972/6824/14266 11971/6823/14266 +f 11702/6546/14267 11700/6544/14267 11970/6822/14267 11972/6824/14267 +f 11704/6548/14268 11703/6547/14268 11973/6825/14268 11974/6826/14268 +f 11703/6547/14269 11705/6549/14269 11975/6827/14269 11973/6825/14269 +f 11705/6549/14270 11706/6550/14270 11976/6828/14270 11975/6827/14270 +f 11706/6550/14271 11704/6548/14271 11974/6826/14271 11976/6828/14271 +f 11708/6552/14272 11707/6551/14272 11977/6829/14272 11978/6830/14272 +f 11707/6551/14273 11709/6553/14273 11979/6831/14273 11977/6829/14273 +f 11709/6553/14274 11710/6554/14274 11980/6832/14274 11979/6831/14274 +f 11710/6554/14275 11708/6552/14275 11978/6830/14275 11980/6832/14275 +f 11712/6556/14276 11711/6555/14276 11981/6833/14276 11982/6834/14276 +f 11711/6555/14277 11713/6557/14277 11983/6835/14277 11981/6833/14277 +f 11713/6557/14278 11714/6558/14278 11984/6836/14278 11983/6835/14278 +f 11714/6558/14279 11712/6556/14279 11982/6834/14279 11984/6836/14279 +f 11716/6560/14280 11715/6559/14280 11985/6837/14280 11986/6838/14280 +f 11715/6559/14281 11717/6561/14281 11987/6839/14281 11985/6837/14281 +f 11717/6561/14282 11718/6562/14282 11988/6840/14282 11987/6839/14282 +f 11718/6562/14283 11716/6560/14283 11986/6838/14283 11988/6840/14283 +f 11720/6564/14284 11719/6563/14284 11989/6841/14284 11990/6842/14284 +f 11719/6563/14285 11721/6565/14285 11991/6843/14285 11989/6841/14285 +f 11721/6565/14286 11722/6566/14286 11992/6844/14286 11991/6843/14286 +f 11722/6566/14287 11720/6564/14287 11990/6842/14287 11992/6844/14287 +f 11724/6568/14288 11723/6567/14288 11993/6845/14288 11994/6846/14288 +f 11723/6567/14289 11725/6569/14289 11995/6847/14289 11993/6845/14289 +f 11725/6569/14290 11726/6570/14290 11996/6848/14290 11995/6847/14290 +f 11726/6570/14291 11724/6568/14291 11994/6846/14291 11996/6848/14291 +f 11728/6572/14292 11727/6571/14292 11997/6849/14292 11998/6850/14292 +f 11727/6571/14293 11729/6573/14293 11999/6851/14293 11997/6849/14293 +f 11729/6573/14294 11730/6574/14294 12000/6852/14294 11999/6851/14294 +f 11730/6574/14295 11728/6572/14295 11998/6850/14295 12000/6852/14295 +f 11732/6576/14296 11731/6575/14296 12001/6853/14296 12002/6854/14296 +f 11731/6575/14297 11733/6577/14297 12003/6855/14297 12001/6853/14297 +f 11733/6577/14298 11734/6578/14298 12004/6856/14298 12003/6855/14298 +f 11734/6578/14299 11732/6576/14299 12002/6854/14299 12004/6856/14299 +f 11736/6580/14300 11735/6579/14300 12005/6857/14300 12006/6858/14300 +f 11735/6579/14301 11737/6581/14301 12007/6859/14301 12005/6857/14301 +f 11737/6581/14302 11738/6582/14302 12008/6860/14302 12007/6859/14302 +f 11738/6582/14303 11736/6580/14303 12006/6858/14303 12008/6860/14303 +f 11740/6584/14304 11739/6583/14304 12009/6861/14304 12010/6862/14304 +f 11739/6583/14305 11741/6585/14305 12011/6863/14305 12009/6861/14305 +f 11741/6585/14306 11742/6586/14306 12012/6864/14306 12011/6863/14306 +f 11742/6586/14307 11740/6584/14307 12010/6862/14307 12012/6864/14307 +f 11744/6588/14308 11743/6587/14308 12013/6865/14308 12014/6866/14308 +f 11743/6587/14309 11745/6589/14309 12015/6867/14309 12013/6865/14309 +f 11745/6589/14310 11746/6590/14310 12016/6868/14310 12015/6867/14310 +f 11746/6590/14311 11744/6588/14311 12014/6866/14311 12016/6868/14311 +f 11748/6592/14312 11747/6591/14312 12017/6869/14312 12018/6870/14312 +f 11747/6591/14313 11749/6593/14313 12019/6871/14313 12017/6869/14313 +f 11749/6593/14314 11750/6594/14314 12020/6872/14314 12019/6871/14314 +f 11750/6594/14315 11748/6592/14315 12018/6870/14315 12020/6872/14315 +f 11752/6596/14316 11751/6595/14316 12021/6873/14316 12022/6874/14316 +f 11751/6598/14317 11753/6597/14317 12023/6875/14317 12021/6876/14317 +f 11753/6597/14318 11754/6599/14318 12024/6877/14318 12023/6875/14318 +f 11754/6600/14319 11752/6596/14319 12022/6874/14319 12024/6878/14319 +f 11756/6602/14320 11755/6601/14320 12025/6879/14320 12026/6880/14320 +f 11755/6601/14321 11757/6603/14321 12027/6881/14321 12025/6879/14321 +f 11757/6603/14322 11758/6604/14322 12028/6882/14322 12027/6881/14322 +f 11758/6604/14323 11756/6602/14323 12026/6880/14323 12028/6882/14323 +f 11760/6606/14324 11759/6605/14324 12029/6883/14324 12030/6884/14324 +f 11759/6605/14325 11761/6607/14325 12031/6885/14325 12029/6883/14325 +f 11761/6607/14326 11762/6608/14326 12032/6886/14326 12031/6885/14326 +f 11762/6608/14327 11760/6606/14327 12030/6884/14327 12032/6886/14327 +f 11764/6610/14328 11763/6609/14328 12033/6887/14328 12034/6888/14328 +f 11763/6609/14329 11765/6611/14329 12035/6889/14329 12033/6887/14329 +f 11765/6611/14330 11766/6612/14330 12036/6890/14330 12035/6889/14330 +f 11766/6612/14331 11764/6610/14331 12034/6888/14331 12036/6890/14331 +f 11768/6614/14332 11767/6613/14332 12037/6891/14332 12038/6892/14332 +f 11767/6613/14333 11769/6615/14333 12039/6893/14333 12037/6891/14333 +f 11769/6615/14334 11770/6616/14334 12040/6894/14334 12039/6893/14334 +f 11770/6616/14335 11768/6614/14335 12038/6892/14335 12040/6894/14335 +f 11772/6618/14336 11771/6617/14336 12041/6895/14336 12042/6896/14336 +f 11771/6617/14337 11773/6619/14337 12043/6897/14337 12041/6895/14337 +f 11773/6619/14338 11774/6620/14338 12044/6898/14338 12043/6897/14338 +f 11774/6620/14339 11772/6618/14339 12042/6896/14339 12044/6898/14339 +f 11776/6622/14340 11775/6621/14340 12045/6899/14340 12046/6900/14340 +f 11775/6621/14341 11777/6623/14341 12047/6901/14341 12045/6899/14341 +f 11777/6623/14342 11778/6624/14342 12048/6902/14342 12047/6901/14342 +f 11778/6624/14343 11776/6622/14343 12046/6900/14343 12048/6902/14343 +f 11780/6626/14344 11779/6625/14344 12049/6903/14344 12050/6904/14344 +f 11779/6625/14345 11781/6627/14345 12051/6905/14345 12049/6903/14345 +f 11781/6627/14346 11782/6628/14346 12052/6906/14346 12051/6905/14346 +f 11782/6628/14347 11780/6626/14347 12050/6904/14347 12052/6906/14347 +f 11784/6630/14348 11783/6629/14348 12053/6907/14348 12054/6908/14348 +f 11783/6629/14349 11785/6631/14349 12055/6909/14349 12053/6907/14349 +f 11785/6631/14350 11786/6632/14350 12056/6910/14350 12055/6909/14350 +f 11786/6632/14351 11784/6630/14351 12054/6908/14351 12056/6910/14351 +f 11788/6634/14352 11787/6633/14352 12057/6911/14352 12058/6912/14352 +f 11787/6633/14353 11789/6635/14353 12059/6913/14353 12057/6911/14353 +f 11789/6635/14354 11790/6636/14354 12060/6914/14354 12059/6913/14354 +f 11790/6636/14355 11788/6634/14355 12058/6912/14355 12060/6914/14355 +f 11792/6638/14356 11791/6637/14356 12061/6915/14356 12062/6916/14356 +f 11791/6637/14357 11793/6639/14357 12063/6917/14357 12061/6915/14357 +f 11793/6639/14358 11794/6640/14358 12064/6918/14358 12063/6917/14358 +f 11794/6640/14359 11792/6638/14359 12062/6916/14359 12064/6918/14359 +f 11796/6642/14360 11795/6641/14360 12065/6919/14360 12066/6920/14360 +f 11795/6641/14361 11797/6643/14361 12067/6921/14361 12065/6919/14361 +f 11797/6643/14362 11798/6644/14362 12068/6922/14362 12067/6921/14362 +f 11798/6644/14363 11796/6642/14363 12066/6920/14363 12068/6922/14363 +f 11800/6646/14364 11799/6645/14364 12069/6923/14364 12070/6924/14364 +f 11799/6645/14365 11801/6647/14365 12071/6925/14365 12069/6923/14365 +f 11801/6647/14366 11802/6648/14366 12072/6926/14366 12071/6925/14366 +f 11802/6648/14367 11800/6646/14367 12070/6924/14367 12072/6926/14367 +f 11804/6650/14368 11803/6649/14368 12073/6927/14368 12074/6928/14368 +f 11803/6649/14369 11805/6651/14369 12075/6929/14369 12073/6927/14369 +f 11805/6651/14370 11806/6652/14370 12076/6930/14370 12075/6929/14370 +f 11806/6652/14371 11804/6650/14371 12074/6928/14371 12076/6930/14371 +f 11808/6654/14372 11807/6653/14372 12077/6931/14372 12078/6932/14372 +f 11807/6653/14373 11809/6655/14373 12079/6933/14373 12077/6931/14373 +f 11809/6655/14374 11810/6656/14374 12080/6934/14374 12079/6933/14374 +f 11810/6656/14375 11808/6654/14375 12078/6932/14375 12080/6934/14375 +f 11812/6658/14376 11811/6657/14376 12081/6935/14376 12082/6936/14376 +f 11811/6657/14377 11813/6659/14377 12083/6937/14377 12081/6935/14377 +f 11813/6659/14378 11814/6660/14378 12084/6938/14378 12083/6937/14378 +f 11814/6660/14379 11812/6658/14379 12082/6936/14379 12084/6938/14379 +f 11816/6662/14380 11815/6661/14380 12085/6939/14380 12086/6940/14380 +f 11815/6661/14381 11817/6663/14381 12087/6941/14381 12085/6939/14381 +f 11817/6663/14382 11818/6664/14382 12088/6942/14382 12087/6941/14382 +f 11818/6664/14383 11816/6662/14383 12086/6940/14383 12088/6942/14383 +f 11820/6666/14384 11819/6665/14384 12089/6943/14384 12090/6944/14384 +f 11819/6665/14385 11821/6667/14385 12091/6945/14385 12089/6943/14385 +f 11821/6667/14386 11822/6668/14386 12092/6946/14386 12091/6945/14386 +f 11822/6668/14387 11820/6666/14387 12090/6944/14387 12092/6946/14387 +f 11824/6670/14388 11823/6669/14388 12093/6947/14388 12094/6948/14388 +f 11823/6672/14389 11825/6671/14389 12095/6949/14389 12093/6950/14389 +f 11825/6671/14390 11826/6673/14390 12096/6951/14390 12095/6949/14390 +f 11826/6674/14391 11824/6670/14391 12094/6948/14391 12096/6952/14391 +f 11828/6676/14392 11827/6675/14392 12097/6953/14392 12098/6954/14392 +f 11827/6675/14393 11829/6677/14393 12099/6955/14393 12097/6953/14393 +f 11829/6677/14394 11830/6678/14394 12100/6956/14394 12099/6955/14394 +f 11830/6678/14395 11828/6676/14395 12098/6954/14395 12100/6956/14395 +f 11832/6680/14396 11831/6679/14396 12101/6957/14396 12102/6958/14396 +f 11831/6679/14397 11833/6681/14397 12103/6959/14397 12101/6957/14397 +f 11833/6681/14398 11834/6682/14398 12104/6960/14398 12103/6959/14398 +f 11834/6682/14399 11832/6680/14399 12102/6958/14399 12104/6960/14399 +f 11836/6684/14400 11835/6683/14400 12105/6961/14400 12106/6962/14400 +f 11835/6683/14401 11837/6685/14401 12107/6963/14401 12105/6961/14401 +f 11837/6685/14402 11838/6686/14402 12108/6964/14402 12107/6963/14402 +f 11838/6686/14403 11836/6684/14403 12106/6962/14403 12108/6964/14403 +f 11840/6688/14404 11839/6687/14404 12109/6965/14404 12110/6966/14404 +f 11839/6687/14405 11841/6689/14405 12111/6967/14405 12109/6965/14405 +f 11841/6689/14406 11842/6690/14406 12112/6968/14406 12111/6967/14406 +f 11842/6690/14407 11840/6688/14407 12110/6966/14407 12112/6968/14407 +f 11844/6692/14408 11843/6691/14408 12113/6969/14408 12114/6970/14408 +f 11843/6691/14409 11845/6693/14409 12115/6971/14409 12113/6969/14409 +f 11845/6693/14410 11846/6694/14410 12116/6972/14410 12115/6971/14410 +f 11846/6694/14411 11844/6692/14411 12114/6970/14411 12116/6972/14411 +f 11848/6696/14412 11847/6695/14412 12117/6973/14412 12118/6974/14412 +f 11847/6695/14413 11849/6697/14413 12119/6975/14413 12117/6973/14413 +f 11849/6697/14414 11850/6698/14414 12120/6976/14414 12119/6975/14414 +f 11850/6698/14415 11848/6696/14415 12118/6974/14415 12120/6976/14415 +f 11852/6700/14416 11851/6699/14416 12121/6977/14416 12122/6978/14416 +f 11851/6699/14417 11853/6701/14417 12123/6979/14417 12121/6977/14417 +f 11853/6701/14418 11854/6702/14418 12124/6980/14418 12123/6979/14418 +f 11854/6702/14419 11852/6700/14419 12122/6978/14419 12124/6980/14419 +f 11856/6704/14420 11855/6703/14420 12125/6981/14420 12126/6982/14420 +f 11855/6703/14421 11857/6705/14421 12127/6983/14421 12125/6981/14421 +f 11857/6705/14422 11858/6706/14422 12128/6984/14422 12127/6983/14422 +f 11858/6706/14423 11856/6704/14423 12126/6982/14423 12128/6984/14423 +f 11860/6708/14424 11859/6707/14424 12129/6985/14424 12130/6986/14424 +f 11859/6707/14425 11861/6709/14425 12131/6987/14425 12129/6985/14425 +f 11861/6709/14426 11862/6710/14426 12132/6988/14426 12131/6987/14426 +f 11862/6710/14427 11860/6708/14427 12130/6986/14427 12132/6988/14427 +f 11864/6712/14428 11863/6711/14428 12133/6989/14428 12134/6990/14428 +f 11863/6711/14429 11865/6713/14429 12135/6991/14429 12133/6989/14429 +f 11865/6713/14430 11866/6714/14430 12136/6992/14430 12135/6991/14430 +f 11866/6714/14431 11864/6712/14431 12134/6990/14431 12136/6992/14431 +f 11868/6716/14432 11867/6715/14432 12137/6993/14432 12138/6994/14432 +f 11867/6715/14433 11869/6717/14433 12139/6995/14433 12137/6993/14433 +f 11869/6717/14434 11870/6718/14434 12140/6996/14434 12139/6995/14434 +f 11870/6718/14435 11868/6716/14435 12138/6994/14435 12140/6996/14435 +f 11872/6720/14436 11871/6719/14436 12141/6997/14436 12142/6998/14436 +f 11871/6719/14437 11873/6721/14437 12143/6999/14437 12141/6997/14437 +f 11873/6721/14438 11874/6722/14438 12144/7000/14438 12143/6999/14438 +f 11874/6722/14439 11872/6720/14439 12142/6998/14439 12144/7000/14439 +f 11876/6724/14440 11875/6723/14440 12145/7001/14440 12146/7002/14440 +f 11875/6723/14441 11877/6725/14441 12147/7003/14441 12145/7001/14441 +f 11877/6725/14442 11878/6726/14442 12148/7004/14442 12147/7003/14442 +f 11878/6726/14443 11876/6724/14443 12146/7002/14443 12148/7004/14443 +f 11880/6728/14444 11879/6727/14444 12149/7005/14444 12150/7006/14444 +f 11879/6727/14445 11881/6729/14445 12151/7007/14445 12149/7005/14445 +f 11881/6729/14446 11880/6728/14446 12150/7006/14446 12151/7007/14446 +f 11883/6731/14447 11882/6730/14447 12152/7008/14447 12153/7009/14447 +f 11882/6730/14448 11884/6732/14448 12154/7010/14448 12152/7008/14448 +f 11884/6732/14449 11883/6731/14449 12153/7009/14449 12154/7010/14449 +f 11886/6734/14450 11885/6733/14450 12155/7011/14450 12156/7012/14450 +f 11885/6733/14451 11887/6735/14451 12157/7013/14451 12155/7011/14451 +f 11887/6735/14452 11886/6734/14452 12156/7012/14452 12157/7013/14452 +f 11889/6737/14453 11888/6736/14453 12158/7014/14453 12159/7015/14453 +f 11888/6736/14454 11890/6738/14454 12160/7016/14454 12158/7014/14454 +f 11890/6738/14455 11889/6737/14455 12159/7015/14455 12160/7016/14455 +f 11892/7017/14456 11891/6742/14456 12161/7018/14456 12162/7019/14456 +f 11891/6739/14457 11893/6743/14457 12163/7020/14457 12161/7021/14457 +f 11893/6743/14458 11892/6740/14458 12162/7022/14458 12163/7020/14458 +f 11895/6745/14459 11894/6744/14459 12164/7023/14459 12165/7024/14459 +f 11894/6744/14460 11896/6746/14460 12166/7025/14460 12164/7023/14460 +f 11896/6746/14461 11895/6745/14461 12165/7024/14461 12166/7025/14461 +f 11898/6748/14462 11897/6747/14462 12167/7026/14462 12168/7027/14462 +f 11897/6747/14463 11899/6749/14463 12169/7028/14463 12167/7026/14463 +f 11899/6749/14464 11898/6748/14464 12168/7027/14464 12169/7028/14464 +f 11901/6751/14465 11900/6750/14465 12170/7029/14465 12171/7030/14465 +f 11900/6750/14466 11902/6752/14466 12172/7031/14466 12170/7029/14466 +f 11902/6752/14467 11901/6751/14467 12171/7030/14467 12172/7031/14467 +f 11904/6754/14468 11903/6753/14468 12173/7032/14468 12174/7033/14468 +f 11903/6753/14469 11905/6755/14469 12175/7034/14469 12173/7032/14469 +f 11905/6755/14470 11904/6754/14470 12174/7033/14470 12175/7034/14470 +f 11907/6757/14471 11906/6756/14471 12176/7035/14471 12177/7036/14471 +f 11906/6756/14472 11908/6758/14472 12178/7037/14472 12176/7035/14472 +f 11908/6758/14473 11907/6757/14473 12177/7036/14473 12178/7037/14473 +f 11910/6760/14474 11909/6759/14474 12179/7038/14474 12180/7039/14474 +f 11909/6759/14475 11911/6761/14475 12181/7040/14475 12179/7038/14475 +f 11911/6761/14476 11910/6760/14476 12180/7039/14476 12181/7040/14476 +f 11913/6763/14477 11912/6762/14477 12182/7041/14477 12183/7042/14477 +f 11912/6762/14478 11914/6764/14478 12184/7043/14478 12182/7041/14478 +f 11914/6764/14479 11913/6763/14479 12183/7042/14479 12184/7043/14479 +f 11916/6766/14480 11915/6765/14480 12185/7044/14480 12186/7045/14480 +f 11915/6765/14481 11917/6767/14481 12187/7046/14481 12185/7044/14481 +f 11917/6767/14482 11916/6766/14482 12186/7045/14482 12187/7046/14482 +f 11919/6769/14483 11918/6768/14483 12188/7047/14483 12189/7048/14483 +f 11918/6768/14484 11920/6770/14484 12190/7049/14484 12188/7047/14484 +f 11920/6770/14485 11919/6769/14485 12189/7048/14485 12190/7049/14485 +f 11922/6772/14486 11921/6771/14486 12191/7050/14486 12192/7051/14486 +f 11921/6771/14487 11923/6773/14487 12193/7052/14487 12191/7050/14487 +f 11923/6773/14488 11922/6772/14488 12192/7051/14488 12193/7052/14488 +f 11925/6775/14489 11924/6774/14489 12194/7053/14489 12195/7054/14489 +f 11924/6774/14490 11926/6776/14490 12196/7055/14490 12194/7053/14490 +f 11926/6776/14491 11925/6775/14491 12195/7054/14491 12196/7055/14491 +f 11928/6778/14492 11927/6777/14492 12197/7056/14492 12198/7057/14492 +f 11927/6777/14493 11929/6779/14493 12199/7058/14493 12197/7056/14493 +f 11929/6779/14494 11928/6778/14494 12198/7057/14494 12199/7058/14494 +f 11931/6781/14495 11930/6780/14495 12200/7059/14495 12201/7060/14495 +f 11930/6780/14496 11932/6782/14496 12202/7061/14496 12200/7059/14496 +f 11932/6782/14497 11931/6781/14497 12201/7060/14497 12202/7061/14497 +f 11934/6784/14498 11933/6783/14498 12203/7062/14498 12204/7063/14498 +f 11933/6783/14499 11935/6785/14499 12205/7064/14499 12203/7062/14499 +f 11935/6785/14500 11936/6786/14500 12206/7065/14500 12205/7064/14500 +f 11936/6786/14501 11934/6784/14501 12204/7063/14501 12206/7065/14501 +f 11938/6788/14502 11937/6787/14502 12207/7066/14502 12208/7067/14502 +f 11937/6787/14503 11939/6789/14503 12209/7068/14503 12207/7066/14503 +f 11939/6789/14504 11940/6790/14504 12210/7069/14504 12209/7068/14504 +f 11940/6790/14505 11938/6788/14505 12208/7067/14505 12210/7069/14505 +f 11942/6792/14506 11941/6791/14506 12211/7070/14506 12212/7071/14506 +f 11941/6791/14507 11943/6793/14507 12213/7072/14507 12211/7070/14507 +f 11943/6793/14508 11944/6794/14508 12214/7073/14508 12213/7072/14508 +f 11944/6794/14509 11942/6792/14509 12212/7071/14509 12214/7073/14509 +f 11946/6796/14510 11945/6795/14510 12215/7074/14510 12216/7075/14510 +f 11945/6795/14511 11947/6797/14511 12217/7076/14511 12215/7074/14511 +f 11947/6797/14512 11948/6798/14512 12218/7077/14512 12217/7076/14512 +f 11948/6798/14513 11946/6796/14513 12216/7075/14513 12218/7077/14513 +f 11950/6800/14514 11949/6799/14514 12219/7078/14514 12220/7079/14514 +f 11949/6802/14515 11951/6801/14515 12221/7080/14515 12219/7081/14515 +f 11951/6801/14516 11952/6803/14516 12222/7082/14516 12221/7080/14516 +f 11952/6804/14517 11950/6800/14517 12220/7079/14517 12222/7083/14517 +f 11954/6806/14518 11953/6805/14518 12223/7084/14518 12224/7085/14518 +f 11953/6805/14519 11955/6807/14519 12225/7086/14519 12223/7084/14519 +f 11955/6807/14520 11956/6808/14520 12226/7087/14520 12225/7086/14520 +f 11956/6808/14521 11954/6806/14521 12224/7085/14521 12226/7087/14521 +f 11958/6810/14522 11957/6809/14522 12227/7088/14522 12228/7089/14522 +f 11957/6809/14523 11959/6811/14523 12229/7090/14523 12227/7088/14523 +f 11959/6811/14524 11960/6812/14524 12230/7091/14524 12229/7090/14524 +f 11960/6812/14525 11958/6810/14525 12228/7089/14525 12230/7091/14525 +f 11962/6814/14526 11961/6813/14526 12231/7092/14526 12232/7093/14526 +f 11961/6813/14527 11963/6815/14527 12233/7094/14527 12231/7092/14527 +f 11963/6815/14528 11964/6816/14528 12234/7095/14528 12233/7094/14528 +f 11964/6816/14529 11962/6814/14529 12232/7093/14529 12234/7095/14529 +f 11966/6818/14530 11965/6817/14530 12235/7096/14530 12236/7097/14530 +f 11965/6817/14531 11967/6819/14531 12237/7098/14531 12235/7096/14531 +f 11967/6819/14532 11968/6820/14532 12238/7099/14532 12237/7098/14532 +f 11968/6820/14533 11966/6818/14533 12236/7097/14533 12238/7099/14533 +f 11970/6822/14534 11969/6821/14534 12239/7100/14534 12240/7101/14534 +f 11969/6821/14535 11971/6823/14535 12241/7102/14535 12239/7100/14535 +f 11971/6823/14536 11972/6824/14536 12242/7103/14536 12241/7102/14536 +f 11972/6824/14537 11970/6822/14537 12240/7101/14537 12242/7103/14537 +f 11974/6826/14538 11973/6825/14538 12243/7104/14538 12244/7105/14538 +f 11973/6825/14539 11975/6827/14539 12245/7106/14539 12243/7104/14539 +f 11975/6827/14540 11976/6828/14540 12246/7107/14540 12245/7106/14540 +f 11976/6828/14541 11974/6826/14541 12244/7105/14541 12246/7107/14541 +f 11978/6830/14542 11977/6829/14542 12247/7108/14542 12248/7109/14542 +f 11977/6829/14543 11979/6831/14543 12249/7110/14543 12247/7108/14543 +f 11979/6831/14544 11980/6832/14544 12250/7111/14544 12249/7110/14544 +f 11980/6832/14545 11978/6830/14545 12248/7109/14545 12250/7111/14545 +f 11982/6834/14546 11981/6833/14546 12251/7112/14546 12252/7113/14546 +f 11981/6833/14547 11983/6835/14547 12253/7114/14547 12251/7112/14547 +f 11983/6835/14548 11984/6836/14548 12254/7115/14548 12253/7114/14548 +f 11984/6836/14549 11982/6834/14549 12252/7113/14549 12254/7115/14549 +f 11986/6838/14550 11985/6837/14550 12255/7116/14550 12256/7117/14550 +f 11985/6837/14551 11987/6839/14551 12257/7118/14551 12255/7116/14551 +f 11987/6839/14552 11988/6840/14552 12258/7119/14552 12257/7118/14552 +f 11988/6840/14553 11986/6838/14553 12256/7117/14553 12258/7119/14553 +f 11990/6842/14554 11989/6841/14554 12259/7120/14554 12260/7121/14554 +f 11989/6841/14555 11991/6843/14555 12261/7122/14555 12259/7120/14555 +f 11991/6843/14556 11992/6844/14556 12262/7123/14556 12261/7122/14556 +f 11992/6844/14557 11990/6842/14557 12260/7121/14557 12262/7123/14557 +f 11994/6846/14558 11993/6845/14558 12263/7124/14558 12264/7125/14558 +f 11993/6845/14559 11995/6847/14559 12265/7126/14559 12263/7124/14559 +f 11995/6847/14560 11996/6848/14560 12266/7127/14560 12265/7126/14560 +f 11996/6848/14561 11994/6846/14561 12264/7125/14561 12266/7127/14561 +f 11998/6850/14562 11997/6849/14562 12267/7128/14562 12268/7129/14562 +f 11997/6849/14563 11999/6851/14563 12269/7130/14563 12267/7128/14563 +f 11999/6851/14564 12000/6852/14564 12270/7131/14564 12269/7130/14564 +f 12000/6852/14565 11998/6850/14565 12268/7129/14565 12270/7131/14565 +f 12002/6854/14566 12001/6853/14566 12271/7132/14566 12272/7133/14566 +f 12001/6853/14567 12003/6855/14567 12273/7134/14567 12271/7132/14567 +f 12003/6855/14568 12004/6856/14568 12274/7135/14568 12273/7134/14568 +f 12004/6856/14569 12002/6854/14569 12272/7133/14569 12274/7135/14569 +f 12006/6858/14570 12005/6857/14570 12275/7136/14570 12276/7137/14570 +f 12005/6857/14571 12007/6859/14571 12277/7138/14571 12275/7136/14571 +f 12007/6859/14572 12008/6860/14572 12278/7139/14572 12277/7138/14572 +f 12008/6860/14573 12006/6858/14573 12276/7137/14573 12278/7139/14573 +f 12010/6862/14574 12009/6861/14574 12279/7140/14574 12280/7141/14574 +f 12009/6861/14575 12011/6863/14575 12281/7142/14575 12279/7140/14575 +f 12011/6863/14576 12012/6864/14576 12282/7143/14576 12281/7142/14576 +f 12012/6864/14577 12010/6862/14577 12280/7141/14577 12282/7143/14577 +f 12014/6866/14578 12013/6865/14578 12283/7144/14578 12284/7145/14578 +f 12013/6865/14579 12015/6867/14579 12285/7146/14579 12283/7144/14579 +f 12015/6867/14580 12016/6868/14580 12286/7147/14580 12285/7146/14580 +f 12016/6868/14581 12014/6866/14581 12284/7145/14581 12286/7147/14581 +f 12018/6870/14582 12017/6869/14582 12287/7148/14582 12288/7149/14582 +f 12017/6869/14583 12019/6871/14583 12289/7150/14583 12287/7148/14583 +f 12019/6871/14584 12020/6872/14584 12290/7151/14584 12289/7150/14584 +f 12020/6872/14585 12018/6870/14585 12288/7149/14585 12290/7151/14585 +f 12022/6874/14586 12021/6873/14586 12291/7152/14586 12292/7153/14586 +f 12021/6876/14587 12023/6875/14587 12293/7154/14587 12291/7155/14587 +f 12023/6875/14588 12024/6877/14588 12294/7156/14588 12293/7154/14588 +f 12024/6878/14589 12022/6874/14589 12292/7153/14589 12294/7157/14589 +f 12026/6880/14590 12025/6879/14590 12295/7158/14590 12296/7159/14590 +f 12025/6879/14591 12027/6881/14591 12297/7160/14591 12295/7158/14591 +f 12027/6881/14592 12028/6882/14592 12298/7161/14592 12297/7160/14592 +f 12028/6882/14593 12026/6880/14593 12296/7159/14593 12298/7161/14593 +f 12030/6884/14594 12029/6883/14594 12299/7162/14594 12300/7163/14594 +f 12029/6883/14595 12031/6885/14595 12301/7164/14595 12299/7162/14595 +f 12031/6885/14596 12032/6886/14596 12302/7165/14596 12301/7164/14596 +f 12032/6886/14597 12030/6884/14597 12300/7163/14597 12302/7165/14597 +f 12034/6888/14598 12033/6887/14598 12303/7166/14598 12304/7167/14598 +f 12033/6887/14599 12035/6889/14599 12305/7168/14599 12303/7166/14599 +f 12035/6889/14600 12036/6890/14600 12306/7169/14600 12305/7168/14600 +f 12036/6890/14601 12034/6888/14601 12304/7167/14601 12306/7169/14601 +f 12038/6892/14602 12037/6891/14602 12307/7170/14602 12308/7171/14602 +f 12037/6891/14603 12039/6893/14603 12309/7172/14603 12307/7170/14603 +f 12039/6893/14604 12040/6894/14604 12310/7173/14604 12309/7172/14604 +f 12040/6894/14605 12038/6892/14605 12308/7171/14605 12310/7173/14605 +f 12042/6896/14606 12041/6895/14606 12311/7174/14606 12312/7175/14606 +f 12041/6895/14607 12043/6897/14607 12313/7176/14607 12311/7174/14607 +f 12043/6897/14608 12044/6898/14608 12314/7177/14608 12313/7176/14608 +f 12044/6898/14609 12042/6896/14609 12312/7175/14609 12314/7177/14609 +f 12046/6900/14610 12045/6899/14610 12315/7178/14610 12316/7179/14610 +f 12045/6899/14611 12047/6901/14611 12317/7180/14611 12315/7178/14611 +f 12047/6901/14612 12048/6902/14612 12318/7181/14612 12317/7180/14612 +f 12048/6902/14613 12046/6900/14613 12316/7179/14613 12318/7181/14613 +f 12050/6904/14614 12049/6903/14614 12319/7182/14614 12320/7183/14614 +f 12049/6903/14615 12051/6905/14615 12321/7184/14615 12319/7182/14615 +f 12051/6905/14616 12052/6906/14616 12322/7185/14616 12321/7184/14616 +f 12052/6906/14617 12050/6904/14617 12320/7183/14617 12322/7185/14617 +f 12054/6908/14618 12053/6907/14618 12323/7186/14618 12324/7187/14618 +f 12053/6907/14619 12055/6909/14619 12325/7188/14619 12323/7186/14619 +f 12055/6909/14620 12056/6910/14620 12326/7189/14620 12325/7188/14620 +f 12056/6910/14621 12054/6908/14621 12324/7187/14621 12326/7189/14621 +f 12058/6912/14622 12057/6911/14622 12327/7190/14622 12328/7191/14622 +f 12057/6911/14623 12059/6913/14623 12329/7192/14623 12327/7190/14623 +f 12059/6913/14624 12060/6914/14624 12330/7193/14624 12329/7192/14624 +f 12060/6914/14625 12058/6912/14625 12328/7191/14625 12330/7193/14625 +f 12062/6916/14626 12061/6915/14626 12331/7194/14626 12332/7195/14626 +f 12061/6915/14627 12063/6917/14627 12333/7196/14627 12331/7194/14627 +f 12063/6917/14628 12064/6918/14628 12334/7197/14628 12333/7196/14628 +f 12064/6918/14629 12062/6916/14629 12332/7195/14629 12334/7197/14629 +f 12066/6920/14630 12065/6919/14630 12335/7198/14630 12336/7199/14630 +f 12065/6919/14631 12067/6921/14631 12337/7200/14631 12335/7198/14631 +f 12067/6921/14632 12068/6922/14632 12338/7201/14632 12337/7200/14632 +f 12068/6922/14633 12066/6920/14633 12336/7199/14633 12338/7201/14633 +f 12070/6924/14634 12069/6923/14634 12339/7202/14634 12340/7203/14634 +f 12069/6923/14635 12071/6925/14635 12341/7204/14635 12339/7202/14635 +f 12071/6925/14636 12072/6926/14636 12342/7205/14636 12341/7204/14636 +f 12072/6926/14637 12070/6924/14637 12340/7203/14637 12342/7205/14637 +f 12074/6928/14638 12073/6927/14638 12343/7206/14638 12344/7207/14638 +f 12073/6927/14639 12075/6929/14639 12345/7208/14639 12343/7206/14639 +f 12075/6929/14640 12076/6930/14640 12346/7209/14640 12345/7208/14640 +f 12076/6930/14641 12074/6928/14641 12344/7207/14641 12346/7209/14641 +f 12078/6932/14642 12077/6931/14642 12347/7210/14642 12348/7211/14642 +f 12077/6931/14643 12079/6933/14643 12349/7212/14643 12347/7210/14643 +f 12079/6933/14644 12080/6934/14644 12350/7213/14644 12349/7212/14644 +f 12080/6934/14645 12078/6932/14645 12348/7211/14645 12350/7213/14645 +f 12082/6936/14646 12081/6935/14646 12351/7214/14646 12352/7215/14646 +f 12081/6935/14647 12083/6937/14647 12353/7216/14647 12351/7214/14647 +f 12083/6937/14648 12084/6938/14648 12354/7217/14648 12353/7216/14648 +f 12084/6938/14649 12082/6936/14649 12352/7215/14649 12354/7217/14649 +f 12086/6940/14650 12085/6939/14650 12355/7218/14650 12356/7219/14650 +f 12085/6939/14651 12087/6941/14651 12357/7220/14651 12355/7218/14651 +f 12087/6941/14652 12088/6942/14652 12358/7221/14652 12357/7220/14652 +f 12088/6942/14653 12086/6940/14653 12356/7219/14653 12358/7221/14653 +f 12090/6944/14654 12089/6943/14654 12359/7222/14654 12360/7223/14654 +f 12089/6943/14655 12091/6945/14655 12361/7224/14655 12359/7222/14655 +f 12091/6945/14656 12092/6946/14656 12362/7225/14656 12361/7224/14656 +f 12092/6946/14657 12090/6944/14657 12360/7223/14657 12362/7225/14657 +f 12094/6948/14658 12093/6947/14658 12363/7226/14658 12364/7227/14658 +f 12093/6950/14659 12095/6949/14659 12365/7228/14659 12363/7229/14659 +f 12095/6949/14660 12096/6951/14660 12366/7230/14660 12365/7228/14660 +f 12096/6952/14661 12094/6948/14661 12364/7227/14661 12366/7231/14661 +f 12098/6954/14662 12097/6953/14662 12367/7232/14662 12368/7233/14662 +f 12097/6953/14663 12099/6955/14663 12369/7234/14663 12367/7232/14663 +f 12099/6955/14664 12100/6956/14664 12370/7235/14664 12369/7234/14664 +f 12100/6956/14665 12098/6954/14665 12368/7233/14665 12370/7235/14665 +f 12102/6958/14666 12101/6957/14666 12371/7236/14666 12372/7237/14666 +f 12101/6957/14667 12103/6959/14667 12373/7238/14667 12371/7236/14667 +f 12103/6959/14668 12104/6960/14668 12374/7239/14668 12373/7238/14668 +f 12104/6960/14669 12102/6958/14669 12372/7237/14669 12374/7239/14669 +f 12106/6962/14670 12105/6961/14670 12375/7240/14670 12376/7241/14670 +f 12105/6961/14671 12107/6963/14671 12377/7242/14671 12375/7240/14671 +f 12107/6963/14672 12108/6964/14672 12378/7243/14672 12377/7242/14672 +f 12108/6964/14673 12106/6962/14673 12376/7241/14673 12378/7243/14673 +f 12110/6966/14674 12109/6965/14674 12379/7244/14674 12380/7245/14674 +f 12109/6965/14675 12111/6967/14675 12381/7246/14675 12379/7244/14675 +f 12111/6967/14676 12112/6968/14676 12382/7247/14676 12381/7246/14676 +f 12112/6968/14677 12110/6966/14677 12380/7245/14677 12382/7247/14677 +f 12114/6970/14678 12113/6969/14678 12383/7248/14678 12384/7249/14678 +f 12113/6969/14679 12115/6971/14679 12385/7250/14679 12383/7248/14679 +f 12115/6971/14680 12116/6972/14680 12386/7251/14680 12385/7250/14680 +f 12116/6972/14681 12114/6970/14681 12384/7249/14681 12386/7251/14681 +f 12118/6974/14682 12117/6973/14682 12387/7252/14682 12388/7253/14682 +f 12117/6973/14683 12119/6975/14683 12389/7254/14683 12387/7252/14683 +f 12119/6975/14684 12120/6976/14684 12390/7255/14684 12389/7254/14684 +f 12120/6976/14685 12118/6974/14685 12388/7253/14685 12390/7255/14685 +f 12122/6978/14686 12121/6977/14686 12391/7256/14686 12392/7257/14686 +f 12121/6977/14687 12123/6979/14687 12393/7258/14687 12391/7256/14687 +f 12123/6979/14688 12124/6980/14688 12394/7259/14688 12393/7258/14688 +f 12124/6980/14689 12122/6978/14689 12392/7257/14689 12394/7259/14689 +f 12126/6982/14690 12125/6981/14690 12395/7260/14690 12396/7261/14690 +f 12125/6981/14691 12127/6983/14691 12397/7262/14691 12395/7260/14691 +f 12127/6983/14692 12128/6984/14692 12398/7263/14692 12397/7262/14692 +f 12128/6984/14693 12126/6982/14693 12396/7261/14693 12398/7263/14693 +f 12130/6986/14694 12129/6985/14694 12399/7264/14694 12400/7265/14694 +f 12129/6985/14695 12131/6987/14695 12401/7266/14695 12399/7264/14695 +f 12131/6987/14696 12132/6988/14696 12402/7267/14696 12401/7266/14696 +f 12132/6988/14697 12130/6986/14697 12400/7265/14697 12402/7267/14697 +f 12134/6990/14698 12133/6989/14698 12403/7268/14698 12404/7269/14698 +f 12133/6989/14699 12135/6991/14699 12405/7270/14699 12403/7268/14699 +f 12135/6991/14700 12136/6992/14700 12406/7271/14700 12405/7270/14700 +f 12136/6992/14701 12134/6990/14701 12404/7269/14701 12406/7271/14701 +f 12138/6994/14702 12137/6993/14702 12407/7272/14702 12408/7273/14702 +f 12137/6993/14703 12139/6995/14703 12409/7274/14703 12407/7272/14703 +f 12139/6995/14704 12140/6996/14704 12410/7275/14704 12409/7274/14704 +f 12140/6996/14705 12138/6994/14705 12408/7273/14705 12410/7275/14705 +f 12142/6998/14706 12141/6997/14706 12411/7276/14706 12412/7277/14706 +f 12141/6997/14707 12143/6999/14707 12413/7278/14707 12411/7276/14707 +f 12143/6999/14708 12144/7000/14708 12414/7279/14708 12413/7278/14708 +f 12144/7000/14709 12142/6998/14709 12412/7277/14709 12414/7279/14709 +f 12146/7002/14710 12145/7001/14710 12415/7280/14710 12416/7281/14710 +f 12145/7001/14711 12147/7003/14711 12417/7282/14711 12415/7280/14711 +f 12147/7003/14712 12148/7004/14712 12418/7283/14712 12417/7282/14712 +f 12148/7004/14713 12146/7002/14713 12416/7281/14713 12418/7283/14713 +f 12150/7006/14714 12149/7005/14714 12419/7284/14714 12420/7285/14714 +f 12149/7005/14715 12151/7007/14715 12421/7286/14715 12419/7284/14715 +f 12151/7007/14716 12150/7006/14716 12420/7285/14716 12421/7286/14716 +f 12153/7009/14717 12152/7008/14717 12422/7287/14717 12423/7288/14717 +f 12152/7008/14718 12154/7010/14718 12424/7289/14718 12422/7287/14718 +f 12154/7010/14719 12153/7009/14719 12423/7288/14719 12424/7289/14719 +f 12156/7012/14720 12155/7011/14720 12425/7290/14720 12426/7291/14720 +f 12155/7011/14721 12157/7013/14721 12427/7292/14721 12425/7290/14721 +f 12157/7013/14722 12156/7012/14722 12426/7291/14722 12427/7292/14722 +f 12159/7015/14723 12158/7014/14723 12428/7293/14723 12429/7294/14723 +f 12158/7014/14724 12160/7016/14724 12430/7295/14724 12428/7293/14724 +f 12160/7016/14725 12159/7015/14725 12429/7294/14725 12430/7295/14725 +f 12162/7019/14726 12161/7018/14726 12431/7296/14726 12432/7297/14726 +f 12161/7021/14727 12163/7020/14727 12433/7298/14727 12431/7299/14727 +f 12163/7020/14728 12162/7022/14728 12432/7300/14728 12433/7298/14728 +f 12165/7024/14729 12164/7023/14729 12434/7301/14729 12435/7302/14729 +f 12164/7023/14730 12166/7025/14730 12436/7303/14730 12434/7301/14730 +f 12166/7025/14731 12165/7024/14731 12435/7302/14731 12436/7303/14731 +f 12168/7027/14732 12167/7026/14732 12437/7304/14732 12438/7305/14732 +f 12167/7026/14733 12169/7028/14733 12439/7306/14733 12437/7304/14733 +f 12169/7028/14734 12168/7027/14734 12438/7305/14734 12439/7306/14734 +f 12171/7030/14735 12170/7029/14735 12440/7307/14735 12441/7308/14735 +f 12170/7029/14736 12172/7031/14736 12442/7309/14736 12440/7307/14736 +f 12172/7031/14737 12171/7030/14737 12441/7308/14737 12442/7309/14737 +f 12174/7033/14738 12173/7032/14738 12443/7310/14738 12444/7311/14738 +f 12173/7032/14739 12175/7034/14739 12445/7312/14739 12443/7310/14739 +f 12175/7034/14740 12174/7033/14740 12444/7311/14740 12445/7312/14740 +f 12177/7036/14741 12176/7035/14741 12446/7313/14741 12447/7314/14741 +f 12176/7035/14742 12178/7037/14742 12448/7315/14742 12446/7313/14742 +f 12178/7037/14743 12177/7036/14743 12447/7314/14743 12448/7315/14743 +f 12180/7039/14744 12179/7038/14744 12449/7316/14744 12450/7317/14744 +f 12179/7038/14745 12181/7040/14745 12451/7318/14745 12449/7316/14745 +f 12181/7040/14746 12180/7039/14746 12450/7317/14746 12451/7318/14746 +f 12183/7042/14747 12182/7041/14747 12452/7319/14747 12453/7320/14747 +f 12182/7041/14748 12184/7043/14748 12454/7321/14748 12452/7319/14748 +f 12184/7043/14749 12183/7042/14749 12453/7320/14749 12454/7321/14749 +f 12186/7045/14750 12185/7044/14750 12455/7322/14750 12456/7323/14750 +f 12185/7044/14751 12187/7046/14751 12457/7324/14751 12455/7322/14751 +f 12187/7046/14752 12186/7045/14752 12456/7323/14752 12457/7324/14752 +f 12189/7048/14753 12188/7047/14753 12458/7325/14753 12459/7326/14753 +f 12188/7047/14754 12190/7049/14754 12460/7327/14754 12458/7325/14754 +f 12190/7049/14755 12189/7048/14755 12459/7326/14755 12460/7327/14755 +f 12192/7051/14756 12191/7050/14756 12461/7328/14756 12462/7329/14756 +f 12191/7050/14757 12193/7052/14757 12463/7330/14757 12461/7328/14757 +f 12193/7052/14758 12192/7051/14758 12462/7329/14758 12463/7330/14758 +f 12195/7054/14759 12194/7053/14759 12464/7331/14759 12465/7332/14759 +f 12194/7053/14760 12196/7055/14760 12466/7333/14760 12464/7331/14760 +f 12196/7055/14761 12195/7054/14761 12465/7332/14761 12466/7333/14761 +f 12198/7057/14762 12197/7056/14762 12467/7334/14762 12468/7335/14762 +f 12197/7056/14763 12199/7058/14763 12469/7336/14763 12467/7334/14763 +f 12199/7058/14764 12198/7057/14764 12468/7335/14764 12469/7336/14764 +f 12201/7060/14765 12200/7059/14765 12470/7337/14765 12471/7338/14765 +f 12200/7059/14766 12202/7061/14766 12472/7339/14766 12470/7337/14766 +f 12202/7061/14767 12201/7060/14767 12471/7338/14767 12472/7339/14767 +f 12204/7063/14768 12203/7062/14768 10529/5339/14768 10528/5338/14768 +f 12203/7062/14769 12205/7064/14769 10530/5340/14769 10529/5339/14769 +f 12205/7064/14770 12206/7065/14770 10531/5341/14770 10530/5340/14770 +f 12206/7065/14771 12204/7063/14771 10528/5338/14771 10531/5341/14771 +f 12208/7067/14772 12207/7066/14772 10533/5343/14772 10532/5342/14772 +f 12207/7066/14773 12209/7068/14773 10534/5344/14773 10533/5343/14773 +f 12209/7068/14774 12210/7069/14774 10535/5345/14774 10534/5344/14774 +f 12210/7069/14775 12208/7067/14775 10532/5342/14775 10535/5345/14775 +f 12212/7071/14776 12211/7070/14776 10537/5347/14776 10536/5346/14776 +f 12211/7070/14777 12213/7072/14777 10538/5348/14777 10537/5347/14777 +f 12213/7072/14778 12214/7073/14778 10539/5349/14778 10538/5348/14778 +f 12214/7073/14779 12212/7071/14779 10536/5346/14779 10539/5349/14779 +f 12216/7075/14780 12215/7074/14780 10541/5351/14780 10540/5350/14780 +f 12215/7074/14781 12217/7076/14781 10542/5352/14781 10541/5351/14781 +f 12217/7076/14782 12218/7077/14782 10543/5353/14782 10542/5352/14782 +f 12218/7077/14783 12216/7075/14783 10540/5350/14783 10543/5353/14783 +f 12220/7079/14784 12219/7078/14784 10545/5355/14784 10544/5354/14784 +f 12219/7081/14785 12221/7080/14785 10546/7340/14785 10545/7341/14785 +f 12221/7080/14786 12222/7082/14786 10547/7342/14786 10546/7340/14786 +f 12222/7083/14787 12220/7079/14787 10544/5354/14787 10547/5357/14787 +f 12224/7085/14788 12223/7084/14788 10549/5359/14788 10548/5358/14788 +f 12223/7084/14789 12225/7086/14789 10550/5360/14789 10549/5359/14789 +f 12225/7086/14790 12226/7087/14790 10551/5361/14790 10550/5360/14790 +f 12226/7087/14791 12224/7085/14791 10548/5358/14791 10551/5361/14791 +f 12228/7089/14792 12227/7088/14792 10553/5363/14792 10552/5362/14792 +f 12227/7088/14793 12229/7090/14793 10554/5364/14793 10553/5363/14793 +f 12229/7090/14794 12230/7091/14794 10555/5365/14794 10554/5364/14794 +f 12230/7091/14795 12228/7089/14795 10552/5362/14795 10555/5365/14795 +f 12232/7093/14796 12231/7092/14796 10557/5367/14796 10556/5366/14796 +f 12231/7092/14797 12233/7094/14797 10558/5368/14797 10557/5367/14797 +f 12233/7094/14798 12234/7095/14798 10559/5369/14798 10558/5368/14798 +f 12234/7095/14799 12232/7093/14799 10556/5366/14799 10559/5369/14799 +f 12236/7097/14800 12235/7096/14800 10561/5371/14800 10560/5370/14800 +f 12235/7096/14801 12237/7098/14801 10562/5372/14801 10561/5371/14801 +f 12237/7098/14802 12238/7099/14802 10563/5373/14802 10562/5372/14802 +f 12238/7099/14803 12236/7097/14803 10560/5370/14803 10563/5373/14803 +f 12240/7101/14804 12239/7100/14804 10565/5375/14804 10564/5374/14804 +f 12239/7100/14805 12241/7102/14805 10566/5376/14805 10565/5375/14805 +f 12241/7102/14806 12242/7103/14806 10567/5377/14806 10566/5376/14806 +f 12242/7103/14807 12240/7101/14807 10564/5374/14807 10567/5377/14807 +f 12244/7105/14808 12243/7104/14808 10569/5379/14808 10568/5378/14808 +f 12243/7104/14809 12245/7106/14809 10570/5380/14809 10569/5379/14809 +f 12245/7106/14810 12246/7107/14810 10571/5381/14810 10570/5380/14810 +f 12246/7107/14811 12244/7105/14811 10568/5378/14811 10571/5381/14811 +f 12248/7109/14812 12247/7108/14812 10573/5383/14812 10572/5382/14812 +f 12247/7108/14813 12249/7110/14813 10574/5384/14813 10573/5383/14813 +f 12249/7110/14814 12250/7111/14814 10575/5385/14814 10574/5384/14814 +f 12250/7111/14815 12248/7109/14815 10572/5382/14815 10575/5385/14815 +f 12252/7113/14816 12251/7112/14816 10577/5387/14816 10576/5386/14816 +f 12251/7112/14817 12253/7114/14817 10578/5388/14817 10577/5387/14817 +f 12253/7114/14818 12254/7115/14818 10579/5389/14818 10578/5388/14818 +f 12254/7115/14819 12252/7113/14819 10576/5386/14819 10579/5389/14819 +f 12256/7117/14820 12255/7116/14820 10581/5391/14820 10580/5390/14820 +f 12255/7116/14821 12257/7118/14821 10582/5392/14821 10581/5391/14821 +f 12257/7118/14822 12258/7119/14822 10583/5393/14822 10582/5392/14822 +f 12258/7119/14823 12256/7117/14823 10580/5390/14823 10583/5393/14823 +f 12260/7121/14824 12259/7120/14824 10585/5395/14824 10584/5394/14824 +f 12259/7120/14825 12261/7122/14825 10586/5396/14825 10585/5395/14825 +f 12261/7122/14826 12262/7123/14826 10587/5397/14826 10586/5396/14826 +f 12262/7123/14827 12260/7121/14827 10584/5394/14827 10587/5397/14827 +f 12264/7125/14828 12263/7124/14828 10589/5399/14828 10588/5398/14828 +f 12263/7124/14829 12265/7126/14829 10590/5400/14829 10589/5399/14829 +f 12265/7126/14830 12266/7127/14830 10591/5401/14830 10590/5400/14830 +f 12266/7127/14831 12264/7125/14831 10588/5398/14831 10591/5401/14831 +f 12268/7129/14832 12267/7128/14832 10593/5403/14832 10592/5402/14832 +f 12267/7128/14833 12269/7130/14833 10594/5404/14833 10593/5403/14833 +f 12269/7130/14834 12270/7131/14834 10595/5405/14834 10594/5404/14834 +f 12270/7131/14835 12268/7129/14835 10592/5402/14835 10595/5405/14835 +f 12272/7133/14836 12271/7132/14836 10597/5407/14836 10596/5406/14836 +f 12271/7132/14837 12273/7134/14837 10598/5408/14837 10597/5407/14837 +f 12273/7134/14838 12274/7135/14838 10599/5409/14838 10598/5408/14838 +f 12274/7135/14839 12272/7133/14839 10596/5406/14839 10599/5409/14839 +f 12276/7137/14840 12275/7136/14840 10601/5411/14840 10600/5410/14840 +f 12275/7136/14841 12277/7138/14841 10602/5412/14841 10601/5411/14841 +f 12277/7138/14842 12278/7139/14842 10603/5413/14842 10602/5412/14842 +f 12278/7139/14843 12276/7137/14843 10600/5410/14843 10603/5413/14843 +f 12280/7141/14844 12279/7140/14844 10605/5415/14844 10604/5414/14844 +f 12279/7140/14845 12281/7142/14845 10606/5416/14845 10605/5415/14845 +f 12281/7142/14846 12282/7143/14846 10607/5417/14846 10606/5416/14846 +f 12282/7143/14847 12280/7141/14847 10604/5414/14847 10607/5417/14847 +f 12284/7145/14848 12283/7144/14848 10609/5419/14848 10608/5418/14848 +f 12283/7144/14849 12285/7146/14849 10610/5420/14849 10609/5419/14849 +f 12285/7146/14850 12286/7147/14850 10611/5421/14850 10610/5420/14850 +f 12286/7147/14851 12284/7145/14851 10608/5418/14851 10611/5421/14851 +f 12288/7149/14852 12287/7148/14852 10613/5423/14852 10612/5422/14852 +f 12287/7148/14853 12289/7150/14853 10614/5424/14853 10613/5423/14853 +f 12289/7150/14854 12290/7151/14854 10615/5425/14854 10614/5424/14854 +f 12290/7151/14855 12288/7149/14855 10612/5422/14855 10615/5425/14855 +f 12292/7153/14856 12291/7152/14856 10617/5427/14856 10616/5426/14856 +f 12291/7155/14857 12293/7154/14857 10618/7343/14857 10617/7344/14857 +f 12293/7154/14858 12294/7156/14858 10619/7345/14858 10618/7343/14858 +f 12294/7157/14859 12292/7153/14859 10616/5426/14859 10619/5429/14859 +f 12296/7159/14860 12295/7158/14860 10621/5431/14860 10620/5430/14860 +f 12295/7158/14861 12297/7160/14861 10622/5432/14861 10621/5431/14861 +f 12297/7160/14862 12298/7161/14862 10623/5433/14862 10622/5432/14862 +f 12298/7161/14863 12296/7159/14863 10620/5430/14863 10623/5433/14863 +f 12300/7163/14864 12299/7162/14864 10625/5435/14864 10624/5434/14864 +f 12299/7162/14865 12301/7164/14865 10626/5436/14865 10625/5435/14865 +f 12301/7164/14866 12302/7165/14866 10627/5437/14866 10626/5436/14866 +f 12302/7165/14867 12300/7163/14867 10624/5434/14867 10627/5437/14867 +f 12304/7167/14868 12303/7166/14868 10629/5439/14868 10628/5438/14868 +f 12303/7166/14869 12305/7168/14869 10630/5440/14869 10629/5439/14869 +f 12305/7168/14870 12306/7169/14870 10631/5441/14870 10630/5440/14870 +f 12306/7169/14871 12304/7167/14871 10628/5438/14871 10631/5441/14871 +f 12308/7171/14872 12307/7170/14872 10633/5443/14872 10632/5442/14872 +f 12307/7170/14873 12309/7172/14873 10634/5444/14873 10633/5443/14873 +f 12309/7172/14874 12310/7173/14874 10635/5445/14874 10634/5444/14874 +f 12310/7173/14875 12308/7171/14875 10632/5442/14875 10635/5445/14875 +f 12312/7175/14876 12311/7174/14876 10637/5447/14876 10636/5446/14876 +f 12311/7174/14877 12313/7176/14877 10638/5448/14877 10637/5447/14877 +f 12313/7176/14878 12314/7177/14878 10639/5449/14878 10638/5448/14878 +f 12314/7177/14879 12312/7175/14879 10636/5446/14879 10639/5449/14879 +f 12316/7179/14880 12315/7178/14880 10641/5451/14880 10640/5450/14880 +f 12315/7178/14881 12317/7180/14881 10642/5452/14881 10641/5451/14881 +f 12317/7180/14882 12318/7181/14882 10643/5453/14882 10642/5452/14882 +f 12318/7181/14883 12316/7179/14883 10640/5450/14883 10643/5453/14883 +f 12320/7183/14884 12319/7182/14884 10645/5455/14884 10644/5454/14884 +f 12319/7182/14885 12321/7184/14885 10646/5456/14885 10645/5455/14885 +f 12321/7184/14886 12322/7185/14886 10647/5457/14886 10646/5456/14886 +f 12322/7185/14887 12320/7183/14887 10644/5454/14887 10647/5457/14887 +f 12324/7187/14888 12323/7186/14888 10649/5459/14888 10648/5458/14888 +f 12323/7186/14889 12325/7188/14889 10650/5460/14889 10649/5459/14889 +f 12325/7188/14890 12326/7189/14890 10651/5461/14890 10650/5460/14890 +f 12326/7189/14891 12324/7187/14891 10648/5458/14891 10651/5461/14891 +f 12328/7191/14892 12327/7190/14892 10653/5463/14892 10652/5462/14892 +f 12327/7190/14893 12329/7192/14893 10654/5464/14893 10653/5463/14893 +f 12329/7192/14894 12330/7193/14894 10655/5465/14894 10654/5464/14894 +f 12330/7193/14895 12328/7191/14895 10652/5462/14895 10655/5465/14895 +f 12332/7195/14896 12331/7194/14896 10657/5467/14896 10656/5466/14896 +f 12331/7194/14897 12333/7196/14897 10658/5468/14897 10657/5467/14897 +f 12333/7196/14898 12334/7197/14898 10659/5469/14898 10658/5468/14898 +f 12334/7197/14899 12332/7195/14899 10656/5466/14899 10659/5469/14899 +f 12336/7199/14900 12335/7198/14900 10661/5471/14900 10660/5470/14900 +f 12335/7198/14901 12337/7200/14901 10662/5472/14901 10661/5471/14901 +f 12337/7200/14902 12338/7201/14902 10663/5473/14902 10662/5472/14902 +f 12338/7201/14903 12336/7199/14903 10660/5470/14903 10663/5473/14903 +f 12340/7203/14904 12339/7202/14904 10665/5475/14904 10664/5474/14904 +f 12339/7202/14905 12341/7204/14905 10666/5476/14905 10665/5475/14905 +f 12341/7204/14906 12342/7205/14906 10667/5477/14906 10666/5476/14906 +f 12342/7205/14907 12340/7203/14907 10664/5474/14907 10667/5477/14907 +f 12344/7207/14908 12343/7206/14908 10669/5479/14908 10668/5478/14908 +f 12343/7206/14909 12345/7208/14909 10670/5480/14909 10669/5479/14909 +f 12345/7208/14910 12346/7209/14910 10671/5481/14910 10670/5480/14910 +f 12346/7209/14911 12344/7207/14911 10668/5478/14911 10671/5481/14911 +f 12348/7211/14912 12347/7210/14912 10673/5483/14912 10672/5482/14912 +f 12347/7210/14913 12349/7212/14913 10674/5484/14913 10673/5483/14913 +f 12349/7212/14914 12350/7213/14914 10675/5485/14914 10674/5484/14914 +f 12350/7213/14915 12348/7211/14915 10672/5482/14915 10675/5485/14915 +f 12352/7215/14916 12351/7214/14916 10677/5487/14916 10676/5486/14916 +f 12351/7214/14917 12353/7216/14917 10678/5488/14917 10677/5487/14917 +f 12353/7216/14918 12354/7217/14918 10679/5489/14918 10678/5488/14918 +f 12354/7217/14919 12352/7215/14919 10676/5486/14919 10679/5489/14919 +f 12356/7219/14920 12355/7218/14920 10681/5491/14920 10680/5490/14920 +f 12355/7218/14921 12357/7220/14921 10682/5492/14921 10681/5491/14921 +f 12357/7220/14922 12358/7221/14922 10683/5493/14922 10682/5492/14922 +f 12358/7221/14923 12356/7219/14923 10680/5490/14923 10683/5493/14923 +f 12360/7223/14924 12359/7222/14924 10685/5495/14924 10684/5494/14924 +f 12359/7222/14925 12361/7224/14925 10686/5496/14925 10685/5495/14925 +f 12361/7224/14926 12362/7225/14926 10687/5497/14926 10686/5496/14926 +f 12362/7225/14927 12360/7223/14927 10684/5494/14927 10687/5497/14927 +f 12364/7227/14928 12363/7226/14928 10689/5499/14928 10688/5498/14928 +f 12363/7229/14929 12365/7228/14929 10690/7346/14929 10689/7347/14929 +f 12365/7228/14930 12366/7230/14930 10691/7348/14930 10690/7346/14930 +f 12366/7231/14931 12364/7227/14931 10688/5498/14931 10691/5501/14931 +f 12368/7233/14932 12367/7232/14932 10693/5503/14932 10692/5502/14932 +f 12367/7232/14933 12369/7234/14933 10694/5504/14933 10693/5503/14933 +f 12369/7234/14934 12370/7235/14934 10695/5505/14934 10694/5504/14934 +f 12370/7235/14935 12368/7233/14935 10692/5502/14935 10695/5505/14935 +f 12372/7237/14936 12371/7236/14936 10697/5507/14936 10696/5506/14936 +f 12371/7236/14937 12373/7238/14937 10698/5508/14937 10697/5507/14937 +f 12373/7238/14938 12374/7239/14938 10699/5509/14938 10698/5508/14938 +f 12374/7239/14939 12372/7237/14939 10696/5506/14939 10699/5509/14939 +f 12376/7241/14940 12375/7240/14940 10701/5511/14940 10700/5510/14940 +f 12375/7240/14941 12377/7242/14941 10702/5512/14941 10701/5511/14941 +f 12377/7242/14942 12378/7243/14942 10703/5513/14942 10702/5512/14942 +f 12378/7243/14943 12376/7241/14943 10700/5510/14943 10703/5513/14943 +f 12380/7245/14944 12379/7244/14944 10705/5515/14944 10704/5514/14944 +f 12379/7244/14945 12381/7246/14945 10706/5516/14945 10705/5515/14945 +f 12381/7246/14946 12382/7247/14946 10707/5517/14946 10706/5516/14946 +f 12382/7247/14947 12380/7245/14947 10704/5514/14947 10707/5517/14947 +f 12384/7249/14948 12383/7248/14948 10709/5519/14948 10708/5518/14948 +f 12383/7248/14949 12385/7250/14949 10710/5520/14949 10709/5519/14949 +f 12385/7250/14950 12386/7251/14950 10711/5521/14950 10710/5520/14950 +f 12386/7251/14951 12384/7249/14951 10708/5518/14951 10711/5521/14951 +f 12388/7253/14952 12387/7252/14952 10713/5523/14952 10712/5522/14952 +f 12387/7252/14953 12389/7254/14953 10714/5524/14953 10713/5523/14953 +f 12389/7254/14954 12390/7255/14954 10715/5525/14954 10714/5524/14954 +f 12390/7255/14955 12388/7253/14955 10712/5522/14955 10715/5525/14955 +f 12392/7257/14956 12391/7256/14956 10717/5527/14956 10716/5526/14956 +f 12391/7256/14957 12393/7258/14957 10718/5528/14957 10717/5527/14957 +f 12393/7258/14958 12394/7259/14958 10719/5529/14958 10718/5528/14958 +f 12394/7259/14959 12392/7257/14959 10716/5526/14959 10719/5529/14959 +f 12396/7261/14960 12395/7260/14960 10721/5531/14960 10720/5530/14960 +f 12395/7260/14961 12397/7262/14961 10722/5532/14961 10721/5531/14961 +f 12397/7262/14962 12398/7263/14962 10723/5533/14962 10722/5532/14962 +f 12398/7263/14963 12396/7261/14963 10720/5530/14963 10723/5533/14963 +f 12400/7265/14964 12399/7264/14964 10725/5535/14964 10724/5534/14964 +f 12399/7264/14965 12401/7266/14965 10726/5536/14965 10725/5535/14965 +f 12401/7266/14966 12402/7267/14966 10727/5537/14966 10726/5536/14966 +f 12402/7267/14967 12400/7265/14967 10724/5534/14967 10727/5537/14967 +f 12404/7269/14968 12403/7268/14968 10729/5539/14968 10728/5538/14968 +f 12403/7268/14969 12405/7270/14969 10730/5540/14969 10729/5539/14969 +f 12405/7270/14970 12406/7271/14970 10731/5541/14970 10730/5540/14970 +f 12406/7271/14971 12404/7269/14971 10728/5538/14971 10731/5541/14971 +f 12408/7273/14972 12407/7272/14972 10733/5543/14972 10732/5542/14972 +f 12407/7272/14973 12409/7274/14973 10734/5544/14973 10733/5543/14973 +f 12409/7274/14974 12410/7275/14974 10735/5545/14974 10734/5544/14974 +f 12410/7275/14975 12408/7273/14975 10732/5542/14975 10735/5545/14975 +f 12412/7277/14976 12411/7276/14976 10737/5547/14976 10736/5546/14976 +f 12411/7276/14977 12413/7278/14977 10738/5548/14977 10737/5547/14977 +f 12413/7278/14978 12414/7279/14978 10739/5549/14978 10738/5548/14978 +f 12414/7279/14979 12412/7277/14979 10736/5546/14979 10739/5549/14979 +f 12416/7281/14980 12415/7280/14980 10741/5551/14980 10740/5550/14980 +f 12415/7280/14981 12417/7282/14981 10742/5552/14981 10741/5551/14981 +f 12417/7282/14982 12418/7283/14982 10743/5553/14982 10742/5552/14982 +f 12418/7283/14983 12416/7281/14983 10740/5550/14983 10743/5553/14983 +f 12420/7285/14984 12419/7284/14984 10745/5555/14984 10744/5554/14984 +f 12419/7284/14985 12421/7286/14985 10746/5556/14985 10745/5555/14985 +f 12421/7286/14986 12420/7285/14986 10744/5554/14986 10746/5556/14986 +f 12423/7288/14987 12422/7287/14987 10748/5558/14987 10747/5557/14987 +f 12422/7287/14988 12424/7289/14988 10749/5559/14988 10748/5558/14988 +f 12424/7289/14989 12423/7288/14989 10747/5557/14989 10749/5559/14989 +f 12426/7291/14990 12425/7290/14990 10751/5561/14990 10750/5560/14990 +f 12425/7290/14991 12427/7292/14991 10752/5562/14991 10751/5561/14991 +f 12427/7292/14992 12426/7291/14992 10750/5560/14992 10752/5562/14992 +f 12429/7294/14993 12428/7293/14993 10754/5564/14993 10753/5563/14993 +f 12428/7293/14994 12430/7295/14994 10755/5565/14994 10754/5564/14994 +f 12430/7295/14995 12429/7294/14995 10753/5563/14995 10755/5565/14995 +f 12432/7297/14996 12431/7296/14996 10757/5567/14996 10756/5566/14996 +f 12431/7299/14997 12433/7298/14997 10758/7349/14997 10757/7350/14997 +f 12433/7298/14998 12432/7300/14998 10756/7351/14998 10758/7349/14998 +f 12435/7302/14999 12434/7301/14999 10760/5570/14999 10759/5569/14999 +f 12434/7301/15000 12436/7303/15000 10761/5571/15000 10760/5570/15000 +f 12436/7303/15001 12435/7302/15001 10759/5569/15001 10761/5571/15001 +f 12438/7305/15002 12437/7304/15002 10763/5573/15002 10762/5572/15002 +f 12437/7304/15003 12439/7306/15003 10764/5574/15003 10763/5573/15003 +f 12439/7306/15004 12438/7305/15004 10762/5572/15004 10764/5574/15004 +f 12441/7308/15005 12440/7307/15005 10766/5576/15005 10765/5575/15005 +f 12440/7307/15006 12442/7309/15006 10767/5577/15006 10766/5576/15006 +f 12442/7309/15007 12441/7308/15007 10765/5575/15007 10767/5577/15007 +f 12444/7311/15008 12443/7310/15008 10769/5579/15008 10768/5578/15008 +f 12443/7310/15009 12445/7312/15009 10770/5580/15009 10769/5579/15009 +f 12445/7312/15010 12444/7311/15010 10768/5578/15010 10770/5580/15010 +f 12447/7314/15011 12446/7313/15011 10772/5582/15011 10771/5581/15011 +f 12446/7313/15012 12448/7315/15012 10773/5583/15012 10772/5582/15012 +f 12448/7315/15013 12447/7314/15013 10771/5581/15013 10773/5583/15013 +f 12450/7317/15014 12449/7316/15014 10775/5585/15014 10774/5584/15014 +f 12449/7316/15015 12451/7318/15015 10776/5586/15015 10775/5585/15015 +f 12451/7318/15016 12450/7317/15016 10774/5584/15016 10776/5586/15016 +f 12453/7320/15017 12452/7319/15017 10778/5588/15017 10777/5587/15017 +f 12452/7319/15018 12454/7321/15018 10779/5589/15018 10778/5588/15018 +f 12454/7321/15019 12453/7320/15019 10777/5587/15019 10779/5589/15019 +f 12456/7323/15020 12455/7322/15020 10781/5591/15020 10780/5590/15020 +f 12455/7322/15021 12457/7324/15021 10782/5592/15021 10781/5591/15021 +f 12457/7324/15022 12456/7323/15022 10780/5590/15022 10782/5592/15022 +f 12459/7326/15023 12458/7325/15023 10784/5594/15023 10783/5593/15023 +f 12458/7325/15024 12460/7327/15024 10785/5595/15024 10784/5594/15024 +f 12460/7327/15025 12459/7326/15025 10783/5593/15025 10785/5595/15025 +f 12462/7329/15026 12461/7328/15026 10787/5597/15026 10786/5596/15026 +f 12461/7328/15027 12463/7330/15027 10788/5598/15027 10787/5597/15027 +f 12463/7330/15028 12462/7329/15028 10786/5596/15028 10788/5598/15028 +f 12465/7332/15029 12464/7331/15029 10790/5600/15029 10789/5599/15029 +f 12464/7331/15030 12466/7333/15030 10791/5601/15030 10790/5600/15030 +f 12466/7333/15031 12465/7332/15031 10789/5599/15031 10791/5601/15031 +f 12468/7335/15032 12467/7334/15032 10793/5603/15032 10792/5602/15032 +f 12467/7334/15033 12469/7336/15033 10794/5604/15033 10793/5603/15033 +f 12469/7336/15034 12468/7335/15034 10792/5602/15034 10794/5604/15034 +f 12471/7338/15035 12470/7337/15035 10796/5606/15035 10795/5605/15035 +f 12470/7337/15036 12472/7339/15036 10797/5607/15036 10796/5606/15036 +f 12472/7339/15037 12471/7338/15037 10795/5605/15037 10797/5607/15037 +# 2052 polygons - 36 triangles + diff --git a/package.json b/package.json index be683fc..e99188d 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "gl-matrix": "^2.3.2", "stats-js": "^1.0.0-alpha1", "three": "^0.82.1", + "three-obj-loader": "^1.0.2", "three-orbit-controls": "^82.1.0" }, "devDependencies": { diff --git a/src/framework.js b/src/framework.js index 76f901a..731067b 100644 --- a/src/framework.js +++ b/src/framework.js @@ -1,6 +1,7 @@ const THREE = require('three'); const OrbitControls = require('three-orbit-controls')(THREE) +const OBJLoader = require('three-obj-loader')(THREE) import Stats from 'stats-js' import DAT from 'dat-gui' @@ -26,10 +27,10 @@ function init(callback, update) { var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 ); - var renderer = new THREE.WebGLRenderer( { antialias: true } ); + var renderer = new THREE.WebGLRenderer( { antialias: true} ); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(window.innerWidth, window.innerHeight); - renderer.setClearColor(0x020202, 0); + renderer.setClearColor(0xfcd1fa, 1); var controls = new OrbitControls(camera, renderer.domElement); controls.enableDamping = true; diff --git a/src/lsystem.js b/src/lsystem.js index e643b6d..956aeb3 100644 --- a/src/lsystem.js +++ b/src/lsystem.js @@ -7,34 +7,113 @@ function Rule(prob, str) { // TODO: Implement a linked list class and its requisite functions // as described in the homework writeup +function LinkedList() { + this.head = null; + this.tail = null; + this.dictionary = null; + + this.link = function(a, b) { + a.next = b; + b.prev = a; + } + + this.expand = function(node, iteration) { + var rules = this.dictionary[node.symbol]; + + // Randomly chooses the rule to expand from + var rv = Math.random(); + var chosenRule; + var sum = 0.0; + if (typeof rules !== "undefined") { + for (var i = 0; i < rules.length; i++) { + if (rv <= sum + rules[i].probability) { + chosenRule = rules[i]; + break; + } + else { + sum += rules[i].probability; + } + } + + // Replaces node with the new list + replaceNode(this, node, chosenRule.successorString, iteration); + } + } +} +function Node(sym) { + this.next = null; + this.prev = null; + this.symbol = sym; + this.iteration = 1; +} + // TODO: Turn the string into linked list -export function stringToLinkedList(input_string) { +function stringToLinkedList(input_string) { // ex. assuming input_string = "F+X" // you should return a linked list where the head is // at Node('F') and the tail is at Node('X') var ll = new LinkedList(); + ll.head = new Node(input_string.charAt(0)); + var currNode = ll.head; + for (var i = 1; i < input_string.length; i++) { + var n = new Node(input_string.charAt(i)); + currNode.next = n; + n.prev = currNode; + currNode = currNode.next; + } + ll.tail = currNode; return ll; } // TODO: Return a string form of the LinkedList -export function linkedListToString(linkedList) { +function linkedListToString(linkedList) { // ex. Node1("F")->Node2("X") should be "FX" var result = ""; + var currNode = linkedList.head; + while (currNode != null) { + result += currNode.symbol; + currNode = currNode.next; + } return result; } // TODO: Given the node to be replaced, // insert a sub-linked-list that represents replacementString -function replaceNode(linkedList, node, replacementString) { +function replaceNode(linkedList, node, replacementString, iteration) { + // Creates a linkedlist from the rule + var expanded = stringToLinkedList(replacementString); + var currNode = expanded.head; + while (currNode != null) { + // Store iteration for each node after replacement + currNode.iteration = iteration; + currNode = currNode.next; + } + var next = node.next; + expanded.tail.next = next; + if (node.prev != null) { + node.prev.next = expanded.head; + } } -export default function Lsystem(axiom, grammar, iterations) { +function Lsystem(axiom, grammar, iterations) { // default LSystem - this.axiom = "FX"; + this.axiom = "123"; this.grammar = {}; - this.grammar['X'] = [ - new Rule(1.0, '[-FX][+FX]') + this.grammar['1'] = [ + new Rule(0.33333, 'FFA[-2]3[+3]'), + new Rule(0.33333, 'FFA[W2]3[Q3]'), + new Rule(0.33333, 'FFA[R2]3[E3]') + ]; + this.grammar['2'] = [ + new Rule(0.33333, 'FAF+F-F-F[FF3][+3]-F-F3'), + new Rule(0.33333, 'FAFQFWFWF[FF3][Q3]WFWF3'), + new Rule(0.33333, 'FAFEFRFRF[FFF3][E3]RFRF3'), + ]; + this.grammar['3'] = [ + new Rule(0.33333, 'FF-F+F+F[2][-2]+F+FA2'), + new Rule(0.33333, 'FFWFQFQF[2][W2]QFQFA2'), + new Rule(0.33333, 'FFRFEFEF[2][R2]EFEFA2') ]; this.iterations = 0; @@ -70,7 +149,28 @@ export default function Lsystem(axiom, grammar, iterations) { // The implementation we have provided you just returns a linked // list of the axiom. this.doIterations = function(n) { - var lSystemLL = StringToLinkedList(this.axiom); + this.iterations = n; + var lSystemLL = stringToLinkedList(this.axiom); + lSystemLL.dictionary = this.grammar; + var currNode = lSystemLL.head; + + for (var i = 1; i <= this.iterations; i++) { + var currNode = lSystemLL.head; + while (currNode != null) { + var next = currNode.next; + lSystemLL.expand(currNode, i); + currNode = next; + } + + } + console.log(lSystemLL); return lSystemLL; } +} + +export default { + LinkedList: LinkedList, + Lsystem : Lsystem, + stringToLinkedList : stringToLinkedList, + linkedListToString : linkedListToString } \ No newline at end of file diff --git a/src/main.js b/src/main.js index f0c6600..e0b4fd9 100644 --- a/src/main.js +++ b/src/main.js @@ -1,13 +1,14 @@ const THREE = require('three'); // older modules are imported like this. You shouldn't have to worry about this much import Framework from './framework' -import Lsystem, {LinkedListToString} from './lsystem.js' +import lsys from './lsystem.js' import Turtle from './turtle.js' var turtle; // called after the scene loads function onLoad(framework) { + var scene = framework.scene; var camera = framework.camera; var renderer = framework.renderer; @@ -19,28 +20,46 @@ function onLoad(framework) { directionalLight.color.setHSL(0.1, 1, 0.95); directionalLight.position.set(1, 3, 2); directionalLight.position.multiplyScalar(10); + scene.add(directionalLight); + //var loader = new THREE.CubeTextureLoader(); + //var urlPrefix = ''; + // + //var skymap = new THREE.CubeTextureLoader().load([ + // urlPrefix + 'px.jpg', urlPrefix + 'nx.jpg', + // urlPrefix + 'py.jpg', urlPrefix + 'ny.jpg', + // urlPrefix + 'pz.jpg', urlPrefix + 'nz.jpg' + //] ); + // + //scene.background = skymap; + // set camera position - camera.position.set(1, 1, 2); + camera.position.set(1, 1, 20); camera.lookAt(new THREE.Vector3(0,0,0)); + camera.updateProjectionMatrix(); // initialize LSystem and a Turtle to draw - var lsys = new Lsystem(); + var lsystem = new lsys.Lsystem(); turtle = new Turtle(scene); gui.add(camera, 'fov', 0, 180).onChange(function(newVal) { camera.updateProjectionMatrix(); }); - gui.add(lsys, 'axiom').onChange(function(newVal) { - lsys.UpdateAxiom(newVal); - doLsystem(lsys, lsys.iterations, turtle); + gui.add(lsystem, 'axiom').onChange(function(newVal) { + lsystem.updateAxiom(newVal); + doLsystem(lsystem, lsystem.iterations, turtle); + }); + + gui.add(lsystem, 'iterations', 0, 12).step(1).onChange(function(newVal) { + clearScene(turtle); + doLsystem(lsystem, newVal, turtle); }); - gui.add(lsys, 'iterations', 0, 12).step(1).onChange(function(newVal) { + gui.add(turtle, 'angle', 15, 120).step(1).onChange(function(newVal) { clearScene(turtle); - doLsystem(lsys, newVal, turtle); + doLsystem(lsystem, lsystem.iterations, turtle); }); } @@ -54,9 +73,12 @@ function clearScene(turtle) { } function doLsystem(lsystem, iterations, turtle) { - var result = lsystem.DoIterations(iterations); + var result = lsystem.doIterations(iterations); turtle.clear(); + var angle = turtle.angle; turtle = new Turtle(turtle.scene); + console.log(turtle); + turtle.angle = angle; turtle.renderSymbols(result); } diff --git a/src/turtle.js b/src/turtle.js index 1db2723..9a269f2 100644 --- a/src/turtle.js +++ b/src/turtle.js @@ -1,5 +1,13 @@ const THREE = require('three') +var objLoader = new THREE.OBJLoader(); +var flowGeometry; +objLoader.load('lotus_OBJ_low.obj', function(obj) { + + // LOOK: This function runs after the obj has finished loading + flowGeometry = obj.children[0].geometry; +}); + // A class used to encapsulate the state of a turtle at a given moment. // The Turtle class contains one TurtleState member variable. // You are free to add features to this state class, @@ -7,33 +15,68 @@ const THREE = require('three') var TurtleState = function(pos, dir) { return { pos: new THREE.Vector3(pos.x, pos.y, pos.z), - dir: new THREE.Vector3(dir.x, dir.y, dir.z) + dir: new THREE.Vector3(dir.x, dir.y, dir.z), } } export default class Turtle { - constructor(scene, grammar) { - this.state = new TurtleState(new THREE.Vector3(0,0,0), new THREE.Vector3(0,1,0)); + this.state = new TurtleState(new THREE.Vector3(0,-5,-10), new THREE.Vector3(0,1,0)); this.scene = scene; - + this.stack = []; + this.angle = 15; + this.iteration = 1; // TODO: Start by adding rules for '[' and ']' then more! // Make sure to implement the functions for the new rules inside Turtle if (typeof grammar === "undefined") { this.renderGrammar = { - '+' : this.rotateTurtle.bind(this, 30, 0, 0), - '-' : this.rotateTurtle.bind(this, -30, 0, 0), - 'F' : this.makeCylinder.bind(this, 2, 0.1) + '+' : this.rotateTurtle.bind(this, 0, 0, 0, -1, 0, 0), + '-' : this.rotateTurtle.bind(this, 0, 0, 0, 1, 0, 0), + 'F' : this.makeCylinder.bind(this, 2, 0.1), + '[' : this.saveState.bind(this), + ']' : this.restoreState.bind(this), + 'Q' : this.rotateTurtle.bind(this, 0, 0, 0, 0, -1, 0), + 'W' : this.rotateTurtle.bind(this, 0, 0, 0, 0, 1, 0), + 'E' : this.rotateTurtle.bind(this, 0, 0, 0, 0, 0, -1), + 'R' : this.rotateTurtle.bind(this, 0, 0, 0, 0, 0, 1), + 'A' : this.drawFlower.bind(this, 2, 0.1) }; } else { this.renderGrammar = grammar; } } + drawFlower(len, width) { + //var tmp_turtle = this; + if (this.iteration > 0) { + //this.scene.add(mesh); +// + //var quat = new THREE.Quaternion(); + //quat.setFromUnitVectors(new THREE.Vector3(0,1,0), this.state.dir); + //var mat4 = new THREE.Matrix4(); + //mat4.makeRotationFromQuaternion(quat); + //mesh.applyMatrix(mat4); +// + //var mat5 = new THREE.Matrix4(); + //var trans = this.state.pos.add(this.state.dir.multiplyScalar(0.5 * len)); + //mat5.makeTranslation(trans.x, trans.y, trans.z); + //mesh.applyMatrix(mat5); + //this.moveForward(len/2); + } + } + saveState() { + var newPos = this.state.pos; + var newDir = this.state.dir; + var newState = new TurtleState(newPos, newDir); + this.stack.push(newState); + } + restoreState() { + this.state = this.stack.pop(); + } // Resets the turtle's position to the origin // and its orientation to the Y axis clear() { - this.state = new TurtleState(new THREE.Vector3(0,0,0), new THREE.Vector3(0,1,0)); + this.state = new TurtleState(new THREE.Vector3(0,0,0), new THREE.Vector3(0,1,0)); } // A function to help you debug your turtle functions @@ -45,11 +88,11 @@ export default class Turtle { // Rotate the turtle's _dir_ vector by each of the // Euler angles indicated by the input. - rotateTurtle(x, y, z) { + rotateTurtle(x, y, z, signx, signy, signz ) { var e = new THREE.Euler( - x * 3.14/180, - y * 3.14/180, - z * 3.14/180); + signx*this.angle * 3.14/180, + signy*this.angle * 3.14/180, + signz*this.angle * 3.14/180); this.state.dir.applyEuler(e); } @@ -69,25 +112,30 @@ export default class Turtle { // Make a cylinder of given length and width starting at turtle pos // Moves turtle pos ahead to end of the new cylinder makeCylinder(len, width) { - var geometry = new THREE.CylinderGeometry(width, width, len); - var material = new THREE.MeshBasicMaterial( {color: 0x00cccc} ); + var geometry = new THREE.CylinderGeometry(1.5/this.iteration, 1.5/this.iteration, len); + var material = new THREE.MeshLambertMaterial( {color: 0xba8964, side: THREE.DoubleSide} ); var cylinder = new THREE.Mesh( geometry, material ); + var materialBlue = new THREE.MeshLambertMaterial({ color: 0x00ccff, side: THREE.DoubleSide }); + var mesh = new THREE.Mesh(flowGeometry, materialBlue); this.scene.add( cylinder ); - + if (Math.random() < 0.25 && this.iteration > 1) { + this.scene.add(mesh); + } + //Orient the cylinder to the turtle's current direction var quat = new THREE.Quaternion(); quat.setFromUnitVectors(new THREE.Vector3(0,1,0), this.state.dir); var mat4 = new THREE.Matrix4(); mat4.makeRotationFromQuaternion(quat); cylinder.applyMatrix(mat4); - + mesh.applyMatrix(mat4); //Move the cylinder so its base rests at the turtle's current position var mat5 = new THREE.Matrix4(); var trans = this.state.pos.add(this.state.dir.multiplyScalar(0.5 * len)); mat5.makeTranslation(trans.x, trans.y, trans.z); cylinder.applyMatrix(mat5); - + mesh.applyMatrix(mat5); //Scoot the turtle forward by len units this.moveForward(len/2); }; @@ -96,7 +144,8 @@ export default class Turtle { // Look in the Turtle's constructor for examples of how to bind // functions to grammar symbols. renderSymbol(symbolNode) { - var func = this.renderGrammar[symbolNode.character]; + var func = this.renderGrammar[symbolNode.symbol]; + this.iteration = symbolNode.iteration; if (func) { func(); }